どうも、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 からも確認してみましょう。
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
とメッセージ、そして retain
を boolean
で指定します。この retain
が true
の場合には最後に 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 を試してみましょう。
publish.rb
を実行すると上の二つの Subscriber がメッセージを取得している様子です。(※publish.rb
は loop
メソッドでループさせています)
この時の RabbitMQ の状態を確認してみましょう。
Channels です。Channel とはざっくり言うと…土管の中に這わされた LAN ケーブルみたいなものでしょうか…AMQP 内の技術仕様の一つで TCP/IP のコネクション内で複数の Channel(又は Session)を利用してキューメッセージをやりとりします。
Queues です。
Subscribe のスクリプトを停止すると Queues のリストから Subscriber は消えます。
と書いていますが RabbitMQ というか AMQP についてはちゃんと勉強する必要がありそうです。こちら「AMQP v1.0 ドキュメンテーション」は読んだほうが良さそうです…。
おつかれさんでした
久しぶりに RabbitMQ ってことで mqtt プラグインで触ってみました。
Hello World 的な内容で恐縮ですが、実際にスクリプトを動かしてみると RabbitMQ の動きを改めて確認することが出来たと思います。ただし、AMQP の用語や仕様についてはちゃんと勉強せにゃあかんなと…次は Raspberry Pi で動かしてみようかなと思っていますねん。
おやすみなさい。
元記事はこちらです。
「RabbitMQ の mqtt プラグインを Ruby で試した」