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 番目のフェーズでメッセージを処理することができます。 受信側がブローカーの場合、サブスクライバーにメッセージをパブリッシュします。 受信側がクライアントの場合、サブスクライバー・アプリケーションにメッセージを送信します。 受信側は、メッセージの処理を完了したという完了メッセージを送信側に送り戻します。