トピックエイリアス - 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 Maximum
はCONNECT
およびCONNACK
パケットのバリアブルヘッダー内のメッセージ属性としてエンコードされます。
クライアントのCONNECT
パケット内のTopic Alias Maximum
は、サーバーがこの接続で使用できるトピックエイリアスの最大数を示します。同様に、サーバーが送信するCONNACK
パケット内の値は、現在の接続で相手側(クライアント)が使用できるトピックエイリアスの最大数を示します。
トピックエイリアスは1
からTopic Alias Maximum
までの範囲です。相手側にトピックエイリアスの使用を禁止するには、Topic Alias Maximum
を0
に設定します。
トピックエイリアスの作成と使用
クライアント(またはサーバー)がPUBLISH
パケットを送信する際、バリアブルヘッダーの属性に0x23
の値を持つ1バイトの識別子を使用して、次の2バイトがトピックエイリアス番号であることを示すことができます。
ただし、トピックエイリアス番号は0
であってはならず、また、サーバー(クライアント)が送信するCONNACK
(CONNECT
)パケットで設定されたTopic Alias Maximum
を超えてはなりません。
トピックエイリアスと非空のトピック名を持つPUBLISH
パケットを受信すると、受信側はトピックエイリアスとトピック名との間にマッピング関係を確立します。その後、このマッピング関係を使用して、2バイトの長さを持つトピックエイリアスを使用してメッセージを発行することができ、受信側は以前に構築されたトピックエイリアス <=> トピック名
のマッピング関係を使用してメッセージのトピックを見つけます。
このようなマッピングはそれぞれのエンドで独立して管理されるため(すなわち、必ずしも同一である必要はありません)、クライアントとサーバーは同じエイリアス番号を使用して異なるトピックに発行することができます。
未知のトピックエイリアスの使用
PUBLISH
パケット内で使用されているトピックエイリアスが以前に作成されていない、つまり受信側が現在のトピックエイリアスとトピック名とのマッピング関係を構築していない場合、かつこのメッセージのバリアブルヘッダー内のトピック名フィールドが空の場合、受信側はREASON_CODE
が0x82
のDISCONNECT
パケットを送信して接続を閉じる必要があります。
トピックエイリアスの再作成
既に構築されたエイリアスとトピック名のマッピングは、新しいトピックエイリアスと非空のトピック名を持つ新しいPUBLISH
パケットで再構築することができます。
以下の図の例では、以前に温度トピックに使用されていたトピックエイリアス123
が、湿度トピックを表すように更新されています。
結論
MQTT v5の新機能であるトピックエイリアスは、pub-subメッセージングモデルをより柔軟に使用する方法を提供します。特に、大量に、限られたセットのトピックに対して繰り返し発行されるメッセージに対して、トピックエイリアスはネットワークリソースと計算資源の両方を効果的に節約することができます。