LINUX.ORG.RU

RabbitMQ - отправка сообщений в exhange/queue без consumer'ов


0

1

Ковыряюсь с rabbitmq.

Согласно заявленному в документации (и наблюдаемому), если сообщение отправляется в exchange/queue, у которого нету consumer'ов - оно отбрасывается (уходит в /dev/null).

Допустим, для штатной ситуации (аккуратно запустил всех consumer'ов, потом начал в них че-то писать) всё хорошо.

А что делать в нештатной ситуации.

Например, сообщения генерируются юзерами, кликающими на странички.

Веб-сервер поднимается автоматически при старте системы или при падении.

А consumer'ы, например, поднимаются нетривиально. Например, запускаются банально позже апача. Или запустились, но умерли и не поднимаются - мало ли. И пока они поднимутся - пройдет N времени и M сообщений будет отправлено в никуда.

С этим можно как-то бороться?

dead-letter не помогает, как я понимаю, потому что эта логика срабатывает только если сообщение не было обработано за N времени. Если же consumer'а тупо не было запущено - все сообщения протухнут мгновенно, без ожидания x-message-ttl.

Даже, фактически, если consumer'ы упадут по дороге (например, надо будет перезапустить), rabbitmq тут же начнет отбрасывать все входящие сообщения, не пытаясь и секунды дождаться consumer'ов.

Соответственно вопрос - как нужно себя вести с кроликом, что б не терять сообщения ни при каких условиях?

Вообще, не очень понимаю, зачем нужны disc-nodes и прочие пляски для хранения сообщений, если, например, при рестарте последней ноды, до появления первого consumer'а кролик сбросит все сообщения.

Или всё-таки я что-то глобально не понимаю?

★★★★★

Так, видимо, я сам что-то намудрил и теперь сообщения терпеливо ждут, пока появятся consumer'ы.

Но рестарт rabbitmq они не переживают (хотя exchange/queue созданы как durable и нода - дисковая).

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

AngryElf ★★★★★
() автор топика
Ответ на: комментарий от roy

Да, нашел properties.delivery_mode=2 в basic_publish, который дает сообщениям выживать в durable-очередях после рестарта.

Суровое API, конечно, а в дефолтных примерах всё по дефолту не durable и не persisted...

AngryElf ★★★★★
() автор топика
Ответ на: комментарий от AngryElf

а в дефолтных примерах всё по дефолту не durable и не persisted...

Ленивые макаки даже не могут 10-минутный туториал до конца пройти. OMG.

baverman ★★★
()

Immediate

For a message published with immediate set, if a matching queue has ready consumers then one of them will have the message routed to it. If the lucky consumer crashes before ack'ing receipt the message will be requeued and/or delivered to other consumers on that queue (if there's no crash the messaged is ack'ed and it's all done as per normal). If, however, a matching queue has zero ready consumers the message will not be enqueued for subsequent redelivery on from that queue. Only if all of the matching queues have no ready consumers that the message is returned to the sender (via basic.return).

dizza ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.