mqtt服务器不算是消息队列吗?如果并发量很高该如何解决?

在电脑上搭建mqtt服务器,起了emq,然后启动生产者手动向emq发了几条消息,没起消费者,过了一会再启动消费者订阅对应主题,但是消费者没有接收到数据,这种情况是因为消息没有持久化在队列中吗?不启动消费者这些消息有办法在队列中持久化吗?
我一直以为生产者发消息是发到队列中持久化的,后面消费者慢慢消费,但mqtt服务器实际好像不是这样的。如果生产者并发量较大该如何解决,不太明白,请大佬赐教

阅读 3k
2 个回答

mqtt应该不算消息队列。默认情况下没有消息持久化。虽然它也有主题和订阅的概念在里面,但是mqtt服务端(代理)主要还是基于这两个概念来进行转发消息。

mqtt协议里面是有保留消息的(Retain 标志为 1 的 PUBLISH 报文),emqx也支持保留消息,但是每个主题只有一条(官网文档是这么描述的)

这个“保留消息”应该不是你要的在队列中持久化消息。

mqtt是这样的,如果你往一个主题生产消息时,如果没有其他的客户端订阅这个主题,mqtt服务器(代理)就会丢掉这个消息。之后客户端再订阅消息,也只能收到从订阅开始之后的消息了,不会收到历史消息。

这个是不是丢掉消息,和QOS没有关系,不管发布消息的时候QOS是多少,只要发布的那一刻,主题没有被客户端订阅,消息都会被丢掉。

===

mqtt的并发量问题,应该就是大量的客户端连接,可能会有几十上百万的客户端同时连接,客户端会发布和订阅消息,这个只要加资源就可以解决。

MQTT是一个消息协议。比如RabbitMQ是一个消息队列中间件,它支持AMQP、MQTT等多种协议。

没了解emq是个啥?应该类似RabbitMQ。持久化消息应该是很基础的功能。

可以关注一下MQTT里面的消息服务质量(QoS)。在消息发送时,可以设置

借用一下网图:
image.png

在设置为: 严格一次模式时,可看到Broker中间件是有Store(Msg)操作的。默认好像是不会持久化消息。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题