I propose QoS 2 Delivery Method B should become the only forwarding method, and Method A be eliminated in future MQTT versions.
This can reduce delivery delays for PUBLISH messages over QoS 2 flows when the network propagation delay is substantial. In addition, Method B eliminates temporary storage required by Method A. Both methods are described in MQTT 3.1.1 Section 4.3.3 in non-normative text accompanying diagram 4.3.
This change may also be beneficial for the following MQTT isses:
MQTT-197 Support Request Reply
MQTT-236 Consolidate ACKs, Enable NAKs
MQTT-271 Describe Small Device Limitations aka The Arduino problem.
I propose the existing non-normative text in section 4.3.3 :
"...there are two methods by which QoS 2 can be handled by the receiver. They differ in the point within the flow at which the message is made available for onward delivery. The choice of Method A or Method B is implementation specific. As long as an implementation chooses exactly one of these approaches, this does not affect the guarantees of a QoS 2 flow."
Be replaced by normative text along the lines of the following:
"Upon receiving a QoS 2 PUBLISH message which is both valid and not a duplicate, the receiver SHOULD immediately initiate onward delivery and send a PUBREC. The receiver MAY send a PUBREC before the onward delivery is complete. If the forwarding operation fails, the receiver MUST send an appropriate error response, or terminate the transport as specified in section
{TBD part of MQTT-236 }. The receiver MUST NOT send more than one PUBREC for the a single message arrival."
A brief containing additional details can be found here: