emqx通讯上行通讯OK,但是下行通讯总是失败

  • EMQX 版本:4.3.3
  • 操作系统版本:Ubuntu 16.04.2 LTS

我的终端模块会5分钟给MQTT服务器发业务心跳消息,根据监控,心跳消息没有任何问题。但是我给终端模块publish消息始终收不到回应。如果我通过命令行kick掉终端,在重新连上的前面几分钟,publish消息是收的到的。
所以每次解决这个问题,就是kick掉终端重连,在几分钟时间窗内,下发一条指令让终端更新连接的mqtt服务器。如果不做这些动作,始终无法对终端进行publish。
在有问题时间内,5分钟业务心跳是没有问题的,另外也没有任何的重连,说明mqtt本身的心跳也是没有问题的。就是服务端对终端模块的publish消息有问题。
不知道谁遇到过这类问题,从什么方向去解决。

你可以参考一下我们的 日志追踪 文档追踪一下你的客户端和主题,看下具体的报文发送情况。

抓到个包。我分析发现,ping报文正常,远程终端给服务器publish的消息正常。说明网络是没有问题。但是下行publish,会tcp retranmission。
抓包文件链接:
https://resource.washpayer.com/public/problem.pcap

这个还算有比较大几率的。如果不换mqtt服务器,即使把把终端kick掉,重新连上,还是一样会socket超时。但是kick掉,换一台muqtt服务器连接,就不在有问题。
emqx.log.3:2023-01-10T12:29:18.656207+08:00 [warning] 863488056605077@117.133.192.119:33473 [MQTT] socket_error: etimedout
emqx.log.3:2023-01-15T21:22:18.688294+08:00 [warning] 863488056605077@117.133.192.119:38675 [MQTT] socket_error: etimedout
emqx.log.3:2023-01-16T14:47:26.912218+08:00 [warning] 863488056605077@117.133.192.119:45372 [MQTT] socket_error: etimedout
emqx.log.3:2023-01-16T18:48:19.136209+08:00 [warning] 863488056605077@117.133.192.119:46860 [MQTT] socket_error: etimedout
emqx.log.3:2023-01-17T18:45:10.208218+08:00 [warning] 863488056605077@117.133.192.119:47571 [MQTT] socket_error: etimedout
emqx.log.3:2023-01-26T23:27:24.096235+08:00 [warning] 863488056605077@117.133.192.119:49071 [MQTT] socket_error: etimedout
emqx.log.3:2023-01-28T18:03:15.264250+08:00 [warning] 863488056605077@117.133.192.119:60245 [MQTT] socket_error: etimedout
emqx.log.3:2023-01-29T09:40:27.712240+08:00 [warning] 863488056605077@117.133.192.119:61735 [MQTT] socket_error: etimedout
emqx.log.3:2023-01-29T18:39:21.536201+08:00 [warning] 863488056605077@117.133.192.119:62474 [MQTT] socket_error: etimedout
emqx.log.3:2023-01-29T20:47:17.440207+08:00 [warning] 863488056605077@117.133.192.119:63200 [MQTT] socket_error: etimedout
emqx.log.3:2023-01-29T22:57:31.072224+08:00 [warning] 863488056605077@117.133.192.119:63207 [MQTT] socket_error: etimedout
emqx.log.3:2023-01-30T01:02:15.488204+08:00 [warning] 863488056605077@117.133.192.119:63215 [MQTT] socket_error: etimedout
emqx.log.3:2023-01-30T08:29:14.560213+08:00 [warning] 863488056605077@117.133.192.119:63219 [MQTT] socket_error: etimedout

你的这个抓包文件看不了哦,是设备发送数据到 EMQX 发生了 Retranmission 吗?换了台服务器就可以了?两台服务器的网络环境有差异吗?

1)检查下你的客户端,是否使用长连接,长连接建立通道后,占用连接。使用短连接会好点
2)你客户端,如果同时2路回传,即同时支持mqtt + socket的话,可以避开mqtt,用新搭建的一个socket接收服务器来publish的消息到客户端,不用emqx下发。
有可能你客户端性能较弱,tcp/ip连接时间一长,mqtt/emqx底层的socket的基本的双向通信机制,在客户端机器上,失去了作用。

我抓的包设置好了,可以下载了。这个不应该简单因为客户端问题。从抓包可以分析到,ping和pong都是没有问题的,只是到业务侧自己的mqtt报文经常出现重试。

ping 和 pong 可能只是因为报文小所以才没有问题,看抓包有比较多的 Retransmission,你的设备网络环境是怎么样的?

部署在小区充电桩,使用4G网络, cat1芯片组。
他不是终端一直这样,我切换一次或者多次切换服务器(服务器都是相同配置)就OK了。但是如果放任不管,可能一段时间之后(个把小时之后)也能自动恢复。

所以每次客户反馈这个问题,我就是多次从服务器端kill掉终端,在他上线后,立即切换服务器,等OK后,在切换回来,就解决了

同充电桩,关注这个问题。
有没有试过2分钟心跳包?发生问题时有车子在充电吗?

我们试过1分钟,也不行。有时候有充电,有时候没有充电。不过他这个实际上并不是所有设备,也不是所有时候都发生。如果说问题出现一会儿有恢复,我们就认为他是网络问题了,确实那个时候慢。但是一旦出现问题,一般很长一段时间都没法恢复,除非我把他踢掉,重连,在重连的很短时间窗内切换另外一台服务器,然后在切换回来就OK。有时候多次踢掉,重连,也可以OK。反正恢复的办法就是踢掉,重连,搞个几次就好了。

是两节点集群吗,这两个节点之间网络情况如何?

不是集群,standalone的形式