通信

ネットワークに接続されたモノ同士で通信するM2M(Machine-to-Machine)やモノがインターネットと繋がって通信するIoT(Internet of Things)が注目される近年、容量を抑えながら多数のデータをやり取りする通信でプロトコル「MTTQ」が活用され始めています。

本記事ではMTTQにおける3段階のQoSとユースケースを紹介します。

MQTTとは

MQTT(Message Queue Telemetry Transport)は、1999年にIBM社とEurotech社のメンバーにより考案されたプロトコルです。2014年にはOASISによって正式な標準規格とされました。

HTTPと比べて軽量で、ヘッダサイズは最小2バイトと小さく、バッテリーの消費を抑えたい製品や帯域幅が限られているネットワーク環境にも利用できます。

また、非同期に双方向やグループでの通信ができるため、パフォーマンスやスケーラビリティーにも優れています。

参考:MQTT.org「MQTT」

Publish/Subscribe型モデル

MQTTはPublish/Subscribe型のメッセージングモデルを採用しています。

Publish/Subscribモデルでは、メッセージの送信側をPublisher(パブリッシャー)、メッセージの受信側をSubscriber(サブスクライバー)と呼び、brokerと呼ばれるMQTTサーバーが間に入ってメッセージを扱います。PublisherとSubscriberは直接繋がらないのが特長です。

MQTTについては「MQTTとは?通信モデル・HTTPとの比較・利用メリット・実用例を紹介」の記事でも解説しています。こちらもぜひご覧ください。

MQTTのQoSについて

通信

QoSとはQuality of Serviceのことで、直訳すると「サービス品質」です。MQTTでは、アプリケーションメッセージの到達保証レベルを表します。

MQTTのメッセージ送受信には3段階のレベルとして「At most once」、「At least once」、「Exactly once」があります。

QoSレベル0:At most once

メッセージを1回受信するか、まったく受信しないかのどちらかになります。受信側はメッセージを受け取っても応答はせず、送信側はメッセージの保存や再送を行ないません。

最も速い転送モードですが、クライアントが切断されたりサーバーで障害が発生しているケースではメッセージが失われる可能性があります。

QoSレベル1:At least once

メッセージを最低1回は受信する転送モードです。

送信側が受信側からの応答を指定時間内に確認できないときは、受信側に同じメッセージを再送信します。その場合、受信側での処理が複数発生し、複数のメッセージを受信する可能性があります。

メッセージは処理されるまで送信側と受信側でローカルに保管されます。受信側で処理が終わると受信側で削除され、送信側に応答を送信します。そして、送信側が受信側からの応答を受信した後、そのメッセージは送信側からも削除されます。

QoSレベル2:Exactly once

メッセージが損失及び重複なく送信されます。少なくとも2回のセッションが発生するため、QoS1と比較してオーバヘッドが増加します。

1回目のセッション
送信側はメッセージを保存し、PUBLISHパケットでメッセージを送信します。
受信側は、PUBLISHパケットを受信したら、そのパケットIDを保存します。また、そのパケットIDをPUBRECパケットに設定して送信します。
送信側は、PUBRECパケットを受信したら、メッセージを破棄しPUBRECパケットのパケットIDを保存します。規定時間内にPUBRECパケットを受信しない場合、PUBLISHパケットでメッセージを再送します。

2回目のセッション
送信側は、PUBRECパケットを受信した後、パケットIDを設定したPUBRELパケットを送信します。
受信側は、PUBRELパケットを受信したら、そのパケットIDをPUBCOMPパケットに設定して送信します。また、そのパケットIDは破棄します。
送信側は、PUBCOMPパケットを受信したら、パケットをIDを破棄します。

QoS2の場合、以上の2セッションによって、アプリケーションメッセージのやり取りが完了します。
受信側は、PUBRELパケットを受信していない状態で、再度PUBLISHパケットでメッセージを受信した場合、重複して受信したと判断することができます。

送信 MQTT Control Packet 受信
①メッセージを保存
②PUBLISHパケットでメッセージを送信 ③PUBLISHパケットを受信
⑤PUBRECパケットを受信 ④受信したパケットIDをPUBRECパケットに設定して送信
⑥メッセージを破棄しPUBRECパケットのパケットIDを保存
⑦パケットIDを設定したPUBRELパケットを送信 ⑧PUBRELパケットを受信
⑩PUBCOMPパケットを受信したら、パケットをIDを破棄 ⑨パケットIDをPUBCOMPパケットに設定して送信
(送信後、パケットIDを破棄)

参考:IBM「MQTT クライアントによって提供されるサービス品質」
参考:TCSC株式会社「MQTTのQoS (Quality of Service) とは」

MQTTのQoSレベルの使い分け

QoSレベルには3段階あることを紹介しました。自身が採用する際にどのレベルを選べばよいか分からない方は、下記を参考にしてみてください。

QoSレベル0の使用が想定されるケース
  • クライアントとサーバーのネットワークが非常に安定している
  • メッセージが失われる可能性を許容できる
QoSレベル1の使用が想定されるケース
  • すべてのメッセージを取得する必要があり、重複した場合に処理できる
  • QoS2にする場合の遅さが気になる
QoSレベル2の使用が想定されるケース
  • 重複配信によってアプリケーションユーザーやサブスクリプションクライアントに損害を与えることのないようにする
  • インタラクションが完了するまでに時間がかかっても問題ない
  • 金融機関、消防、航空などの業界でデータを正確に1回だけ受け取る必要がある

参考:HiveMQ「What is MQTT Quality of Service (QoS) 0,1, & 2? 」
参考:TCSC株式会社「MQTTのQoS (Quality of Service) とは」

まとめ

今後ますます取り扱うデータ量が増えてくるであろう企業活動において、ユースケースに応じたMQTTのQoSを考える重要性は高まってくると予想できます。レベルを検討する際などに、本記事が参考になれば幸いです。

また、短時間で小さいデータを高頻度でやりとりするIoTでMQTT通信が活用される事例などを紹介している記事「MQTTとは?通信モデル・HTTPとの比較・利用メリット・実用例を紹介」もご用意しています。MQTTに興味のある方はこちらもぜひご覧ください。