Skip to content

機能と利点 ​

EMQXは、MQTT over QUIC向けに独自のメッセージ伝送機構と管理方法を設計しており、現代の複雑なネットワーク上でMQTTメッセージをより効率的かつ安全に伝送する方法を提供します。これにより、特定のシナリオにおけるMQTTのパフォーマンスが向上します。

本ページでは、MQTT over QUICの利点と、各QUIC動作モードのメリットおよびユースケースについて紹介します。

MQTT over QUICの利点 ​

QUICはTCPとUDPの機能を統合しつつ、現代のネットワークにおけるレイテンシ問題に対応するための追加改善を導入しています。QUICの利点は以下の通りです。

  • レイテンシの低減
    QUICは接続確立時間を最小化するよう設計されています。従来のTCP上のMQTTでは、TCPハンドシェイク後に別途TLSハンドシェイクが必要であり、特にモバイルネットワークや不安定な接続環境で遅延が発生します。QUICはトランスポートとTLSのハンドシェイクを統合しているため、MQTT接続をより迅速に確立できます。

  • ヘッドオブラインブロッキングのないマルチプレクシング
    QUICは単一接続上で複数のストリームをマルチプレクシングできます。TCPではあるストリームのパケット損失が他のストリームの処理をブロックするヘッドオブラインブロッキングが発生しますが、QUICでは各ストリームが独立しているため、複数のトピックやメッセージストリームを同時に扱うMQTTアプリケーションに有利です。

  • 不安定なネットワークでの優れたパフォーマンス
    QUICはTCPに比べてパケット損失やネットワークの変動(例:Wi-Fiとセルラー間の切り替え)に強く設計されています。頻繁にネットワーク断が発生する環境やモバイルデバイス上で動作するMQTTアプリケーションにおいて、よりレジリエントな接続を提供します。

  • 組み込みのセキュリティ
    QUICはTLS相当のセキュリティ機能を標準で備えているため、MQTT over QUICは追加設定なしに常に暗号化および認証が行われます。

  • 接続マイグレーション
    QUICはクライアントのIPアドレスやポートの変更を接続の再確立なしにシームレスに処理できます。移動中のMQTTデバイスにとって、ネットワークが変わっても接続を維持できる点が特に有用です。

  • 改善された輻輳制御
    TCPの輻輳制御アルゴリズムは長年の実績がありますが、QUICはより柔軟で新しいアルゴリズムの実験も可能にします。これにより、輻輳したネットワーク環境でのMQTTメッセージのスループットや応答性が向上する可能性があります。

QUICの動作モード ​

現在のEMQXの実装では、トランスポート層をQUICストリームに置き換えており、クライアントが接続を開始し双方向ストリームを作成します。EMQXとクライアントはこのストリーム上でやり取りを行います。複雑なネットワーク環境を考慮し、クライアントが何らかの理由でQUICハンドシェイクに失敗した場合は、自動的に従来のTCPにフォールバックし、サーバーとの通信障害を回避します。EMQXとクライアント間のやり取りには、シングルストリームモードとマルチストリームモードの2つのモードがあります。以下のセクションで各モードの特徴と利点を紹介します。

MQTT over QUIC

シングルストリームモード ​

シングルストリームモードは基本的なモードで、MQTTパケットを単一の双方向QUICストリームにカプセル化します。高速なハンドシェイク、順序通りのデータ配信、接続再開、0-RTT、クライアントアドレスのマイグレーション、損失検出と回復の強化を提供します。このモードにより、クライアントとEMQX間の通信が高速かつ効率的になり、順序を維持しつつ接続を迅速に回復し、クライアントがローカルアドレスを大きな中断なく移行できるようになります。

image-20231020154933157

特徴と利点 ​

シングルストリームモードの特徴と利点は以下の通りです。

  • 高速ハンドシェイク
    クライアントとEMQX間のQUIC接続は1往復以内で確立可能です。

  • 順序通りのデータ配信
    TCP同様、MQTTパケットはストリーム内で送信された順序で配信されます。UDPのデータグラムパケットが順不同で受信されても順序は維持されます。

  • 接続再開、0-RTT
    0-RTT方式を用いることで、クライアントは接続を再開し、最初のQUICパケットまたは直後にアプリケーションデータをサーバーに送信できます。EMQXの応答を待って往復を完了する必要がありません。これはネットワーク障害による接続切断から迅速に回復し、アプリケーション業務を素早く再開するのに特に有効です。

  • クライアントアドレスのマイグレーション
    QUIC接続を切断・再確立することなく、クライアントはNATリバインディングなどによりローカルアドレスを新しいアドレスに能動的または受動的に移行できます。これによりMQTT層以上に大きな影響を与えずに接続を維持可能です。

  • パケット損失検出と回復
    QUICは他のプロトコルに比べてパケット損失の検出と回復が迅速です。動作はユースケースごとに調整可能です。

マルチストリームモード ​

マルチストリームモードはQUICのストリーム多重化機能を活用し、MQTTパケットを複数ストリームで伝送します。これにより単一のMQTT接続で複数トピックのデータを扱え、接続制御とMQTTデータ交換の分離、ヘッドオブラインブロッキングの回避、アップリンクとダウンリンクの分割、異なるデータの優先度区別、並列処理の向上、堅牢性の強化、データストリームのトラフィック制御、サブスクリプションレイテンシの低減など多くの改善が可能です。

image-20231020155006197

クライアントからEMQXへ最初に確立されるストリームはコントロールストリームと呼ばれ、MQTT接続の維持や更新を担当します。その後、クライアントは1つまたは複数のデータストリームを開始し、各ストリームごとにトピックのパブリッシュやサブスクライブを行います。

クライアントはストリームのマッピング方法を自由に選択できます。例として:

  • トピックごとに1つのストリームを使う
  • QoS 1用とQoS 0用で別々のストリームを使う
  • パブリッシュ用とサブスクライブ用で別々のストリームを使う(コントロールストリーム上でのパブリッシュ/サブスクライブも可能)

ブローカーであるEMQXは以下のストリームパケットバインディングを行います:

  • QoS 1のPUBLISHを受信したストリーム上でPUBACKパケットを送信し、QoS 2パケットも同様です。
  • トピックサブスクリプションを受けたストリーム上でPUBLISHパケットを送信し、同じストリーム上でQoS1のPUBACKを期待します。

TIP

データの順序はストリームごとに維持されます。したがって、2つのトピック間でデータが相関し順序が重要な場合は、同じストリームにマッピングすべきです。

特徴と利点 ​

マルチストリームモードの特徴と利点は以下の通りです。

  • 接続制御とMQTTデータ交換の分離
    CONNECT、CONNACK、PINGなどのMQTT接続制御パケットはコントロールストリームで処理され、パブリッシュやサブスクライブなどのデータ交換はデータストリームで行われます。データストリームが遅くても、PINGREQ/PINGRESPの処理により接続は生存可能です。

  • トピック間のヘッドオブラインブロッキング回避
    MQTT over QUICは異なるトピックごとに複数のデータストリームを持てるため、異なるトピックのメッセージが独立して配信されます。

  • アップリンク(パブリッシュ)とダウンリンク(サブスクライブ)の分割
    例えば、クライアントは1つのストリームでQoS1メッセージをパブリッシュし、そのストリーム上でPUBACKを処理しつつ、別のストリームでブローカーからのQoS0メッセージを受信できます。

  • 異なるデータの優先度付け
    MQTT over QUICはマルチストリームを通じて異なるMQTTトピックのデータに優先度を付けることが可能です。これにより、トピックデータを優先的に配信し、接続の全体的なパフォーマンスと応答性を向上させます。

  • クライアントおよびEMQX側の処理並列性の向上
    データストリームの活用により、EMQXとクライアントは複数ストリームを並列処理でき、システム全体の効率とリソース利用率が向上し、レイテンシ低減とアプリケーション層の応答速度改善につながります。

  • エラー処理のオーバーヘッド削減
    単一のデータストリームがアプリケーションエラーで中断しても、接続全体が閉じることはありません。アプリケーションは自由にストリームを再作成してデータを回復できます。これにより、より信頼性が高くレジリエントなMQTT通信が可能です。

  • データストリームのフロー制御
    フロー制御はストリームごとに適用でき、トピックやQoSレベルごとに異なるフロー制御ポリシーを設定可能です。

  • サブスクリプションレイテンシの低減
    クライアントはMQTTのCONNACKを待たずにサブスクライブやパブリッシュパケットを送信できます。ただし、EMQXはクライアントが接続を確立し接続が許可されてから処理を開始します。