Я изучаю возможность использования обмена LVC для использования уведомлений с отслеживанием состояния. Когда состояние меняется, подписчикам нужно сообщить об этом. Обмен LVC является ценным для этого, когда услуги не обязательно всегда активны и не гарантируется запуск в любом порядке.
Постоянная и долговременная очередь, в основном, позволяла бы мне выполнять ту же функцию, но если бы она была недоступна в течение длительного периода, размер очереди мог бы увеличиваться без необходимости, и читателю очереди, возможно, придется иметь дело с большим количеством ненужных сообщений.
Я запускаю RabbitMQ в док-контейнере. Я убедился, что сам обмен действительно долговечен, и хранилище данных mnesia отображается вне контейнера.
- Запустить RabbitMQ
- Опубликовать сообщение для обмена (продюсер.рб)
- Прослушивание сообщений с использованием анонимной очереди, связанной с обменом
- Видите, что последнее значение получено
- Stop RabbitMQ
- Запустить RabbitMQ
- Прослушивание сообщений с использованием анонимной очереди, связанной с обменом
producer.rb
#!/usr/bin/env ruby
require 'bunny'
connection = Bunny.new
connection.start
channel = connection.create_channel
message = "Hello World! #{Time.new}"
exchange = channel.exchange('pub-sub', :durable => true, :type => 'x-lvc')
exchange.publish(message, :persistent => true)
puts " [x] Sent '#{message}'"
consumer.rb
require 'bunny'
connection = Bunny.new()
connection.start
channel = connection.create_channel
queue = channel.queue('', exclusive: true)
queue.bind('pub-sub')
begin
puts ' [*] Waiting for messages. To exit press CTRL+C'
queue.subscribe(block: true) do |_delivery_info, _properties, body|
puts " [x] Received #{body}"
end
rescue Interrupt => _
connection.close
end
Я ожидал увидеть то же сообщение, которое было первоначально опубликовано, вместо этого я не получил новых сообщений.