我们正在为我们的 websockets 解决方案使用 vert.x sockJS 实现。当 vert.x 一个接一个地快速发送一些消息时,一些消息将很晚才到达客户端。延迟消息仅在发送心跳时到达。知道这怎么可能吗?
我们通过将 sockjssocket.write() 方法放在同步块中临时解决了这个问题,但这感觉有点像 hack。我们将它放在同步块中的原因是因为我们认为它与并行写入套接字缓冲区有关。
亲切的问候,
大安
WebSockets 是在 TCP 之上实现的协议层。
TCP 有一些机制来优化网络性能,并允许可靠和有序地传递流块。这些“优化”之一是Nagle 的算法,它在网络层中对小块进行排队,然后再满足要发送的数据包大小,并且仅在数据足够大时发送。
在 vert.x 中未禁用此算法可能会发生什么。看起来这指向您可以用来禁用它的实际设置。
如果这没有帮助,您需要确保 SockJS 库不会为“优化”目的“重新创建”相同的机制。
该算法的目的是组合较小的块并作为一个数据包发送,以减少为每个块携带 TCP 标头的底层网络开销。如果您发送很多小块,请确保优化它(合并自己),因为最好发送更大的块。