我们正在为我们的 websockets 解决方案使用 vert.x sockJS 实现。当 vert.x 快速发送几条消息时,有些消息会很晚到达客户端。延迟的消息仅在发送心跳后才到达。知道这怎么可能吗?
我们通过将 sockjssocket.write() 方法放入同步块(synchronized block)中来临时解决了这个问题,但这感觉有点像黑客。我们之所以将其放在同步块(synchronized block)中是因为我们认为它与并行写入套接字缓冲区有关。
亲切的问候,
大安
最佳答案
WebSockets 是在 TCP 之上实现的协议(protocol)层。
TCP 有一些机制可以优化网络性能,并允许可靠且有序地传送流 block 。这些“优化”之一是 Nagle's algorithm ,它在满足要发送的数据包大小之前,在网络层对小块进行排队,并且仅在足够大时才发送。
在 vert.x 中未禁用该算法可能会发生什么情况。看起来像this指向您可以用来禁用它的实际设置。
如果这没有帮助,您需要确保 SockJS 库不会出于“优化”目的“重新创建”相同的机制。
该算法的目的是组合较小的 block 并作为一个数据包发送,从而减少为每个 block 携带 TCP header 的底层网络开销。如果您发送大量小块,请确保对其进行优化(自行合并),因为最好发送较大的 block 。
关于websocket - vert.x sockJS 实现延迟消息发送,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21049643/