Постоянное сообщение Ruby AMQP удаляется после перезапуска RabbitMQ - PullRequest
4 голосов
/ 17 марта 2011

У меня есть скрипт ruby, который создает сообщение с использованием AMQP в RabbitMQ.

# above code sets up config for connecting to RabbitMQ via APMQ
AMQP.start(:host => 'localhost') do
  amq = MQ.new
  amq.queue('initiate', :durable => true).publish(message_id, :persistent => true)
  AMQP.stop{ EM.stop }
end

Если сервер RabbitMQ перезапущен, сообщение больше не находится в очереди инициализации (или в любой другой очереди). Что я делаю не так, что сообщение не является постоянным? Я также попытался явно создать долговременный обмен и привязать очередь к этому обмену, но сообщение все еще удаляется после перезапуска RabbitMQ.

Ответы [ 3 ]

4 голосов
/ 18 марта 2011

Как уже упоминалось, если вы просто помечаете сообщения как постоянные, они не обязательно сразу сохраняются, поэтому, если сервер неожиданно завершает работу, они могут никогда не оказаться на диске.

Так что вы будете делать, есливам действительно нужно, чтобы сообщение было на диске, даже если сервер выходит из строя?

Есть две вещи, которые вы можете сделать.Одним из них является завершение публикации в транзакции.Когда вы совершите транзакцию, сообщение будет на диске (если, конечно, оно еще не доставлено потребителю).Однако это добавляет синхронный вызов на сервер, поэтому он может замедлить работу.Если вы знаете, что собираетесь публиковать много сообщений, вы можете обернуть несколько публикаций в транзакцию, а затем, когда подтвердите, что все они находятся на диске.

Другое (более высокая производительность)Альтернативой является использование подтверждения публикации.Но они являются новыми на сервере 2.3.1, и я не думаю, что их поддерживают какие-либо клиенты Ruby.

Наконец, RabbitMQ в любом случае будет периодически сбрасывать постоянные сообщения на диск даже при отсутствии подтверждений, транзакций и контролируемыхостановов.Однако в 2.2.0 есть ошибка, которая означает, что это иногда не происходит долгое время, поэтому обновление до 2.3.1 может стоить.

2 голосов
/ 17 марта 2011

Забавно, я просто гуглил по той же проблеме.RabbitMQ 2.2.0, опции по умолчанию.В моем случае клиенты Ruby используют rubygem-amqp-0.6.7-3.el5 из EPEL.Durable queues связаны с Durable fanout exchange, публикуя сообщения с: persistent => true.Сообщения теряются при перезапуске сервера.-Alan

1 голос
/ 18 марта 2011

Да, Саймон прав.Об издателе подтверждает (описано в http://www.rabbitmq.com/blog/2011/02/10/introducing-publisher-confirms), Я планирую поддержать их в AMQP 0.8, который скоро будет выпущен.

Кстати, в первоначальном примере первый аргумент для публикации должен быть фактическимданные, все остальное указывается с помощью параметров, поэтому публикуется (message, opts), а не publish (message_id, opts).

...