Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
2
Help us understand the problem. What is going on with this article?
@suketa

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

More than 1 year has passed since last update.

はじめに

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

2
Help us understand the problem. What is going on with this article?
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
suketa
Rails初心者なRubyコミッター
ruby-dev
Ruby開発はRuby on Railsをコア技術とし、Web系から基幹系まで多様な開発に携わっています。

Comments

No comments
Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account Login
2
Help us understand the problem. What is going on with this article?