イントロダクション
RabbitMQはメッセージブローカー。
メッセージを受け入れて転送する。
郵便局に例えることができる。
メールをポストにいれたら、最終的にRabbitMQが宛先にメールを届けてくれる。
下記の用語(登場人物)がある。それぞれは同一ホストに存在する必要はない。
Producer
メッセージを送信する人
Queue
メッセージを格納する郵便箱のようなもの。
ここにProducerがメッセージを投げ入れて、Consumerがメッセージを取りに来る。
Consumer
メッセージを受信する人
HelloWorld
rubyで2つの簡単なプログラムを作成する。
Produerが1つのメッセージを送信して、Consumerがメッセージを受信して表示する。
PがProducerでCがConsumer、QがQueue
|P| -> |Q| -> |C|
Bunyインストール
Bunyを使うのでインストールしておく必要がある。
$ gem install bunny --version ">= 2.6.4"
送信側
ProducerはRabbitMQに接続して一つのメッセージを送信して終了する。
Hello
|P| -> | Q |
最初にbunnyライブラリをrequireする
#!/usr/bin/env ruby
require 'bunny'
RabbitMQに接続する
コネクション接続を抽象化しプロトコルバージョンのネゴシエーション、認証などを行う。
下記の例は全てデフォルト設定でローカルマシンのブローカー(RabbitMQ)に接続する。
connection = Bunny.new
connection.start
異なるマシンのブローカー(RabbitMQ)に接続したければ、hostnameオプションを使う
connection = Bunny.new(hostname: 'rabbit.local')
connection.start
次にチャンネルを作成する。
API使用するのに必要な設定がされている。
channel = connection.create_channel
送信するキューを宣言して、キューにメッセージをパブリッシュする。
キューを宣言することは冪等であり、キューが存在しない場合のみ作成される
メッセージの内容はバイト配列なので、好きなものをエンコードすることができます。
queue = channel.queue('hello')
channel.default_exchange.publish('Hello World!', routing_key: queue.name)
puts " [x] Sent 'Hello World!'"
接続を閉じる
connection.close
受信側
Hello
| Q | -> |C|
send.rbと同じようにrequireする
#!/usr/bin/env ruby
require 'bunny'
設定はProducerと同じ。
コネクションとチェンネルを開き、コンシュームするキューを宣言する。
connection = Bunny.new
connection.start
channel = connection.create_channel
queue = channel.queue('hello')
キューからメッセージを受信する。
begin
puts ' [*] Waiting for messages. To exit press CTRL+C'
queue.subscribe(block: true) do |_delivery_info, _properties, body|
puts " [x] Received #{body}"
end
rescue Interrupt => _
conn.close
exit(0)
end
実行してみる
受信側で
$ bundle exec ruby receive.rb
[*] Waiting for messages. To exit press CTRL+C
送信側で
$ bundle exec ruby send.rb
[x] Sent 'Hello World!'
publish(send)後にconsume(receive)することを確認
receve側に下記のメッセージが出力される
[x] Received Hello World!
queue 一覧
キュー一覧とメッセージ数の確認が下記のコマンドでできる
# rabbitmqctl list_queues