プログラミング ミドルウェア

RabbitMQチュートリアル Part5

投稿日:

要約

fanoutエクスチェンジでブロードキャスト配信できる。
directエクスチェンジにrouting_key指定することで、特定のコンシューマへメッセージ配信ができる。
複数の条件に基づいてメッセージを配信したい場合は、topicエクスチェンジを使用する。

topicエクスチェンジでは、ドット(.)で区切られた単語をrouting_keyとして使用できる。
また、ルーティングキー(binding key)には下記の特殊文字が使用できる。

  • * ・・・ 1つの単語
  • # ・・・ 0以上の単語

例えば、コンシューマのルーティングキー(binding key)を下記のように指定したとする。

queue1.bind(exchange, routing_key: "*.orange.*")  # queue1
queue2.bind(exchange, routing_key: "*.*.rabbit")  # queue2
queue2.bind(exchange, routing_key: "lazy.#")      # queue2

exchangeにパブリッシュされたメッセージのrouting_keyがそれぞれ下記の場合、

  • "quick.orange.rabbit" -> queue1とqueue2に配送される
  • "lazy.orange.elephant" -> queue1とqueue2に配送される
  • "quick.orange.fox" -> queue1へ配送される
  • "lazy.brown.fox" -> queue2へ配送される
  • "lazy.pink.rabbit" -> queue2へ配送される(複数条件にマッチングしたからといって、複数メッセージが配送されることはない)
  • "quick.brown.fox" -> どのキューへも配送されず破棄される
  • "orange" -> どのキューへも配送されず破棄される
  • "quick.orange.male.rabbit" -> どのキューへも配送されず破棄される
  • "lazy.orange.male.rabbit" -> queue2へ配送される
    となる

実際に実行した結果

Publishする側のサンプルプログラム

#!/usr/bin/env ruby
require 'bunny'

connection = Bunny.new
connection.start

channel = connection.create_channel
exchange = channel.topic('topic_exchange')
key = ARGV.shift || 'hoge.fuga.piyo'
message = ARGV.empty? ? 'Hello World!' : ARGV.join(' ')

exchange.publish(message, routing_key: key)
puts " [x] Sent #{key}:#{message}"

connection.close

Consumeする側のサンプルプログラム

#!/usr/bin/env ruby
require 'bunny'

abort "Usage: #{$PROGRAM_NAME} [binding key]" if ARGV.empty?

connection = Bunny.new
connection.start

channel = connection.create_channel
exchange = channel.topic('topic_exchange')
queue = channel.queue('', exclusive: true)

ARGV.each do |key|
  queue.bind(exchange, routing_key: key)
end

puts ' [*] Waiting for messages. To exit press CTRL+C'

begin
  queue.subscribe(block: true) do |delivery_info, _properties, body|
    puts " [x] #{delivery_info.routing_key}:#{body}"
  end
rescue Interrupt => _
  channel.close
  connection.close

  exit(0)
end

-プログラミング, ミドルウェア
-,

Copyright© 明日から頑張ります。 , 2025 All Rights Reserved Powered by STINGER.