BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / java / #60577同步于 2018/12/10
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Java机器人发帖

【问题】如何用多个tcp包返回一个http协议请求的响应?

gxlihao
2018/12/10镜像同步9 回复
小弟使用Spring框架写了一个Rest服务器,响应用户的请求,返回的数据量有一些大,所以用户在获得响应的时候耗时较长,需要接近五分钟。但是通过后台日志了解到,一个请求的处理时间只需要不到五十秒,所以小弟我判断大部分时间消耗在了结果的传输之上,尤其是tcp包的重传。小弟的问题是,Spring框架编写的Rest服务将响应是只用一个Tcp包进行返回么,还是说可以通过什么设置使用多个Tcp包返回一个Http请求的响应,因为小弟我认为如果用多个Tcp包返回的话会减少Tcp重传的消耗?
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
Julkot机器人#1 · 2018/12/10
用几个tcp包 返回是tcp协议栈决定的,跟spring没关系,spring搞不到这里。你可以找找服务器tcp的设置参数
Julkot机器人#2 · 2018/12/10
你非要在应用层搞这个,你可以试试 http有个分块传输的方式。
Nroskill机器人#3 · 2018/12/10
TCP有自己的分段算法 来避免网络层的分片 接收端收到后会重组并提交给应用层(PSH或缓冲区满) 另外重传是另一个概念 出现重传的大多数情况都是网络条件差导致丢包造成的 回到你的问题本身 你应该首先确认是否确实是重传过多导致的问题 然后确认你的每次返回的数据量 如果确实很大 那么就不是TCP的锅 常见做法是修改你的后端接口和前端代码 要么分页显示 要么收到一部分渲染一部分 分多次接收 而不是数据到齐了再开始渲染 当然这里就不应该是你框架该管的了
Nroskill机器人#4 · 2018/12/10
强调一下 TCP是个基于流的协议 没有包的概念 TCP不保证提交给应用层的是完整的、不包含多余数据的数据
gxlihao机器人#5 · 2018/12/10
后台的数据是动态的,有一定的时效性,且部分数据有可能失效,因此很难将接口实现为分页的形式。返回的结果数据有超过5M。 【 在 Nroskill 的大作中提到: 】 : TCP有自己的分段算法 来避免网络层的分片 接收端收到后会重组并提交给应用层(PSH或缓冲区满) : 另外重传是另一个概念 出现重传的大多数情况都是网络条件差导致丢包造成的 : 回到你的问题本身 你应该首先确认是否确实是重传过多导致的问题 然后确认你的每次返回的数据量 如果确实很大 那么就不是TCP的锅 常见做法是修改你的后端接口和前端代码 要么分页显示 要么收到一部分渲染一部分 分多次接收 而不是数据到齐了再开始渲染 当然这里就不应该是你框架该管的了
SinceBelieve机器人#6 · 2018/12/10
感觉是接口设计的问题 接口处理数据时间五十秒已经算不可用了,可以设计为“提交事务”加“查询状态”的形式 客户端请求时间太长就在服务端缓存列表,让客户端分段读取和展示
Nroskill机器人#7 · 2018/12/10
所有后台的数据都是有时效性的,不然为什么不做成静态写死在客户端呢? 不过如果真的只有几M这么大的数据量,需要传4分钟,那说明底层协议上确实有问题,建议抓包看一下到底怎么回事,或者干脆把客户端架在服务端服务器上测试一下,排除网络干扰的因素 另外你真的需要一次性渲染那么大量的数据给用户看吗?或者说每次请求都要重新获取这么大量的数据?我见过的大多数应用场景都没有单次请求会有这么大的数据量,除了数据库大查询 最后,越是对时效性要求高的应用,接口设计往往更细,通过前台不停请求地方式来保证正确性,否则随便来几个用户的请求就把服务器搞炸了,别说CPU,网卡IO都扛不住 【 在 gxlihao 的大作中提到: 】 : 后台的数据是动态的,有一定的时效性,且部分数据有可能失效,因此很难将接口实现为分页的形式。返回的结果数据有超过5M。 :
Wizmann机器人#8 · 2018/12/10
TCP的一个设计失误(历史原因吧)是把消息传不到认为是网络拥挤。 这种设计可以简化协议的实现,通信的双方在共享最少的信息的同时,能最大限度的利用网络通信的能力。 于是在遇到网络错误的时候就会减小带宽,以期能减少错误的发生。 对于一些不可靠的网络或者延时很高的网络,其实带宽是足够的,但是由于常态性的丢包(超时),导致协议层面一直在减少带宽使用。其结果就是传输速度降低。(例如经典的“长肥管道”) 所以,以上我说了这么多,但是我觉得,这些分析并没有什么卵用。 大概率还是你自己代码写挫了(
MrAss机器人#9 · 2018/12/10
一个请求50秒,个人觉得已经不适合用一次http去做了,可以考虑推拉模式,或者是http查询模式,否则一个50的链接占在那里,并发上来直接搞死你