如何保证disconnected能被订阅者都收到

2024-08-26T07:13:55.430529+00:00 [debug] msg: mqtt_packet_sent, mfa: emqx_connection:serialize_and_inc_stats_fun/1, line: 870, pee
rname: 172.29.253.174:57328, clientid: mqtt_15492, packet: PUBLISH(Q0, R0, D0, Topic=$SYS/brokers/emqx@172.17.0.2/clients/PtUBYoRO
SmEDS8Ui/disconnected, PacketId=undefined, Payload={“username”:“02&PtUBYoROSmEDS8Ui”,“ts”:1724656415329,“sockport”:1883,“reason”:"
tcp_closed",“protocol”:“mqtt”,“proto_ver”:4,“proto_name”:“MQTT”,“ipaddress”:“121.199.15.111”,“disconnected_at”:1724656415329,“conn
ected_at”:1724654831077,“clientid”:“PtUBYoROSmEDS8Ui”}), tag: MQTT

我起了5个订阅者,其他要是订阅者重启,分配给他的disconnected信息就会丢失。有没有这样的机制,比如设备离线,消息没被订阅者消费过,订阅者起来后,正常消费,跟MQ一样

你好,MQTT 请求链接时可以把 clean_session 的链接参数设置为 false。这样的话链接下线后,EMQX 会为其会话信息。最多可保留 1000 条消息到内存中。

下次同样使用 clean_session=false 连到 EMQX 则会开始接收这些消息。

如果,想要保留更多的消息需要通过 EMQX Dashboard 修改:

如果想要开启持久化的会话(消息保存到磁盘而不是内存)则需要打开

参考文档:MQTT 会话持久化 | EMQX文档

好的,谢谢

这样订阅者的clientId,是不是要相同,这样对应自己的session

订阅者clientid相同是会被互踢下线的。每个订阅者用自己的clientid就行了,他们都有不同的会话状态,即使订阅的主题一样。