首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >MQTT messageId的实际实现

MQTT messageId的实际实现
EN

Stack Overflow用户
提问于 2012-06-20 16:12:44
回答 2查看 7.5K关注 0票数 13

我工作的公司已经对MQTT进行了评估,并决定将其用作大型系统的核心消息传递平台。主要原因是该协议是多么紧凑,以及它实际上可以多么容易地实现。不过,我对MQTT有一个问题,我正在寻找以下问题的答案:

QoS1和QoS2消息需要来自客户端的确认。在接收PUBACK、PUBREC、PUBREL和PUBCOMP时,我唯一知道的消息(识别它)是messageId和clientId。消息id是无符号int16,因此最大值为65535。对于长时间运行的客户端来说,它似乎不够大,比方说一年,每小时发送15条QoS2消息。

我不太确定是否有其他方法来识别这条消息?我希望尽可能符合标准。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-06-21 00:15:35

可能要明确的第一点是,消息ID是在每个客户端和每个方向上处理的。也就是说,代理将为每个连接的客户端使用QoS>0为每个传出消息创建一个消息ID,并且这些消息ID将完全独立于用于发布到其他客户端的同一消息的任何其他消息ID。同样,每个客户端为它发送的消息生成自己的消息it。

消息ID不必是唯一的,因此您的客户端以QoS级别2每小时发送15条消息将在某个时候溢出。真正的限制是,每个方向一次最多只能有65535条消息“在飞行中”(即消息握手的中途)。一旦具有给定ID的消息被完全处理,则可以重用该消息ID。

另一种看待它的方法是考虑如果您的客户端曾经一次只有一条消息在传输中,那么它将如何工作,无论是由于消息的传输速率还是由于您处理消息的方式的设计。在这种情况下,您可以将每条消息的消息ID设置为1,因为不会有重复的可能性。

如果您希望支持一次传输多个消息,那么在分配一个新的消息ID之前检查是否有重复的消息ID将是相对简单的。

因为消息ID是针对每个客户端的,所以如果您向>65535个客户端发送一条消息,则不会有消息ID冲突的机会。如果您一次向每个客户端发送超过65535条消息,并且消息流没有完成,那么就会出现问题。

回答评论“我注意到每个MQTT代理都倾向于只传递最后一条QoS1/2消息”:

代理将只向它所知道的客户端发送消息。如果您是第一次连接,则无法获取过去的消息,但有一个例外:保留的消息。如果一条消息被设置为保留,那么它就是一个“最后一次正确”的值。当一个新的客户端订阅时,它将被立即发送保留的消息,这使得它对于不频繁更新的东西很有用。我怀疑这就是你所指的。如果您希望客户端在未连接时将消息排入队列,则必须禁用"clean session“选项以使客户端持久化。还必须使用QoS>0订阅和QoS>0发布。当您的客户端重新连接(仍将clean session设置为disabled)时,将传递排队的消息。您通常可以在代理中以这种方式配置要排队的消息数量,其中任何进一步的消息都将被丢弃。重要的一点是,设计时不支持对以前未连接的客户端的消息进行排队。

票数 22
EN

Stack Overflow用户

发布于 2016-03-05 19:04:39

为了在QOS1或QOS2上传递更多的消息,你应该使用持久内存的概念。在这种情况下,当订阅者不可用时,消息被存储在永久存储器中,并在订阅者连接时传送。在配置mosquitto.conf文件之后,您也可以在QOS0上执行此操作。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11115364

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档