RabbitMQとは
RabbitMQ(ラビットエムキュー)は、Advanced Message Queuing Protocol(AMQP)を使用した、オープンソースのメッセージ指向ミドルウェアである。 RabbitMQ Serverは、Erlang言語で記述されており、クラスタリングとフェイルオーバーのためにOpen Telecom Platformフレームワークで構築されている。*1
GitHub
Install Erlang
RabbitMQはErlangが使われているため、まずErlangをインストールする。
$ wget http://packages.erlang-solutions.com/erlang-solutions-1.0-1.noarch.rpm $ rpm -Uvh erlang-solutions-1.0-1.noarch.rpm $ yum install erlang # Verify your installation of Erlang $ erl Erlang/OTP 20 [RELEASE CANDIDATE 2] [erts-9.0] [source] [64-bit] [smp:1:1] [ds:1:1:10] [async-threads:10] [hipe] [kernel-poll:false] Eshell V9.0 (abort with ^G) 1>
Install RabbitMQ
$ wget http://www.rabbitmq.com/releases/rabbitmq-server/v3.6.10/rabbitmq-server-3.6.10-1.el7.noarch.rpm $ rpm --import https://www.rabbitmq.com/rabbitmq-signing-key-public.asc $ yum install rabbitmq-server-3.6.10-1.el7.noarch.rpm
start the RabbitMQ server
$ systemctl start rabbitmq-server.service $ systemctl enable rabbitmq-server.service # check the status of RabbitMQ $ rabbitmqctl status # Enable and use the RabbitMQ management console $ rabbitmq-plugins enable rabbitmq_management $ chown -R rabbitmq:rabbitmq /var/lib/rabbitmq/
add an user
- {username}: new user’s name
- {pw} : the new user’s password
$ rabbitmqctl add_user #{username} #{pw} $ rabbitmqctl set_user_tags #{username} administrator $ rabbitmqctl set_permissions -p / #{username} ".*" ".*" ".*"
visit the RabbitMQ Management tool via web browser
http://[your-rabbitMQ-server-IP]:15672/
問題なければ以下のログイン画面が表示される。
先ほど作成したusername, passwordの組み合わせでログインすることができる。
ここからTutorial
rubyで Pub/Sub を試す。以下の流れ。
- クライアント(Subscriber)1, 2は、"logs" チャネルをSubscribeする。
- クライアント3(Publisher)から"logs" チャネルへメッセージをpublishする。
- クライアント1,2 でクライアント3から発信されたメッセージを受信できることを確認する。
install bunny via gem
$ yum install rubygems
$ gem install bunny --version ">= 2.6.4"
create a receive_logs.rb
#!/usr/bin/env ruby # encoding: utf-8 require "bunny" conn = Bunny.new(:automatically_recover => false) conn.start ch = conn.create_channel x = ch.fanout("logs") q = ch.queue("", :exclusive => true) q.bind(x) puts " [*] Waiting for logs. To exit press CTRL+C" begin q.subscribe(:block => true) do |delivery_info, properties, body| puts " [x] #{body}" end rescue Interrupt => _ ch.close conn.close exit(0) end
create emit_log.rb
#!/usr/bin/env ruby # encoding: utf-8 require "bunny" conn = Bunny.new(:automatically_recover => false) conn.start ch = conn.create_channel x = ch.fanout("logs") msg = ARGV.empty? ? "Hello World!" : ARGV.join(" ") x.publish(msg) puts " [x] Sent #{msg}" conn.close
クライアント1, 2それぞれを購読状態にする
$ ruby receive_logs.rb [*] Waiting for logs. To exit press CTRL+C
クライアント3(Publisher) からメッセージを送信する
$ ruby emit_log.rb [x] Sent Hello World! $ ruby emit_log.rb 'this is test message!' [x] Sent this is test message!
すると、クライアント2, 3の画面上に、メッセージが表示(受信)される
$ ruby receive_logs.rb [*] Waiting for logs. To exit press CTRL+C [x] Hello World! [x] this is test message!