Dev Station Technology

MQTT QoS:3つのサービスレベルの理解

MQTT QoSレベルはIoTメッセージ配信の信頼性を保証し、dev-station.techが説明するように、開発者が多様なネットワーク条件にわたってデータの整合性を管理するための重要なメカニズムです。このシステムは、メッセージ保証とパフォーマンス・オーバーヘッドのバランスを取るための構造化されたアプローチを提供し、堅牢なIoTアプリケーションを構築するための明確な道を提供します。

メッセージ保証、送達確認、ネットワーク・パフォーマンス。

3つのMQTT QoSレベルとは?

3つのMQTT QoS(Quality of Service)レベルは、QoS 0(Atmost once)、QoS 1(At least once)、QoS 2(Exact once)です。これらは、MQTTクライアントとブローカー間のメッセージ配信の保証を定義し、開発者が信頼性とパフォーマンスのバランスをとることを可能にします。

モノのインターネットの世界では、デバイスは信頼性の低いネットワークを介して通信することがよくあります。遠隔地のセンサーは断続的な携帯電話サービスに直面するかもしれませんし、スマートホームデバイスは混雑したWi-Fiネットワーク上にあるかもしれません。MQTTプロトコルは、このような厳しい環境のために特別に設計されました。その中核となるのが、QoS(Quality of Service)機能です。これは、メッセージ転送を成功させるために必要な労力と確認のレベルを決定する、送信者と受信者の間の強力な合意です。

これは単なる技術的な設定ではなく、アプリケーションの信頼性、遅延、リソース消費に影響を与える基本的な選択です。正しいサービスレベルを選択することは、IoT 開発者が行うことができる最も重要なアーキテクチャ上の決定の 1 つです。Dev Station Technologyは、この選択がユースケースに完全に依存することを理解しています。見逃される可能性のあるクリティカルでない温度の読み取りなのか、産業機械の一部をシャットダウンするクリティカルなコマンドなのか。それぞれのシナリオでは、異なるレベルの配信保証が要求されます。

QoS 0(At Most Once)はどのように機能しますか?

QoS 0はファイヤー・アンド・フォーゲットの原理で動作します。送信者は、受信者からの確認応答を必要とせずにメッセージを1回だけ送信します。これは最も速いレベルですが、配信の保証はありません。

Fire-and-forget と呼ばれることもあるQoS 0は、MQTT で最も基本的な配信モードです。クライアントがQoS 0でメッセージをパブリッシュすると、TCP/IPパケットを送信して次に進みます。クライアントは確認を待たず、メッセージが紛失しても再送信しません。

  • メカニズムクライアントはブローカーに1つのPUBLISHパケットを送信します。送信者から見ると、そこでプロセスは終了します。
  • オーバーヘッド:このレベルはネットワークと処理のオーバーヘッドが最も少ないレベルです。最も帯域幅を使用せず、最もCPUパワーとバッテリー寿命を必要としないため、制約の厳しいデバイスに最適です。
  • 使用例:QoS 0は、多少のデータ損失が許容される非重要な遠隔測定データに適しています。例えば、センサーが1秒ごとに周囲温度を報告する場合、1つの読み取り値を失ってもシステム全体に影響を与えることはほとんどありません。1秒後に次の読み取り値が更新されます。

QoS 1 (At Least Once)の仕組みは?

QoS 1は、メッセージが少なくとも1回は配信されることを保証します。送信者は、受信者からPUBACK(Publish Acknowledgment)パケットを受信するまでメッセージを再送し続けますが、その結果、メッセージが重複する可能性があります。

このレベルでは、確認応答という重要な要素が導入されます。QoS 1では、送信者はメッセージが宛先に到達したことを保証されます。これにより、信頼性の高いメッセージングが大幅に向上し、IoTアプリケーションで最も一般的に使用されるレベルになります。

メッセージ・フローには2段階のハンドシェイクが含まれます:

  1. クライアントからブローカーへ:クライアントからブローカーへ:パブリッシング・クライアントは、一意のパケット識別子を持つPUBLISHパケットを送信します。その後、承認されるまでメッセージをローカルに保存します。
  2. ブローカーからクライアント:PUBLISHパケットを受信すると、ブローカーは同じPacket Identifierを含むPUBACKパケットを送り返します。クライアントはPUBACKを受信すると、保存されているメッセージを安全に破棄できます。

QoS 1で考慮すべき重要な点は、重複メッセージの可能性です。送信者がPUBLISHパケットを送信し、ネットワークの中断によりPUBACKを受信しなかった場合、同じメッセージを再送します。受信者はメッセージを2回受信するかもしれませんが、1回目の確認応答を送信できなかった可能性があります。したがって、QoS 1 を使用するアプリケーションは、潜在的な重複を 潔く処理するように設計されていなければなりません(すなわち、冪等性)。

使用例:QoS 1は、メッセージを配信しなければならないが、重複したメッセージは害にならないようなシナリオに最適です。これには、べき等であるコマンド(例えば、ライトをオンに設定する)、重要なアラート、またはアクションをトリガーする通知などが含まれます。

QoS 2 (Exactly Once)の仕組みは?

QoS 2は最高レベルの信頼性を提供し、4パートのハンドシェイクを使用することで、メッセージが正確に1回だけ配信されることを保証します。このプロセスは重複の可能性を排除しますが、ネットワークと処理のオーバーヘッドが最も大きくなります。

データの損失や重複が許容できない最も重要なアプリケーションでは、QoS 2が究極の保証を提供します。このレベルは、金融取引や重要なインフラ制御など、メッセージの重複が重大な結果をもたらしかねないシステムには不可欠です。

正確な1回限りの配信は、より複雑な4パートのハンドシェイクによって実現されます:

  1. PUBLISH:送信者はPUBLISHパケット(パケットID付き)を送信し、それを保存します。
  2. PUBREC(受信パブリッシュ):受信者はPUBLISHパケットを受信し、Packet IDを保存し、PUBRECパケットで応答します。
  3. PUBREL(発行リリース):PUBRECを受信すると、送信者は最初のメッセージを破棄し、PUBRELパケットを送信します。これは、トランザクションの一部分を完了したことを示すシグナル。
  4. PUBCOMP(パブリッシュ完了):受信者はPUBRELパケットを受け取り、保存されているPacket IDを破棄し、PUBCOMPパケットで応答します。送信者がPUBCOMPを受け取ったときにのみ、トランザクションが完 全に完了したと確信できます。

この強固なハンドシェイクは、両パーティがメッセージ転送の確認された状態を持つことを保証し、損失と重複の両方を防ぎます。しかし、この保証は、待ち時間とリソース使用量の増加という代償を伴います。

ユースケースQoS 2はミッション・クリティカルなシステム用に確保されています。例としては、支払い処理、正確な量の薬の調剤、またはコマンドを繰り返すと大惨事になるようなロボットアームの制御などがあります。

正しいMQTT QoSレベルを選択するには?

適切な MQTT QoS レベルを選択するには、アプリケーションに必要な信頼性と、ネットワーク帯域幅、CPU 処理、およびバッテリー消費のコストとのバランスを取る必要があります。データの重要性と IoT デバイスの機能を分析する必要があります。

この決定はトレードオフです。特定のアプリケーションに最適なQoSレベルがあるだけです。IoT 開発者の動向に関する Eclipse Foundation による 2021 年の調査では、信頼性が依然として開発者の最大の関心事であることが判明しており、十分な情報に基づいて QoS を選択することの重要性が浮き彫りになっています。Dev Station Technologyでは、以下の要素を考慮するようクライアントにアドバイスしています:

要因QoS 0: 最大1回QoS 1: 少なくとも1回QoS 2: 一度だけ
信頼性最低(保証なし)高 (配達保証)最高(保証、重複なし)
オーバーヘッド最低最高
遅延最低最高
消費電力最低最高
実装最も簡単重複処理が必要最も複雑なロジック
  • データの重要性:メッセージが失われた場合のビジネスへの影響は?影響が大きい場合、QoS 0はオプションではありません。メッセージが複製された場合の影響は?重複がシステム障害の原因となる場合は、QoS 2が必要です。
  • デバイスの制約:デバイスの電源は小型バッテリーですか?もしそうなら、QoS 2の4パート・ハンドシェイクの高い消費電力は、法外かもしれません。QoS 0の最小限のオーバーヘッドが有益です。
  • ネットワーク条件:安定性と信頼性の高いネットワークでは、QoS 0を使用するリスクは低くなります。ドロップアウトが頻繁に発生するセルラー・ネットワークでは、QoS 1とQoS 2の再送信メカニズムが、適切なIoT接続を確保するために不可欠になります。

コードにMQTT QoSを実装するには?

MQTT QoSは、MQTTクライアント・ライブラリのpublish関数で`qos`パラメータを設定することで実装できます。これは通常、0、1、または 2 の整数値で、クライアントとブローカーに特定のメッセージに使用する配信保証を指示します。

ほとんどの MQTT クライアント・ライブラリでは、QoS の実装は簡単です。Python 用の有名な Paho MQTT クライアントを使用した例を見てみましょう。publish()`関数にはQoSレベルを設定するためのパラメータがあります。

ここでは、異なる QoS レベルでメッセージを発行するためのステップバイステップのガイドを示します。

  1. ライブラリをインストールします:まず、Paho MQTTライブラリがインストールされていることを確認します。
    pip install paho-mqtt
  2. パブリッシャースクリプトを作成します:Pythonスクリプトでは、クライアントをインポートし、メッセージブローカに接続し、そして発行します。鍵は `client.publish` 呼び出しの `qos` 引数です。
    import paho.mqtt.client as mqtt
    import time
    
    # --- 接続の詳細
    BROKER_ADDRESS = "mqtt.eclipseprojects.io" # 公開テストブローカー
    CLIENT_ID = "qos_example_publisher"
    ポート = 1883
    
    # トピック
    TEMPERATURE_TOPIC = "iot/センサー/温度"
    COMMAND_TOPIC = "iot/device/command"
    PAYMENT_TOPIC = "iot/system/payment"
    
    def on_connect(client, userdata, flags, rc):
        if rc == 0:
            print("Successfully connected to broker")
        else:
            print(f "Failed to connect, return code {rc}n")
    
    # クライアントの作成と接続
    client = mqtt.Client(CLIENT_ID)
    client.on_connect = on_connect
    client.connect(BROKER_ADDRESS, PORT)
    client.loop_start()
    
    --- 異なるQoSレベルでメッセージを発行 ---
    を試してみてください:
        # QoS 0: クリティカルでない、頻繁なデータ
        client.publish(TEMPERATURE_TOPIC, payload="23.5", qos=0)
        print(f "Published to {TEMPERATURE_TOPIC} with QoS 0")
        time.sleep(1)
    
        # QoS 1: 見逃せない重要なコマンド
        client.publish(COMMAND_TOPIC, payload="TURN_ON", qos=1)
        print(f"{COMMAND_TOPIC}にQoS 1で発行")
        time.sleep(1)
    
        # QoS 2: 正確に一度だけ発生しなければならないクリティカルなトランザクション
        client.publish(PAYMENT_TOPIC, payload="TXN_12345", qos=2)
        print(f"{PAYMENT_TOPIC}にQoS 2で発行")
        time.sleep(2) # ハンドシェイクが完了するまでの時間を与えます。
    
    except KeyboardInterrupt:
        print("発行が停止しました")
    
    最後に
        client.loop_stop()
        client.disconnect()

この例では、3つの異なるメッセージが、それぞれ異なるトピックに、想像されるユースケースに適したQoSレベルで送信されます。基本的なハンドシェイクのロジックはPahoライブラリによって自動的に処理され、開発者のタスクは0,1,2のいずれかを選択するだけになります。

MQTT QoSはどのようにロストメッセージのトラブルシューティングに役立ちますか?

IoT システムでメッセージの損失が発生している場合、主なトラブルシューティングのステップは QoS レベルを 0 から 1 に上げることです。これにより、メッセージの確認応答が導入され、直ちに配信保証が提供され、メッセージが正常にブローカーに到達していることを確認できます。

IoT システムが期待通りに動作せず、パブリッシュ/サブスクライブフローでメッセージが失われている疑いがある場合、MQTT QoS は最も強力な診断ツールとなります。QoS 0 で開始すると、メッセージ配信に関する洞察は得られません。パケットが送信され、それが到着することを願うだけです。

QoS レベルを体系的に上げることで、問題の原因を突き止めることができます:

  • QoS 1へのアップグレード:QoS 0からQoS 1に切り替えたことでメッセージロストの問題が解決した場合、クライアントとブローカー間のパケットロスに問題があったことが確認できます。ネットワークの信頼性が低く、QoS 0のfire-and-forgetの性質では不十分でした。QoS 1の配信保証はこれを克服します。
  • QoS 1の重複の観察:QoS 1に移行後、コマンドやアラートが重複して表示されるようになった場合は、ネットワークがブローカーからクライアントへの確認応答(PUBACK)パケットをドロップしていることを示しています。確認応答を受信していないクライアントはメッセージを再送するため、重複が発生します。このことから、受信側のアプリケーションを冪等(idempotent)にする必要があることがわかります。
  • QoS 2の実装:重複が致命的な障害を引き起こす場合、QoS 2への移行が最終的なステップとなります。QoS 2の4パートのハンドシェークはこのようなエッジケースを解決するように設計されており、メッセージがブローカーによって正確に一度だけ処理されることを保証します。QoS 2 を使用しても問題が解決しない場合は、おそらくブローカの設定かサブスクライブ・クライアントのロジックなど、MQTT 配信メカニズムの外部に問題がある可能性があります。

各QoSレベルのパフォーマンス・オーバーヘッドは?

パフォーマンスのオーバーヘッドは、QoSレベルごとに大幅に増加します。QoS 1は確認応答パケットのため、QoS 0の約2倍のネットワーク・トラフィックがあります。QoS 2は、4パートのハンドシェイクがあるため、QoS 0の約4倍のトラフィックがあります。

各QoSレベルに関連する具体的なネットワーク・トラフィックとレイテンシ・コストを理解することは、効率的なIoTシステムを設計する上で不可欠です。オーバーヘッドは理論的なものだけでなく、データプランのコスト上昇、バッテリー寿命の短縮、レスポンスタイムの低下などに直接反映されます。

以下に、メッセージ・フローと相対的なオーバーヘッドの計算上の内訳を示します:

QoSレベルメッセージ・フローパケット数相対オーバーヘッド
0パブリッシュ11x (ベースライン)
1PUBLISH → ← PUBACK
← PUBACK
2~2x
2PUBLISH → ← PUBREC
← PUBREC
PUBREL → ← PUBCOMP
← PUBCOMP
4~4x

この計算から、QoS 0 から QoS 2 に移行すると、1 回のメッセージ・トランザクションのネット ワーク・パケットが 300%増加することがわかります。1日に数百のメッセージを送信するバッテリー駆動のデバイスにとって、この差は相当なものであり、現場でのデバイスの寿命に劇的に影響します。

IoTプロジェクトの次のステップは?

次のステップは、特定のユースケースを分析し、システム内の各メッセージタイプに適切なQoSレベルを選択し、アプリケーションに実装することです。信頼性が高く効率的なIoTソリューションの構築に関する専門家のガイダンスについては、専門家との提携をご検討ください。

MQTT QoS をマスターすることは、熟練した IoT アーキテクトになるための重要なステップです。各レベルの保証とトレードオフを理解することで、実環境に完璧に合わせた、信頼性と効率性を兼ね備えたシステムを設計することができます。

IoT プロジェクトを計画中で、堅牢なメッセージングアーキテクチャの設計にお困りなら、Dev Station Technology のエキスパートがお手伝いします。複雑なプロトコルの選択、セキュリティの実装、プラットフォームの開発を通して、お客様のプロジェクトを成功に導きます。

次世代コネクテッドデバイスの構築を支援する方法について詳しくは、dev-station.techで当社のサービスをご覧いただくか、sale@dev-station.techまで直接お問い合わせください。

Share This Post

Subscribe To Our Newsletter

Get updates and learn from the best

More To Explore

Do You Want To Boost Your Business?

drop us a line and keep in touch