はじめに
RabbitMQにRubyからメッセージを送信する方法を調べてみました。
なお、使用したバージョンは以下の通りです。
- Ruby 2.5.1
- RabbitMQ 3.7.5
RabbitMQの設定
RabbitMQ は、起動するとデフォルトで guest ユーザーが生成されます。(http://www.rabbitmq.com/access-control.html#default-state)
guestユーザーは、リモートのホストからはアクセスできないようになっています。(http://www.rabbitmq.com/access-control.html#loopback-users)
本来の運用なら guest ユーザーを削除するのが良さそうです。
とりあえず、今回は、リモートからもアクセスできるようにしたいので、ユーザーを新たに作成します。
$ sudo rabbitmqctl add_user peter xxxxx # ユーザー名 peter パスワード xxxxx でユーザーを作成
Adding user "peter" ...
$ sudo rabbitmqctl list_users # ユーザーが登録されていることを確認
Listing users ...
peter []
guest [administrator]
$
peter 専用の vhost を作成します。 vhost ってのはサブディレクトリみたいなものだと考えれば良いでしょうか。
$ sudo rabbitmqctl add_vhost /nest # /nest という名前の vhost を作ります。
Adding vhost "nest" ...
$ sudo rabbitmqctl list_vhosts # /nest が作られていることを確認します。
Listing vhosts ...
/nest
/
peter には、 /nest の中では、何でもやりたい放題にさせます。
$ sudo rabbitmqctl set_permissions -p /nest peter ".*" ".*" ".*" # peter は /nest の中ではやりたい放題にさせます。
Setting permissions for user "peter" in vhost "/nest" ...
$ sudo rabbitmqctl list_permissions -p /nest # peterがやりたい放題できるか確認します。
Listing permissions for vhost "/nest" ...
peter .* .* .*
Rubyからメッセージを送信する
Rubyからメッセージを送信するには、bunny gem を使います。
$ gem install bunny
rabbitmqとは別のサーバーからの接続して、キューにメッセージを送信するスクリプトを書いてみます。
require 'bunny'
connection = Bunny.new(host: 'rabbitmq_server', vhost: '/nest', user: 'peter', password: 'xxxxx')
connection.start
channel = connection.create_channel
# queue を永続化するために durable: true をセット
queue = channel.queue('task_queue', durable: true)
# 10個のメッージを送る
10.times do |i|
message = "message-#{i}"
# メッセージも消えないように永続化する
queue.publish(message, persistent:true)
end
channel.close
connection.close
RabbitMQのサーバーで確認します。
$ sudo rabbitmqctl list_queues -p /nest name messages messages_persistent
Timeout: 60.0 seconds ...
Listing queues for vhost /nest ...
task_queue 10 10
task_queue には、10個のメッセージがあって、10個とも永続化されたメッセージであることがわかります。
RabbitMQをリスタートしてもメッセージが消えないことを確認します。
$ sudo /etc/init.d/rabbitmq-server restart
Restarting rabbitmq-server (via systemctl): rabbitmq-server.service.
$ sudo rabbitmqctl list_queues -p /nest name messages messages_persistent
Timeout: 60.0 seconds ...
Listing queues for vhost /nest ...
task_queue 10 10
まとめ
なんだか、RabbitMQ(rabbitmqctl)の使い方の部分が長くなってしまいました。 RabbitMQから読み出す方はまた今度。