MQTT 大消息失败原因排查

在使用MQTT协议的聊天服务器测试大消息时遇到连接失效问题。通过日志、网络抓包分析,发现服务端在接收到大消息后未返回响应,原因是Netty的decoder有最大payload限制。解决方案包括客户端限制和拆分消息,服务端可调整最大载荷长度,但可能增加处理时间和内存负担。
摘要由CSDN通过智能技术生成

Background

小组内使用 MQTT 协议搭建了一个聊天服务器,前天在测大消息(超过5000汉字)时,连接直接变得不可用,后续发送的消息全部都收不到回复。

服务器环境:
Netty :4.1.32.Final
使用的是 Netty 包中自带的 MqttDecoder

客户端: Android

排查过程

  1. 由于所有的消息都打印了日志,因此先搜了一下服务器日志,发现日志中并没有发送的消息内容。
  2. 难道是客户端在超长消息时没有发送?使用 tcpdump 抓了包,发现客户端正常发送,并且所有的包服务端都已经 ack,但是后续服务端没有发回响应,猜测是服务端在大消息的情况下处理失败了。
    1. tcpdump 使用 -nn 打印出ip和端口,-X 打印网络包的内容,也可以使用-w 选项保存到文件里,然后使用 tcpdumpwireshark 来分析
  3. 于是查了一下 MQTT 支持的最大 payload,MQTT 官方文档 中说明是 256M,这个大小肯定不会超过。
  4. 在服务端抓了下包,确认消息已经收到,但是无确认消息返回
  5. 开启线上debug,发现收到了一个 PUBLISH 类型的消息,但是消息的 class 不为 MqttPublishMessage, 且 payload 中无数据,但在 Message 中有一个报错消息 too large message: 56234 bytes
  6. Google 一下,有网友遇到了同样的问题, 虽然
  • 5
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Paho.mqtt.cpp 是一个用于 MQTT(Message Queuing Telemetry Transport,消息队列遥测传输)通信的 C++ 库。当 MQTT 连接失败时,可能涉及多个因素,包括但不限于: 1. **服务器连接问题**:如果MQTT服务器不可达或网络中断,连接会失败。检查服务器地址是否正确,以及网络连接是否稳定。 2. **端口错误**:确保客户端使用的 MQTT 默认端口(1883)或者安全端口(8883)是开放的,并且服务器支持这些端口。 3. **认证问题**:如果需要用户名和密码,验证提供的凭据是否正确,并且服务器配置中是否支持所需的认证方法(如 PLAIN、SCRAM-SHA-1 等)。 4. **防火墙和安全组设置**:检查是否有防火墙规则阻止了客户端与服务器之间的通信,或者服务器的安全组配置是否允许来自客户端的连接请求。 5. **库配置错误**:确保paho.mqtt.cpp的配置正确,包括超时设置、重试策略等。 6. **SSL/TLS问题**:如果使用了 SSL 或 TLS 加密,证书、私钥或信任存储可能不正确,导致连接失败。 7. **代码逻辑**:检查连接初始化的代码是否有误,比如连接选项是否正确设置,错误处理是否完善。 当你遇到连接失败时,你可以按照以下步骤进行排查: 1. 查看错误日志:paho.mqtt.cpp 通常会在连接失败时输出错误信息,它们可能是有用的线索。 2. 使用调试工具:逐步执行代码,查看在何时何地抛出的异常。 3. 断点调试:设置断点,观察连接过程中的变量变化,找出问题所在。 相关问题: 1. paho.mqtt.cpp 提供了哪些错误码帮助诊断连接问题? 2. 如何在代码中捕获并处理MQTT连接失败的异常? 3. 如何通过日志跟踪paho.mqtt.cpp的连接尝试和错误?

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值