因为对surgemq的研究发现qos>0没有重发功能,然后去看了MQTT协议文档,在qos>0的情况下,服务端确实也需要实现重发,而且还必须保证顺序。
虽然tcp一般情况下保证不丢包,但是服务端在超时时间内没有收到客户端的publish ack时也需要重发publish消息。
4.4 消息分发重试 Message delivery retry
客户端设置清理会话(CleanSession)标志为0重连时,客户端和服务端必须使用原始的报文标识符重发任何未确认的PUBLISH报文(如果QoS>0)和PUBREL报文 [MQTT-4.4.0-1]。这是唯一要求客户端或服务端重发消息的情况。
非规范评注
控制报文的重发曾经需要克服某些陈旧TCP网络上的数据丢失问题。部署在那些环境中的MQTT 3.1.1实现可能仍然需要关注这个问题。4.6 消息排序 Message ordering
实现本章定义的协议流程时,客户端必须遵循下列规则:
重发任何之前的PUBLISH报文时,必须按原始PUBLISH报文的发送顺序重发(适用于QoS 1和QoS 2消息)[MQTT-4.6.0-1]。
必须按照对应的PUBLISH报文的顺序发送PUBACK报文(QoS 1消息)[MQTT-4.6.0-2]。
必须按照对应的PUBLISH报文的顺序发送PUBREC报文(QoS 2消息)[MQTT-4.6.0-3]。
必须按照对应的PUBREC报文的顺序发送PUBREL报文(QoS 2消息)[MQTT-4.6.0-4]。
服务端必须默认认为每个主题都是有序的。它可以提供一