mqtt服务器不算是消息队列吗?如果并发量很高该如何解决?
在电脑上搭建mqtt服务器,起了emq,然后启动生产者手动向emq发了几条消息,没起消费者,过了一会再启动消费者订阅对应主题,但是消费者没有接收到数据,这种情况是因为消息没有持久化在队列中吗?不启动消费者这些消息有办法在队列中持久化吗?我一直以为生产者发消息是发到队列中持久化的,后面消费者慢慢消费,但mqtt服务器实际好像不是这样的。如果生产者并发量较大该如何解决,不太明白,请大佬赐教
回复
1个回答
test
2024-07-06
mqtt应该不算消息队列。默认情况下没有消息持久化。虽然它也有主题和订阅的概念在里面,但是mqtt服务端(代理)主要还是基于这两个概念来进行转发消息。
mqtt协议里面是有保留消息的(Retain 标志为 1 的 PUBLISH 报文),emqx也支持保留消息,但是每个主题只有一条(官网文档是这么描述的)
这个“保留消息”应该不是你要的在队列中持久化消息。
mqtt是这样的,如果你往一个主题生产消息时,如果没有其他的客户端订阅这个主题,mqtt服务器(代理)就会丢掉这个消息。之后客户端再订阅消息,也只能收到从订阅开始之后的消息了,不会收到历史消息。
这个是不是丢掉消息,和QOS没有关系,不管发布消息的时候QOS是多少,只要发布的那一刻,主题没有被客户端订阅,消息都会被丢掉。
===
mqtt的并发量问题,应该就是大量的客户端连接,可能会有几十上百万的客户端同时连接,客户端会发布和订阅消息,这个只要加资源就可以解决。
回复
适合作为回答的
- 经过验证的有效解决办法
- 自己的经验指引,对解决问题有帮助
- 遵循 Markdown 语法排版,代码语义正确
不该作为回答的
- 询问内容细节或回复楼层
- 与题目无关的内容
- “赞”“顶”“同问”“看手册”“解决了没”等毫无意义的内容