Background
小组内使用 MQTT 协议搭建了一个聊天服务器,前天在测大消息(超过5000汉字)时,连接直接变得不可用,后续发送的消息全部都收不到回复。
服务器环境:
Netty :4.1.32.Final
使用的是 Netty 包中自带的 MqttDecoder
客户端: Android
排查过程
- 由于所有的消息都打印了日志,因此先搜了一下服务器日志,发现日志中并没有发送的消息内容。
- 难道是客户端在超长消息时没有发送?使用
tcpdump
抓了包,发现客户端正常发送,并且所有的包服务端都已经 ack,但是后续服务端没有发回响应,猜测是服务端在大消息的情况下处理失败了。tcpdump
使用-nn
打印出ip和端口,-X
打印网络包的内容,也可以使用-w
选项保存到文件里,然后使用tcpdump
或wireshark
来分析
- 于是查了一下 MQTT 支持的最大 payload,MQTT 官方文档 中说明是 256M,这个大小肯定不会超过。
- 在服务端抓了下包,确认消息已经收到,但是无确认消息返回
- 开启线上debug,发现收到了一个
PUBLISH
类型的消息,但是消息的 class 不为MqttPublishMessage
, 且 payload 中无数据,但在 Message 中有一个报错消息too large message: 56234 bytes
- Google 一下,有网友遇到了同样的问题, 虽然