前置き
MQTTを使ったシステムを設計する上でのトピックに関するベストプラクティスについて調べてみました。
個人的な調査なので、間違い、意見等ありましたらコメント頂けると幸いです。
MQTTの一般的な特徴
- まず初めに、把握しておくと良さそうな一般的な特徴を挙げておきます
- SubscriberはどのPublisherが送信したメッセージかを知らない
- ただし、トピックに識別子を含めることで知ることはできます(後述)
- Brokerからすべてのトピック一覧を取得することはできない
- BrokerはSubscriberのいないトピック(メッセージ)を捨ててしまう
- ただし、
retain
フラグを設定している場合を除く
- PublishしたメッセージをどのSubscriberがSubscribeしたかを知ることはできない
トピックのベストプラクティス
トピックの定義には気をつけると良いポイントがいくつかあるようです
先頭にスラッシュ(/
)をつけない
- mqttでは先頭のスラッシュは禁止(例:
/cmd/echo
,cmd/echo
)
小文字、数字、ダッシュ(-
)だけを使う
- トピックは小文字と大文字を区別しないため、小文字で統一する
- スペース(" ")はデバッグを困難にするので使わない
- スペースの代わりにダッシュ(
-
)を使う - 日本語は
右に行くほど、狭域になるようにする
- トピックは左から右へ読まれるため、広域(一般的)なものから狭域(特徴的)なものへと流れるようにする
- 例えば自宅の庭のラズパイ101の温度を表すメッセージの場合
myhouse/garden/raspy101/temperature
できるだけ短く、簡潔にする
- 組み込みデバイスなどのリソースの小さいデバイスにも使われるため、トピックはできるだけ短くする
- 使われるメッセージのみを含める
識別子を含める
- 特定のデバイスのメッセージのみ取得したい場合やSubscriberがPublisherを把握したい場合などに有用であるため
- デバイス名、IDなどをトピックに含める
スケーラビリティに気をつかう
- 例えば、新たなセンサー、デバイスを追加するとき
- 新たな機能を追加するとき
- トピック全体の構成が変わらないように気を使います
ワイルドカードを使う
- Subscribeするときなど、トピックに2種類のワイルドカードが使えます
- 一階層の場合は
+
- 例:
myhouse/garden/+/temparature
の場合-
myhouse/garden/raspy101/temparature
-
myhouse/kitchen/raspy101/temparature
-
myhouse/garden/raspy101/humidity
-
- 例:
- 複数階層の場合は
#
- 例:
myhouse/#/temparature
の場合-
myhouse/garden/raspy101/temparature
-
myhouse/kitchen/raspy202/temparature
-
myoffice/raspy101/temparature
-
- 例:
#でSubscribeしない
- 上記で登場したワイルドカード
#
を使うと、Brokerを経由するすべてのメッセージをSubscribeできるが、 - Subscribeするクライアントに大きな負荷がかかるため、使わない
- すべてのメッセージを確認したい場合はBrokerにプラグインを設定する
- 例としてHiveMQがあるそうです(使ったことありません)
$
で始まるトピック
-
$
で始まるトピックはBrokerの内部状態のために占有されているので、Publishできない。 - また、
#
でも$
で始まるトピックはSubscribeされない - 標準化されていないため、実装によって仕様が異なる。
$SYS/
で始まるトピックのみ共通で使われる。- 例: mqttのGithubに書かれている
まとめ
- 一般的に言えることを書いたつもりですが、用途によってはこれに該当しない場合もあると思われます。
参考
- https://mqtt.org/
- https://www.hivemq.com/blog/mqtt-essentials-part-5-mqtt-topics-best-practices/
- https://docs.aws.amazon.com/whitepapers/latest/designing-mqtt-topics-aws-iot-core/mqtt-design-best-practices.html
- https://www.hivemq.com/extension/mqtt-message-log-extension/
- https://pi3g.com/2019/05/29/mqtt-topic-tree-design-best-practices-tips-examples/