测试的qos=0/1/2,貌似没有生效

环境信息

  • EMQX 版本:5.0.8
  • 操作系统及版本:centos
  • 其他

问题描述

目前在测试Mqtt的Qos,按我的理解,Qos=0的时候,如果数据没有被消费,会直接被丢弃,Qos=1的时候,如果数据没有被消费,会在consumer下次启动的时候,重新发送。但是,在测试的时候发现,Qos=0/1/2的时候,数据如果没有被消费,就会直接被丢弃

这里详细说一下Qos=1的时候测试详情:

  1. 不启动consumer,数据发送会被直接丢弃
  2. 启动consumer,被丢弃的数据不会重发,不会被消费掉,但是启动了consumer后,再次发送消息,就能正常消费
  3. 再次停止consumer,再次发送新的消息,数据会存储在类似一个队列里,再次启动consumer会把消息一口气消费进来
  4. 停止consumer,并把session也关闭,发送数据,这时候数据还是会被直接丢弃掉

配置文件及日志

这里设置了options.setCleanSession(false);
Qos = 0/1/2

这些消息是会话的一部分。第一次建立连接时,没有与之关联的旧会话,你在这之前发布的消息都是直接被丢弃了的,所以不可能下发给 consumer。

在你后续重连时,如果选择清除会话,那么这些缓存的消息也会被一并清除,所以你自然不可能再收到这些消息。

但是这样的话,选择Qos=0/1/2好像就没啥区别了。因为我发现,Qos=0的时候,也是同样的效果,先启动consumer,消费一段时间消息,然后再停止consumer,不清除会话并发送消息,这时候再次启动consumer,会把刚才发送的消息一口气消费掉。


按照官网所说,如果Qos=1,如果消息没有收到PUBACK,会把消息存储下来,并重新发送,这里好像体现不出来,按照刚才的测试,存储消息是存储在会话里的,和设置的Qos没啥关系。也就是Qos的设置貌似没生效?

刚才又安装了一下mosquitto,测试了一下,发现当qos=1的时候,先用consumer消费,然后断开consumer,再发送消息,再打开consumer,这时候数据能一口气消费,当qos=1的时候,重复同样的操作,这时候数据不能被消费.
我在想,是不是我emqx有什么地方没设置对?

QoS 0,1,2 的区别是对可靠性的保证不同,并不是离线期间是否存储该消息。

是不是打错了,我看都是 QoS 1

先有会话,离线消息才会保存到会话队列,上线后才会发送出去