コネクションからクライアント情報を知りたい場合がある
- clientからRabbitMQサーバーへの接続をロードバランサー経由にした場合、
rabbitmqctrl
でコネクション情報を見ると、全部同じIPアドレスになってしまう
sudo /usr/sbin/rabbitmqctl list_connections
#=>
#Listing connections ...
#guest 10.0.1.100 34989 running
#guest 10.0.1.100 34997 running
#guest 10.0.1.100 34992 running
#guest 10.0.1.100 34995 running
- コネクションから監視情報を取りたい(一箇所監視するだけにしたい)
- あるキューを処理するclient(worker)がいるか
- このホスト名から始まるclientがいるか
解決案
クライアント情報をコネクションのclient_properties
に埋め込むことで、rabbitmqctrl
からクライアント情報を取ることが可能
client_properties.rb
# -*- coding: utf-8 -*-
require 'amqp'
# client情報を設定
# ホスト名、IPアドレス、プロセスID、起動時刻、処理するキュー名
client_properties = {
:hostname => Socket.gethostname,
:ipaddress => Socket.getifaddrs.select{|x| x.name == "eth0" and x.addr.ipv4?}.first.addr.ip_address,
:pid => Process.pid,
:start_time => Time.now.to_s,
:queues => [ 'queue1' ]
}
# RabbitMQに接続
AMQP.start(
:host => "localhost", :vhost => "/production",
:user => "user1", :pass => "pass", :client_properties => client_properties
) do |connection, open_ok|
# channelを作成
channel = AMQP::Channel.new(connection)
# queue1を作成
queue = channel.queue("queue1", :nowait => false, :durable => true)
# queue1からmessageを取得
queue.subscribe(:ack => true) do |hdr, msg|
p "queue = #{queue.name}" #=> "queue = queue1"
p "message= #{msg}" #=> "message= Hello, world!"
# RabbitMQのmessageを削除
hdr.ack
end
end
埋め込んだクライアント情報を参照する
rabbitmqctrlにclient_properties
を指定すると、埋め込んだ情報が表示される
sudo /usr/sbin/rabbitmqctl list_connections client_properties
実行結果
Listing connections ...
[{"platform","ruby 2.1.5p273 (2014-11-13 revision 48405) [x86_64-linux]"},{"product","AMQP gem"},{"information","http://github.com/ruby-amqp/amqp"},{"version","1.0.2"},
{"hostname","testhost"},{"ipaddress","10.0.1.105"},{"pid",34989},{"start_time","2016-07-19 13:05:07 +0900"},{"queues",["queue1"]}]
[{"platform","ruby 2.1.5p273 (2014-11-13 revision 48405) [x86_64-linux]"},{"product","AMQP gem"},{"information","http://github.com/ruby-amqp/amqp"},{"version","1.0.2"},
{"hostname","testhost"},{"ipaddress","10.0.1.128"},{"pid",34997},{"start_time","2016-07-19 13:05:08 +0900"},{"queues",["queue1"]}]
[{"platform","ruby 2.1.5p273 (2014-11-13 revision 48405) [x86_64-linux]"},{"product","AMQP gem"},{"information","http://github.com/ruby-amqp/amqp"},{"version","1.0.2"},
{"hostname","testhost"},{"ipaddress","10.0.1.143"},{"pid",34992},{"start_time","2016-07-19 13:05:09 +0900"},{"queues",["queue1"]}]
[{"platform","ruby 2.1.5p273 (2014-11-13 revision 48405) [x86_64-linux]"},{"product","AMQP gem"},{"information","http://github.com/ruby-amqp/amqp"},{"version","1.0.2"},
{"hostname","testhost"},{"ipaddress","10.0.1.92"},{"pid",34995},{"start_time","2016-07-19 13:05:19 +0900"},{"queues",["queue1"]}]
...done.
- 最初のplatform, product, information versionは、amqpが設定した情報