Taste of Tech Topics

Acroquest Technology株式会社のエンジニアが書く技術ブログ

MQTT Broker比較~機能比較編

こんにちは、ツカノ(@)です。

このところ IoT(Internet of Things)関連のニュースを目にすることが増えました。
最近であればPepper君の一般販売などが大きなニュースでしたが、
システムの足回りが大好きな自分としては、IoTと言えば、そう、MQTTですね!(強引!)
f:id:acro-engineer:20150618200645p:plain

Googleトレンドで調べてみたら、こんな感じでした。ここ1-2年で急速に伸びていますね。
f:id:acro-engineer:20150619070315p:plain

MQTTは、Message Queue Telemetry Transport の略ですが、Pub/Sub型モデルのメッセージキュー"プロトコル"であり、MQ(Message Queue)と言いつつ、メッセージを蓄積はしないんですよね。よく勘違いされる点なので、注意が必要です。

MQTTの詳しい説明は、以下のサイトが参考になります。


さて、そんなMQTTですが、メッセージをやり取りするには、仲介役となる MQTT Broker が必要になります。
OSSの MQTT Broker も多く登場してきているのですが、それぞれ実装されている仕様も異なっているため、利用時には注意が必要です。

そこで、自分としてもどのような差分があるのか知りたくなり、代表的なOSSの MQTT Broker について調査してみました。

MQTTの参照実装と言われる Mosquitto をはじめとして、利用されるケースが多い、Apollo、RabbitMQ、eMQTTD、Mosca について機能比較を行いました。


その結果が以下の表です(○:対応あり、×:対応なし)。

Broker(version) 開発言語 対応しているMQTT version QoSレベル Retain Will WebSocket UI 冗長化
Mosquitto(1.4.2) C MQTT 3.1/3.1.1 0,1,2 × ×
Apollo(1.7.1) Java MQTT 3.1 0,1,2 ×
RabbitMQ(3.5.3) Erlang MQTT 3.1 0,1 × ×
Mosca(0.29.0) Node.js MQTT 3.1 0,1 × × ×
eMQTTD(0.8.6-beta) Erlang MQTT 3.1/3.1.1 0,1,2 ×
VerneMQ(0.9.4) Erlang MQTT 3.1/3.1.1 0,1,2 ×

Brokerのversionは調査時のものです。


以下、今回比較した観点について、簡単に説明します。

  • MQTT 3.1と3.1.1の違いは以下に解説されています。3.1.1では、曖昧な点の仕様を明確にしたり、Client IDのサイズ拡張等が行われています。
  • QoS(Quality of Service)はメッセージ配信に関する品質保証のレベルで、以下の3段階存在します。
    • QoS 0: At most once - 最高1回配信します。(1回も配信されない可能性があります)
    • QoS 1: At least once - 少なくとも一回配信します。(2回以上配信される可能性があります)
    • QoS 2: Exactly once - 正確に一回配信します。
  • Retainに対応していると、トピックにSubscribeしたときに、最新のメッセージが配信されます。
  • Willは「Last Will and Testament」のことで、Publisherが切断した際に予め決めておいたメッセージを、Subscriberに配信する流す仕組みがあります。
  • WebSocketは、MQTTのメッセージをWebSocketのプロトコルを使って配信できるかどうかです。
  • UIは、Brokerの管理画面などがUIで提供されているかどうか表します。Webブラウザを使って管理できると便利ですよね。


各Brokerに対して寸評を書くと。。。

  • Mosquitto
    • 冗長化が無いものの(MQTTの仕様上は、冗長化は必要ありません)、参照実装だけあって、QoSやretain等の仕様は全て対応されています。
  • Apollo
    • 機能的には良いのですが、動作をさせてみたところ、MQTTのメッセージのヘッダが標準と多少異なるようで、MQTTクライアントのAPIの種類によっては、Subscribeできないケースがありました。
  • RabbitMQ
    • 以前から普通のMQとして利用することも多かったので、期待していたのですが、未だに、QoS=2に対応していなかったり、retainに対応していなかったり(開発は進んでおり、v3.6.0で対応する予定があるようです)する点は、残念な状況です。
  • Mosca
    • MQTTとしての機能は不足している感じがします。ただし、MoscaはStandaloneでもEmbedded(他アプリ内で動作する)でも動作する、という特徴があります。
  • eMQTTD
    • クラスタ構成を組むことができるため、冗長化にも対応しており、機能的には良いですね。現在、バージョンアップも頻繁に行われています。
    • ただ、次回紹介しますが、性能が他Brokerに追いついていないところがあり、そこは今後に期待ですね。
  • VerneMQ
    • 直近の2015年5月に、最初のリリースが行われましたが、MQTTの仕様も網羅されている上に、クラスタ構成にも対応しているため、OSSのMQTT Brokerとしてはかなり有力候補となるプロダクトですね。
    • ドキュメントも充実して分かりやすいです。


また、今回はそのままインストールして利用するのではないため、比較の対象からは外していますが、750,000 Messages/sec を達成したという、Goで実装された SugeMQ (MQTT Broker/Client ライブラリ、という位置づけ)なんかもあったりします。


バージョンが変わると、また状況は変わってくるかもしれませんが、MQTT Broker を利用する際の参考なれば、と思います。
#できれば、商用の MQTT Broker も対象にしたかったのですが、それはまた今度の機会に。

次回はこれらの MQTT Broker に対して、皆さん気になるベンチマークした結果を紹介したいと思います!


2015/06/26 更新
MQTT Brokerの動きも早く、短期間の内にバージョンアップされていたり、新しいBrokerが登場していました。
それらに関してコメントを頂いたため、内容を更新しました。

  • 調査対象のバージョンを、2016/06/26時点で最新のものに更新しました。
  • Will、WebSocket の項目を追加しました。
  • 調査対象にVerneMQを追加しました。

Acroquest Technologyでは、キャリア採用を行っています。


  • 日頃勉強している成果を、Hadoop、Storm、NoSQL、HTML5/CSS3/JavaScriptといった最新の技術を使ったプロジェクトで発揮したい。
  • 社会貢献性の高いプロジェクトに提案からリリースまで携わりたい。
  • 書籍・雑誌等の執筆や対外的な勉強会の開催を通した技術の発信や、社内勉強会での技術情報共有により、技術的に成長したい。
  • OSSの開発に携わりたい。

 
少しでも上記に興味を持たれた方は、是非以下のページをご覧ください。
 キャリア採用ページ