emqx 系统主题客户端上下线事件,概率性不准确

错误报告

企业微信截图_20230129172919
同一个设备的上线日志
截图数据结构为 设备号: 上下线标记:时间戳
上线1 ,下线0

环境

  • EMQX 版本:4.3.8
  • 操作系统版本:ubuntu20.04

重现此问题的步骤

没有方法可以100% 重现,但是从日志观测发现问题确实概率性出现。

预期行为

每个设备上下线事件应该准确

实际行为

实际设备上下线事件概率性不准确。期望上线和下线事件应该成对出现,实际会出现连续几个上线事件

功能请求

描述你需要的功能

为什么你需要这个功能


其他

产生上下线事件不准确的原因是什么?如何避免?

现在的实现很难保证这个两个事件准确地到达。特别是下线事件,如果进程出现了问题,挂掉了,下线事件就发不出去了。你的问题很可能就是这个情况,你检查一下有没有错误日志。

我们可能需要改进一下设计,让事件尽可能发出去。

但是上线和下线事件如果从不同的节点发出去的话,又可能出现顺序问题,时间戳也可能因为两个节点系统时间的不一致出现先后颠倒。顺序的问题可能没有办法完全保证。

因为我们已经投入到生产环境了,无法使用debug,因为带来性能影响很大(之前开过debug后来取消)。另外一个问题是,订阅系统主题我只订阅当前的broker,按理只有当前broker上的设备上下线事件不会出现顺序问题。

你提到进程出现问题,我们这边服务器配置还是不错的,高峰期间cpu负载差不多40% 内存30%。8c 32G。

emqx后续版本对此问题有改善吗?

对此有什么其它方案?

我看你的情况好像是下线事件丢了。

我觉着两种可能性比较大:

  1. 是因为客户端没有主动下线,而是被另外一个相同 clientid 的客户端挤下去了。这时候是个 session 替换,不算下线,所以没发这个事件。

  2. 是因为出了问题,crash 了。日志里会有 error 日志。

对于第一种情况,你可以使用 v4.3.22 之后的版本,并且配上下面两个配置:

broker.client_disconnect_discarded = on
broker.client_disconnect_takovered = on

这样 session 替换的时候也会发送 disconnected 取出。

我们刚才复盘日志还发现不仅丢离线事件,还有上线事件也会丢。日志表现为连续两个离线事件,但是分别是两个emqx主机上。


这种情况是否也可以升级到4.3.22 来优化?或者是有其它配置项?

@Shawn 你好,对于楼主的这种情况,如果客户端配合使用遗嘱消息,离线事件是不是就不会丢?

我们的确修过很多相关问题。先升级到 4.3.x 最新吧,有条件的话直接升级到 4.4.14,因为 4.3 已经出了维护周期。

如果你升上来还有问题我们再调查。

升到5.0.x版本可以吗

不要。5.0 并没有 4.4 成熟。建议升级到4.4的最新版(现在是 4.4.15)