在电脑上搭建mqtt服务器,起了emq,然后启动生产者手动向emq发了几条消息,没起消费者,过了一会再启动消费者订阅对应主题,但是消费者没有接收到数据,这种情况是因为消息没有持久化在队列中吗?不启动消费者这些消息有办法在队列中持久化吗?
我一直以为生产者发消息是发到队列中持久化的,后面消费者慢慢消费,但mqtt服务器实际好像不是这样的。如果生产者并发量较大该如何解决,不太明白,请大佬赐教
回答:
MQTT
是一个消息协议。比如RabbitMQ
是一个消息队列中间件,它支持AMQP、MQTT等多种协议。
没了解emq
是个啥?应该类似RabbitMQ
。持久化消息应该是很基础的功能。
可以关注一下MQTT里面的消息服务质量(QoS)
。在消息发送时,可以设置
借用一下网图:

在设置为: 严格一次模式时,可看到Broker中间件是有Store(Msg)
操作的。默认好像是不会持久化消息。
mqtt应该不算消息队列。默认情况下没有消息持久化。虽然它也有主题和订阅的概念在里面,但是mqtt服务端(代理)主要还是基于这两个概念来进行转发消息。
mqtt协议里面是有保留消息的(Retain 标志为 1 的 PUBLISH 报文),emqx也支持保留消息,但是每个主题只有一条(官网文档是这么描述的)
这个“保留消息”应该不是你要的在队列中持久化消息。
mqtt是这样的,如果你往一个主题生产消息时,如果没有其他的客户端订阅这个主题,mqtt服务器(代理)就会丢掉这个消息。之后客户端再订阅消息,也只能收到从订阅开始之后的消息了,不会收到历史消息。
这个是不是丢掉消息,和QOS没有关系,不管发布消息的时候QOS是多少,只要发布的那一刻,主题没有被客户端订阅,消息都会被丢掉。
===
mqtt的并发量问题,应该就是大量的客户端连接,可能会有几十上百万的客户端同时连接,客户端会发布和订阅消息,这个只要加资源就可以解决。