Emqx消息丢失问题分析

问题描述

mqtt的设备端反馈,偶尔会收不到响应消息。

问题初步排查

首先查看服务器的日志,看看服务器是否收到了设备的请求消息,通过排查发现服务器并未收到请求消息,因此导致不会给设备返回响应消息了。

问题深度排查

为什么服务器收不到请求的mqtt消息?

首先去emqx的后端,针对指定的客户端开启日志追踪功能,这样可以看看设备消息是否发送给了emqx。
通过观察发现日志确实已经发送给了emqx,因此发送环节没有问题。既然发送环节没有问题,可能的问题出现在emqx的投送环节,我们在emqx的后台页面可以看到主题的所有消费者客户端,这里面发现一个问题,该主题存在多个消费者,为什么会出现这么多消费者呢?

为什么这个topic会出现多个消费者?

通过客户端ID(排查问题的关键,大家一定要给每个客户端定义一个容易识别的名字),发现这些都是服务器的客户端。我只启动了一个业务服务,为什么会出现这么多客户端。且只有当前这个服务器侧的mqtt客户端是在线状态,其他都是离线状态。

为什么服务器测的mqtt会出现多个客户端?

通过仔细排查发现,我们的客户端ID是用固定前缀 + 服务器IP地址来生成的,而我们用的是K8S来部署服务的,每次部署Docker容器都会生成一个随机的内网IP地址,因此每次重启服务,会出现一个重新的客户端ID。例如:目前部署的user服务IP是1,客户端ID=user-1,重新部署user服务后IP是2,客户端ID=user-2,因此user-1和user-2都能订阅原来的主题。但是user-1服务已经停止了,为什么还能订阅原来的主题消息呢?

已停止的服务为什么还能订阅原来的主题消息呢?

服务端的mqtt客户端配置了共享订阅,也就是说多个user服务,只会有一个user服务可以收

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

shadon178

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值