LoginSignup
7
2

More than 5 years have passed since last update.

RubyからRabbitMQにメッセージを送信する

Posted at

はじめに

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から読み出す方はまた今度。

7
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
2