AWS Websocket 需发送新消息才能接收历史消息问题咨询
WebSocket消息需接收端发消息才能收到问题修复方案
多数场景下消息传输正常,但部分特定消息需要接收端客户端主动发送消息后才能被成功接收。该问题针对特定方法/消息每次都会复现,其余类型消息则完全不会触发。
典型复现示例:
user1发送一条消息后,user2需先主动发送一条消息,才能收到user1发送的内容。
常见根因与修复方案
- 服务端输出缓冲区未主动刷新
部分WebSocket服务端实现默认不会在单条消息拼装完成后主动刷出套接字缓冲区,消息会暂存到缓冲区累积到一定大小才批量发送。触发问题的消息大小刚好未达到缓冲区阈值,就会一直暂存,直到接收端发送消息触发TCP报文交互,顺带把暂存的消息一起发送到接收端。
修复方式:在服务端完成目标类型消息的写入操作后,显式调用输出流的flush()方法强制刷出缓冲区内容。 - TCP Nagle算法导致小包延迟
Nagle算法默认会合并小TCP包减少网络传输次数,若触发问题的消息属于小包且未达到推送阈值,就会出现延迟发送的情况。
修复方式:在服务端WebSocket对应的TCP套接字配置中开启TCP_NODELAY参数,关闭Nagle算法。 - WebSocket框架版本缺陷
部分旧版本WebSocket框架(如Jetty 9.4.x之前的部分版本)存在消息队列调度逻辑缺陷,仅在触发发送动作时才会拉取待接收的消息队列,导致接收端消息堆积。
修复方式:将对应WebSocket框架升级到已修复该问题的稳定版本;若暂时无法升级,可在服务端新增间隔1-2秒的心跳帧推送机制,定时主动发送极小的心跳包触发缓冲区刷出,临时规避消息延迟问题。
内容的提问来源于stack exchange,提问作者Spankied
相关产品推荐
相关产品推荐

