Webinar
Unify industrial data with EMQX Platform and TDengine | Register Now →

トピックエイリアス - MQTT 5.0の新機能

Jim Moen
Oct 17, 2024
トピックエイリアス - MQTT 5.0の新機能

MQTT v3.1およびv3.1.1と比較して、MQTT v5はさらに多くの新機能を提供しています。これらの機能を理解しやすい方法で紹介し、開発への影響について議論します。既にMQTT v5の新機能についていくつか議論しましたが、今日はトピックエイリアスについて引き続き説明します。

トピックエイリアスとは

トピックエイリアスを使用すると、ユーザーは長くて繰り返し使用される可能性のあるトピック名を2バイトの整数に短縮できるため、メッセージを発行する際の帯域幅消費を削減できます。

この2バイトの整数は、PUBLISHパケットのバリアブルヘッダー内の属性フィールドとしてエンコードされます。また、これはCONNECTおよびCONNACKパケット間でクライアントとブローカー間で交換されるトピックエイリアス最大値によって制限されます。この制限が超えられない限り、任意のトピック名を1つの整数に短縮できます。

なぜトピックエイリアスを使用するのか

MQTT v3プロトコルでは、クライアントが同じトピックに大量のメッセージを(同じMQTT接続上で)発行する必要がある場合、トピック名がすべてのPUBLISHパケットで繰り返し使用されるため、帯域幅資源の無駄遣いが発生します。同時に、同じトピック名のUTF-8文字列を毎回解析することは、サーバーの計算資源の無駄遣いとなります。

例えば、センサーが場所Aから固定頻度で温度と湿度を報告するとします。温度メッセージごとにトピック/location/A/temperature(23バイト)に、湿度メッセージごとにトピック/location/A/humidity(20バイト)に発行します。トピックエイリアスを使用しない場合、最初に発行されたメッセージ以降、各PUBLISHパケットはトピック名(合計53バイト)を接続を通じて何度も送信する必要があります。また、ブローカーは場所トピックを繰り返し解析する必要があります。

このように、MQTT v5.0でトピックエイリアス機能を導入する主な目的は、ネットワークリソースとCPUリソースの両方でリソース消費を削減することです。

トピックエイリアスの使用方法

トピックエイリアスのライフサイクルとスコープ

トピックエイリアスはクライアントとサーバーそれぞれによって管理され、ライフサイクルとスコープは現在の接続に限定されます。接続が切断された後にトピックエイリアスを再度使用する必要がある場合、トピックエイリアス <=> トピック名のマッピング関係を再構築する必要があります。

トピックエイリアス最大値

MQTTクライアントやサーバーがトピックエイリアスを使用し始める前に、現在の接続で許可されるトピックエイリアスの最大数について合意する必要があります。この情報の交換はCONNECTパケットとCONNACKパケットで行われます。Topic Alias MaximumCONNECTおよびCONNACKパケットのバリアブルヘッダー内のメッセージ属性としてエンコードされます。

Set MQTT Topic Alias Maximum mutually

トピックエイリアス最大値を相互に設定

クライアントのCONNECTパケット内のTopic Alias Maximumは、サーバーがこの接続で使用できるトピックエイリアスの最大数を示します。同様に、サーバーが送信するCONNACKパケット内の値は、現在の接続で相手側(クライアント)が使用できるトピックエイリアスの最大数を示します。

トピックエイリアスは1からTopic Alias Maximumまでの範囲です。相手側にトピックエイリアスの使用を禁止するには、Topic Alias Maximum0に設定します。

トピックエイリアスの作成と使用

クライアント(またはサーバー)がPUBLISHパケットを送信する際、バリアブルヘッダーの属性に0x23の値を持つ1バイトの識別子を使用して、次の2バイトがトピックエイリアス番号であることを示すことができます。

ただし、トピックエイリアス番号は0であってはならず、また、サーバー(クライアント)が送信するCONNACKCONNECT)パケットで設定されたTopic Alias Maximumを超えてはなりません。

トピックエイリアスと非空のトピック名を持つPUBLISHパケットを受信すると、受信側はトピックエイリアスとトピック名との間にマッピング関係を確立します。その後、このマッピング関係を使用して、2バイトの長さを持つトピックエイリアスを使用してメッセージを発行することができ、受信側は以前に構築されたトピックエイリアス <=> トピック名のマッピング関係を使用してメッセージのトピックを見つけます。

このようなマッピングはそれぞれのエンドで独立して管理されるため(すなわち、必ずしも同一である必要はありません)、クライアントとサーバーは同じエイリアス番号を使用して異なるトピックに発行することができます。

MQTT client and broker manage their aliases respectively

MQTTクライアントとブローカーはそれぞれエイリアスを独自に管理

未知のトピックエイリアスの使用

PUBLISHパケット内で使用されているトピックエイリアスが以前に作成されていない、つまり受信側が現在のトピックエイリアスとトピック名とのマッピング関係を構築していない場合、かつこのメッセージのバリアブルヘッダー内のトピック名フィールドが空の場合、受信側はREASON_CODE0x82DISCONNECTパケットを送信して接続を閉じる必要があります。

Unknown topic alias

未知のトピックエイリアス

トピックエイリアスの再作成

既に構築されたエイリアスとトピック名のマッピングは、新しいトピックエイリアスと非空のトピック名を持つ新しいPUBLISHパケットで再構築することができます。

以下の図の例では、以前に温度トピックに使用されていたトピックエイリアス123が、湿度トピックを表すように更新されています。

MQTT client and broker recreate topic aliases

MQTTクライアントとブローカーはトピックエイリアスを再作成

結論

MQTT v5の新機能であるトピックエイリアスは、pub-subメッセージングモデルをより柔軟に使用する方法を提供します。特に、大量に、限られたセットのトピックに対して繰り返し発行されるメッセージに対して、トピックエイリアスはネットワークリソースと計算資源の両方を効果的に節約することができます。

専門家と話します
お問い合わせ →