生产环境MQTT消息响应缓慢的故障排查

简介: 当两个以上Mqtt客户端同时在线时,就相当于两个clientId相同的消费端同时开启,这样原本发送给某一个消费端的消息就可能会被另一个接收,目标消费端不会有反应,而服务器在发现目标消费端没有反应后,会启动重发机制,最终目标消费端接收到消息后,会给人造成一种通信延迟的假象。

  生产环境的充电桩项目一直运行平稳,用户在H5页面上操作,扫描充电桩,而后可以支付,进入对应的界面可以控制该充电桩的放电、停电。

  具体的控制流程为,用户在页面通过HTTPS协议与服务器进行交互,服务器接收到请求后,组装参数,发送消息到mqtt服务器(RabbitMQ),而后充电桩的Mqtt客户端即可收到该条消息。充电桩对页面的消息反馈刚好是一个相反的过程。

  该项目上线后,消息的发送到硬件响应平均时间基本在2s左右(视当地的4G网络信号)。但一天下午,小区的客户反馈,整个过程变得特别慢,下单后放电成功,但页面迟迟不会跳转到放电展示的界面,而且点击页面停电按钮,也不会生效。

  首先,查看服务器上的H5模块的日志,发现但凡是传入该模块Mqtt消息的,服务器上都已经成功处理,没有延迟的情况。所以怀疑是当地充电桩硬件的信号问题(此前不久曾发生某小区大规模4G无信号、弱信号的情况)。为了保险,在办公室里调试并安装了一套硬件设备,模拟线上的情况,发现下发,响应很及时,没有出现延迟的情况。所以当即让现场人员检查,但现场人员经过十几分钟测试,反应4G信号没有问题。

  没办法,只能再次多次的在办公室进行问题复现,现场也有人员进行配合测试。结果确实发现有消息漏传到服务器的情况。即,上传成功的消息,服务器都处理成功,没有上传成功的,服务器没有处理,页面只能处于等待状态并进入后续的等待处理流程。此时,为了验证充电桩是否真的漏传消息,还是因为什么别的原因服务器没有处理该条消息,开启了一个Mqtt客户端,并设置好环境,连上生产环境的服务器后,调到对应的topic并开启消费端,结果发现,充电桩的所有消息上传是正常的,但服务器这边确实没有接收到。此时,想到会不会是有多个程序,设置了相同的clientid,同时在消费生产环境的消息。经过各个服务器(允许连入生产环境IP)的排查,发现确实有一个消费端,与生产环境的MQTT消息消费模块分享了所有消息。将该消费端的进程kill掉,生产环境立即恢复正常。

  其实,这个问题之前已多次发生,但每次都会以不尽相同的场景出现,而且由于相同终端ID消费消息策略的不同,还可能出现有些时候测试响应及时,有些响应却很慢的情况,对排查问题造成了干扰。比如起初调试硬件mqtt消息时,由于硬件工程师对该协议细节不甚清楚,结果将所有的硬件烧录了完全相同的代码,即clientid也相同。这样,当两个以上硬件同时在线时,就相当于两个clientId相同的消费端同时开启,这样原本发送给某一个消费端的消息就可能会被另一个接收,目标消费端不会有反应,而服务器在发现目标消费端没有反应后,会启动重发机制,最终目标消费端接收到消息后,会给人造成一种通信延迟的假象。一开始只有一个硬件调试时,一切正常,但当硬件开启了几个之后,就表现出网络不畅的现象,一度怀疑是办公区域的网络问题。其实是几个终端共同消费了同一通道的所有消息,导致漏收。虽然有重发机制保障整个流程能够完整执行,但是整个过程会显得特别卡顿,整个执行周期相当漫长。之前在使用kafka的过程中,同样也遇到过类似的问题。

  不过在大数据量处理过程中,该特性却是一个可以用来分散流量的解决方案。比如海量终端生产数据上传到消息队列中,开一个消费端,可能根本无法承受这么大的数据流量,无法及时的处理,所以此时必须在不同服务器,开启多个终端,使用相同的终端ID,才能分享并及时处理该批消息。

  记录一下,涉及消息队列的问题排查中,这个问题点值得关注。

相关实践学习
消息队列RocketMQ版:基础消息收发功能体验
本实验场景介绍消息队列RocketMQ版的基础消息收发功能,涵盖实例创建、Topic、Group资源创建以及消息收发体验等基础功能模块。
消息队列 MNS 入门课程
1、消息队列MNS简介 本节课介绍消息队列的MNS的基础概念 2、消息队列MNS特性 本节课介绍消息队列的MNS的主要特性 3、MNS的最佳实践及场景应用 本节课介绍消息队列的MNS的最佳实践及场景应用案例 4、手把手系列:消息队列MNS实操讲 本节课介绍消息队列的MNS的实际操作演示 5、动手实验:基于MNS,0基础轻松构建 Web Client 本节课带您一起基于MNS,0基础轻松构建 Web Client
相关文章
|
消息中间件 存储 缓存
RocketMQ 监控告警:生产环境如何快速通过监控预警发现堆积、收发失败等问题?
本文主要向大家介绍如何利用 RocketMQ 可观测体系中的指标监控,对生产环境中典型场景:消息堆积、消息收发失败等场景配置合理的监控预警,快速发现问题,定位问题。
1429 0
RocketMQ 监控告警:生产环境如何快速通过监控预警发现堆积、收发失败等问题?
EMQ
|
监控 安全 数据可视化
EMQX Enterprise 5.1 正式发布:生产环境就绪的 MQTT over QUIC、基于 MQTT 的文件传输支持
EMQX Enterprise 5.1 单集群可达 1 亿客户端连接;创新性地引入 MQTT over QUIC 协议;同时提供了 MQTT 大文件传输能力以及可视化数据集成能力。
EMQ
257 0
EMQX Enterprise 5.1 正式发布:生产环境就绪的 MQTT over QUIC、基于 MQTT 的文件传输支持
|
消息中间件 存储 Cloud Native
【活动】30秒上云体验,一键体验RocketMQ 六大生产环境
免费试用+30秒一键体验,低门槛、快速、高效、易操作,带你了解“历经万亿级数据洪峰考验”的云消息队列RocketMQ
554 6
|
消息中间件 存储 Cloud Native
【活动】30 秒上云体验,一键体验 RocketMQ 六大生产环境
【活动】30 秒上云体验,一键体验 RocketMQ 六大生产环境
|
消息中间件 存储 算法
生产环境出现网络分区,RocketMQ集群表示毫无压力!!!
生产环境出现网络分区,RocketMQ集群表示毫无压力!!!
生产环境出现网络分区,RocketMQ集群表示毫无压力!!!
|
消息中间件 运维 监控
RocketMQ生产环境主题扩分片后遇到的坑
RocketMQ生产环境主题扩分片后遇到的坑
RocketMQ生产环境主题扩分片后遇到的坑
|
消息中间件 存储 缓存
RocketMQ实战:生产环境中,autoCreateTopicEnable为什么不能设置为true
RocketMQ实战:生产环境中,autoCreateTopicEnable为什么不能设置为true
RocketMQ实战:生产环境中,autoCreateTopicEnable为什么不能设置为true
|
消息中间件 缓存 Java
记生产环境 rabbitmq 部分客户端 channel 持续积压消息不进行ack
记生产环境 rabbitmq 部分客户端 channel 持续积压消息不进行ack
494 0
|
消息中间件 缓存 JavaScript
生产环境中,RabbitMQ 持续积压消息不进行ack ,发生什么了?
生产环境中,RabbitMQ 持续积压消息不进行ack ,发生什么了?
|
消息中间件 存储 RocketMQ
RocketMQ实战:生产环境中,autoCreateTopicEnable为什么不能设置为true
1、现象 很多网友会问,为什么明明集群中有多台Broker服务器,autoCreateTopicEnable设置为true,表示开启Topic自动创建,但新创建的Topic的路由信息只包含在其中一台Broker服务器上,这是为什么呢? 期望值:为了消息发送的高可用,希望新创建的Topic在集群中的每台Broker上创建对应的队列,避免Broker的单节点故障。
2758 1