Страницы

Поиск по вопросам

среда, 13 февраля 2019 г.

Таймер в RabbitMQ

Как в RabbitMQ на python сделать отправку сообщений в очередь так, чтобы оно пришло в очередь только через определенное время, например, 4 часа ?


Ответ

RabbitMQ не поддерживает такую "родную" функцию.
Предложение приведенное выше проблематично так как требует базы данных и постоянную обработку сообщений. Такое решение намного более "рискованно". Не говоря уже о том что просто дополнительное обрабатывающее средство + база данных ну просто ни к чему.
Но функцию возможно эмулировать. При этом сообщение будет отослано и будет находиться на сервере до тех пор пока не наступит время сообщение доставить. Следующая версия NServiceBus.RabbitMQ транспорта будет поддерживать Native Delays при помощи Topic Exchanges.
Имплементация не зависит от языка посылающей аппликации.
Идея заключается в создании header exchanges где каждый уровень представляет бит из задержки. Если бит 0, exchange направляет сообщение на следующий уровень. Если бит 1, то в queue с TTL соответствующий задержке на этом уровне. Каждый queue с DLQ binding к следующему exchange.
Схематически, это будет выглядеть так:

Заметка: можно также имплементировать с Header Exchanges
С 32-ух битной задержкой (32 уровня exchanges) задержка получится от 1 до 2^31 секунд.

Комментариев нет:

Отправить комментарий