cleanSession为true时的qos问题

环境

  • EMQX 版本:EMQX 5.0
  • 操作系统版本:Linux

如果连接emqx服务器的客户端的cleanSession设为true,qos=1或2的消息还起作用吗?

你好,这样的话就不起作用了。

如果cleanSession设置的为true,但是生产和消费的客户端都一直处于连接状态,这样的话qos=1或2也不起作用吗

qos 1 和 qos 2 的作用都是避免消息丢失,如果一直处于连接状态,那消息也就不会丢失了,qos 0 也能保证消息到达。

如果是消费端的客户端是多实例的,采用共享订阅的方式订阅topic,那么某个实例的断开其他实例可以继续消费。这种情况下,如果cleanSession设为true,qos=1或2还会起作用吗

没理解,一个客户端断开不会影响其它客户端消费的

这样讲吧,现在一个客户端连接emq服务器时cleanSession设置的为true,qos设为1,客户端程序在消费到消息时采用手动确认的方式返回ack信息。如果客户端的手动确认失败了,没有返回ack,那么这时emq服务器还会重发消息吗。因为我看文档上说,cleanSession设为true,qos>0就不起作用了。但我说的这种情况,客户端并没有断开,只是没有返回ack。

那好像又跟共享订阅没什么关系了?

如果是共享订阅,你需要先把 broker.shared_dispatch_ack_enabled 这个配置项设置为 true。

然后 EMQX 会在等待客户端回复响应报文超时后将这个消息转发给共享组里面的其它订阅者。

如果是普通订阅,EMQX 目前在连接内也会有一个超时机制,如果超时未收到响应,就会重传报文。

这个超时时间对应的配置项为 zone.<Zone Name>.retry_interval

那我可以理解为,对于普通订阅,如果生产和消费的客户端的cleanSession设置为true,在保持连接的状态下,qos=1或2还是起作用的,对吧?

是的