どうも、cloudpack の ラビットかっぱ@inokara)です。

はじめに

久しぶりに RabbitMQ が自分の中で熱くなってきているので mqtt プラグインと合わせて使ってみましたのでメモ。


出演者

RabbitMQ

  • AMQP を使用したメッセージキューを扱うミドルウェア
  • Erlang で記述されている
  • OTP フレームワークで構築されている

Erlang や OTP についてはこちらの「Introduction | Learn You Some Erlang for Great Good!」が詳しく書かれているので読んでみたいと思います。

mqtt

こちらの「MQTTについてのまとめ」に詳しく書かれておりとても参考になりました。
内容を個人的に簡単に要約すると…

  • MQ Telemetry Transport
  • pub/sub モデルの軽量なメッセージプロトコル
  • メッセージ配信に特化している
  • 沢山の pub/sub を扱う場合に使われている(リアルタイム通信が必要な時等)
  • センサーデバイスからのデータ収集
  • Facebook Messenger 等のメッセージサービス

mqtt は以下のような特徴があります。

  • 固定長で 2 バイト(オーバーヘッド小)
  • 1 対多、多対多のメッセージ配布
  • 三つの QoS を選択可能(「最高一回」、「少なくとも一回」、「正確に一回」)

等…詳細は上記の参考記事「MQTTについてのまとめ」を御覧ください。有難うございます!


RabbitMQ の mqtt プラグイン

みんな大好き RabbitMQ

RabbitMQ には mqtt プラグインが用意されていますので、RabbitMQ がインストールされていれば直ぐに mqtt を試してみることが出来ました。

RabbitMQ のインストール

RabbitMQ は Amazon Linux 上にセットアップします。

sudo yum --enablerepo=epel install rabbitmq-server

mqtt プラグインのインストール

これも簡単です。
root 権限で以下のように実行します。

/usr/lib/rabbitmq/bin/rabbitmq-plugins enable rabbitmq_mqtt

ついでに Web UI プラグインも用意します。

/usr/lib/rabbitmq/bin/rabbitmq-plugins enable rabbitmq_management

インストール済みのプラグインを確認します。

/usr/lib/rabbitmq/bin/rabbitmq-plugins list

以下のように表示されます。

[e] amqp_client                       3.1.5
[ ] cowboy                            0.5.0-rmq3.1.5-git4b93c2d
[ ] eldap                             3.1.5-gite309de4
[e] mochiweb                          2.7.0-rmq3.1.5-git680dba8
[ ] rabbitmq_amqp1_0                  3.1.5
[ ] rabbitmq_auth_backend_ldap        3.1.5
[ ] rabbitmq_auth_mechanism_ssl       3.1.5
[ ] rabbitmq_consistent_hash_exchange 3.1.5
[ ] rabbitmq_federation               3.1.5
[ ] rabbitmq_federation_management    3.1.5
[ ] rabbitmq_jsonrpc                  3.1.5
[ ] rabbitmq_jsonrpc_channel          3.1.5
[ ] rabbitmq_jsonrpc_channel_examples 3.1.5
[E] rabbitmq_management               3.1.5
[e] rabbitmq_management_agent         3.1.5
[ ] rabbitmq_management_visualiser    3.1.5
[E] rabbitmq_mqtt                     3.1.5
[ ] rabbitmq_shovel                   3.1.5
[ ] rabbitmq_shovel_management        3.1.5
[ ] rabbitmq_stomp                    3.1.5
[ ] rabbitmq_tracing                  3.1.5
[e] rabbitmq_web_dispatch             3.1.5
[ ] rabbitmq_web_stomp                3.1.5
[ ] rabbitmq_web_stomp_examples       3.1.5
[ ] rfc4627_jsonrpc                   3.1.5-git5e67120
[ ] sockjs                            0.3.4-rmq3.1.5-git3132eb9
[e] webmachine                        1.10.3-rmq3.1.5-gite9359c7

ついでに Web UI からも確認してみましょう。

RabbitMQ の mqtt プラグイン: Web UI で動作確認


Ruby から mqtt を触ってみる

gem

Ruby から mqtt を弄るには gem の mqtt を利用します。

インストールは簡単です。

sudo gem install mqtt --no-ri --no-rdoc -V

インストールできたところでこちら「njh/ruby-mqtt」と「MQTTを試してみる」を参考に pub/sub の簡単な動作確認をしてみます。

publish

以下のようなスクリプトを作ります。

#!/usr/bin/env ruby

require 'mqtt'

host = '${RABBITMQ_HOST}'
port = 1883

client = MQTT::Client.connect(:remote_host => host, :remote_port => port,
                     :username => 'user', :password => 'pass')
client.publish('test', 'Hello, mqtt', retain=false)

client クラスを生成して publish メソッドで topic とメッセージ、そして retainboolean で指定します。この retaintrue の場合には最後に publish されたメッセージを保存するようになるので異なる subscriber がメッセージを subscribe することが出来るようになります。

subscribe

以下のようなスクリプトを作ります。

#!/usr/bin/env ruby

require 'mqtt'

host = '${RABBITMQ_HOST}'
port = 1883

client = MQTT::Client.connect(:remote_host => host, :remote_port => port,
                     :username => 'user', :password => 'pass')

client.get('test') do |topic,message|
  puts "#{topic}: #{message}"
end

client クラスの get メソッドでキューインされたメッセージを取得します。

パブサブ

早速 pub/sub を試してみましょう。

RabbitMQ の pub/sub を確認する

publish.rb を実行すると上の二つの Subscriber がメッセージを取得している様子です。(※publish.rbloop メソッドでループさせています)

この時の RabbitMQ の状態を確認してみましょう。

Channels です。Channel とはざっくり言うと…土管の中に這わされた LAN ケーブルみたいなものでしょうか…AMQP 内の技術仕様の一つで TCP/IP のコネクション内で複数の Channel(又は Session)を利用してキューメッセージをやりとりします。

RabbitMQ の Channels を確認する

Queues です。

RabbitMQ の Queues を確認する

Subscribe のスクリプトを停止すると Queues のリストから Subscriber は消えます。

と書いていますが RabbitMQ というか AMQP についてはちゃんと勉強する必要がありそうです。こちら「AMQP v1.0 ドキュメンテーション」は読んだほうが良さそうです…。


おつかれさんでした

久しぶりに RabbitMQ ってことで mqtt プラグインで触ってみました。

Hello World 的な内容で恐縮ですが、実際にスクリプトを動かしてみると RabbitMQ の動きを改めて確認することが出来たと思います。ただし、AMQP の用語や仕様についてはちゃんと勉強せにゃあかんなと…次は Raspberry Pi で動かしてみようかなと思っていますねん。

おやすみなさい。

元記事はこちらです。
RabbitMQ の mqtt プラグインを Ruby で試した