MQTT クライアントによって提供されるサービス品質
MQTT クライアントは、パブリケーションを IBM® MQ および MQTT クライアントに提供するために、「at most once」、「at least once」、「exactly once」という 3 段階のサービス品質を提供します。 MQTT クライアントがサブスクリプションを作成する要求を IBM MQ に送信すると、その要求は「最低 1 回」のサービス品質で送信されます。
パブリケーションのサービス品質は、MqttMessage の属性です。 これはメソッド MqttMessage.setQos によって設定されます。
メソッド MqttClient.subscribe は、トピックのクライアントに送信されるパブリケーションに適用されるサービス品質を下げることができます。 サブスクライバーに転送されるパブリケーションのサービス品質は、パブリケーションのサービス品質と異なる場合があります。 2 つのうちの低い方の値がパブリケーションの転送に使用されます。
- 最高 1 回
QoS=0
- メッセージは最高 1 回送信されるか、まったく送信されません。 ネットワークでのメッセージの送信は確認応答されません。
- メッセージは保管されません。 クライアントが切断されるか、サーバーで障害が発生すると、メッセージが失われる可能性があります。
QoS=0
が最も速い転送モードです。 これは「応答不要送信」と呼ばれることがあります。- MQTT protocol では、サーバーが
QoS=0
のパブリケーションをクライアントに転送する必要はありません。 サーバーがパブリケーションを受信したときにクライアントが切断される場合、サーバーによってはパブリケーションが廃棄される可能性があります。 テレメトリー (MQXR) サービスは、QoS=0
で送信されるメッセージを廃棄しません。 そのメッセージは非持続メッセージとして保管され、キュー・マネージャーが停止する場合にのみ廃棄されます。
- 最低 1 回
-
QoS=1
QoS=1
はデフォルトの転送モードです。- メッセージは常に、最低 1 回送信されます。 送信側が確認応答を受信しない場合、確認応答が受信されるまで、DUP フラグが設定されたメッセージが再送信されます。 結果として、受信側に同じメッセージが複数回送信されて、受信側がそれを複数回処理することになる可能性があります。
- メッセージは処理されるまで、送信側と受信側でローカルに保管しておく必要があります。
- メッセージは、受信側によって処理された後、受信側から削除されます。 受信側がブローカーの場合、メッセージはそのサブスクライバーにパブリッシュされます。 受信側がクライアントの場合、メッセージはサブスクライバー・アプリケーションに送信されます。 メッセージを削除した後、受信側は送信側に確認応答を送信します。
- 送信側が受信側から確認応答を受信した後、そのメッセージは送信側から削除されます。
- 正確に 1 回
QoS=2
- メッセージは常に、正確に 1 回送信されます。
- メッセージは処理されるまで、送信側と受信側でローカルに保管しておく必要があります。
QoS=2
は最も安全ですが、最も遅い転送モードです。 メッセージを送信側から削除する前に、送信側と受信側の間で少なくとも 2 組の伝送を取ります。 最初の伝送の後に受信側のメッセージを処理することができます。- 1 組目の伝送で、送信側はメッセージを伝送し、メッセージが保管されたという確認応答を受信側から取得します。 送信側が確認応答を受信しない場合、確認応答が受信されるまで、DUP フラグが設定されたメッセージが再送信されます。
- 2 組目の伝送で、送信側はメッセージ
の処理を完了できることを受信側に伝えます。 送信側がPUBREL
メッセージの確認応答を受信しない場合、確認応答が受信されるまでPUBREL
メッセージが再送信されます。 送信側は、PUBREL
メッセージに対する確認応答を受信すると、保存していたメッセージを削除します。PUBREL
- 受信側は、メッセージを再処理しない場合には、最初または 2 番目のフェーズでメッセージを処理することができます。 受信側がブローカーの場合、サブスクライバーにメッセージをパブリッシュします。 受信側がクライアントの場合、サブスクライバー・アプリケーションにメッセージを送信します。 受信側は、メッセージの処理を完了したという完了メッセージを送信側に送り戻します。