HTTPとの対比から学ぶMQTT

Maker Faire TokyoでMQTTを使ったものを展示したが、自分もMaker Faire Tokyoで展示物を作成する前はMQTTについて知らなかった。知り合いのエンジニアに聞いてみても知らない人が多く、基本的なことが中心だが自分なりにまとめてみた。

MQTTとは

簡単な概要であるが、MQTTはMessage Queuing Telemetry Transportと呼ばれる1990年代にIBMが開発したプロトコルである。 通信のプロトコルとしては普段我々がWebで使っているHTTPがメジャーであるが、MQTTはIoTデバイスを中心に広く利用されている。

特徴

特徴は次の3つになる。

  • 非同期通信
  • 1対多、多対多
  • 軽い

非同期通信

MQTTは非同期通信となっている。 HTTPは同期通信であり、この点でまず異なっている。 同期通信は、クライアントが問い合わせ先のサーバへリクエストを発行し、それに対するレスポンスを待つ通信である。 このHTTPのリクエスト/レスポンスの動作が、日頃から使っているWebブラウザは対応できるがIoTデバイスには対応することが難しいのである。 理由は2つあり、我々が普段使っている環境のようにネットワークが安定しているとは限らないこととIoTデバイスが使う通信の帯域幅に制限があるからである。 非同期通信であれば、送る側と受け取り側が相手の反応を待っている必要がないため、IoTにおいては広くMQTTが採用されている。MQTTにおいて非同期通信を実現するために働いているのが「パブリッシャー」「サブスクライバー」「ブローカー」である。

パブリッシャー / サブスクライバー / ブローカー

通信における登場人物は、送る側の「パブリッシャー」、受け取り側の「サブスクライバー」、パブリッシャーとサブスクライバーの仲介をする「ブローカー」である。

f:id:yoshitaku_jp:20190827192450p:plain

通信の流れは、最初にセンサーデータなどを送る側のパブリッシャーが仲介役のブローカーに対してデータを送る。次に受け取る側のサブスクライバーは仲介役のブローカーに対してセンサーデータが届いているか確認しにいく。センサーデータがあれば、その情報を受け取るという流れである。

ここではクライアントとサーバが直接やり取りをしているHTTPとは違い、パブリッシャーとサブスクライバーがブローカーを介している部分が重要である。

1対多、多対多

MQTTは1対多、多対多の通信をおこなえるプロトコルである。 HTTPは1対1の通信をおこなうプロトコルであり、この点で異なっている。 非同期通信の項でも書いたが、クライアントが問い合わせ先のサーバからのレスポンスを待ちデータを受け取る通信であるため、1対1となる。 IoTデバイスは大量のデバイスに対して通信をおこなう場合があり、1対1のHTTPは適しているとは言えない。 そこで仲介役のブローカーにパブリッシャーとサブスクライバーがアクセスしていることを利用し、ブローカー内でメッセージの格納先を決めて1対多、多対多を実現している。 このメッセージの格納先のことをトピックと呼ぶ。

トピック

MQTTは「トピック」でブローカー内でのメッセージの格納先を決めている。 トピックは/(スラッシュ)で階層化をおこない、特定のメッセージだけを操作するように指定できる柔軟性を備えている。

f:id:yoshitaku_jp:20190827192522p:plain

階層化なので、抽象的な粒度から具体的にする。 簡単ではあるが例をあげておく。

/OS
/OS/Ubuntu
/OS/Ubuntu/18.04.3
/OS/Ubuntu/16.04.6
/OS/CentOS
/OS/CentOS/6
/OS/CentOS/7
/IoT
/IoT/RaspberryPi
/IoT/RaspberryPi/3ModelB+
/IoT/RaspberryPi/Zero
/IoT/Arduino
/IoT/Arduino/Nano
/IoT/Arduino/Yun

また、1対多、多対多と書いたがメッセージを置くトピックにはワイルドカードが使える。 /IoT/*とすれば、/IoT/RaspberryPi/IoT/Arduino配下のすべてのものにメッセージを送信でき、/IoT/RaspberryPi/*とすれば、/IoT/RaspberryPi/3ModelB+/IoT/RaspberryPi/Zeroに送信できる。

軽い

MQTTのデータ通信量が軽いことについて説明しようとしたが、自分がやりたかった調査を非常にわかりやすくかつ具体的な数字で解説されているページを見つけたのでリンクを貼らせてもらう。

www.ydc.co.jp

また、消費電力とデータサイズの軽さについて調べている記事もあったのでリンクを張っておく。

qiita.com

まとめ

MQTTについてまとめた。 比較対象にHTTPを使ったことでHTTPについても学ぶことができたし、自分の中で適切な棲み分けが意識できるようになった。 MQTTについて学んだことの整理と、知らない人に対してどう説明したら良いか考えるきっかけになった。

参考

https://kfep.jp/solution/iot-mqtt/mqtt

https://www.ibm.com/developerworks/jp/iot/library/iot-mqtt-why-good-for-iot/index.html

https://qiita.com/darai0512/items/37158f56e9a6b4ce83ed

http://tech-blog.rakus.co.jp/entry/20180912/mqtt/iot/beginner

https://gist.github.com/voluntas/e0a90f3e22316144ed3a

https://blogs.akamai.com/jp/2019/06/iot---iot-egge-connect--.html

https://amg-solution.jp/blog/15787

https://monoist.atmarkit.co.jp/mn/articles/1606/01/news017.html