RabbitMQ не поддерживает отложенные сообщения встроенным образом. В настоящее время основные способы реализации включают использование "мёртвого" обмена + схемы TTL сообщения или плагина rabbitmq-delayed-message-exchange.
Применение отложенных очередей
- Сценарии, где требуются временные рамки для производства и потребления сообщений. Например, в электронной коммерции существует сценарий, при котором заказы закрываются, если оплата не завершена в тайм-аут. В этом случае отложенное сообщение отправляется при создании заказа. Это сообщение будет доставлено потребителю через 30 минут, и потребитель должен проверить, был ли соответствующий заказ оплачен. Если оплата не завершена, заказ закрывается; если оплата завершена, сообщение игнорируется.
- Сценарии, где отложенные задачи активируются сообщениями. Например, отправка напоминательных сообщений пользователям после определенного временного периода.
Схема "мёртвого" обмена + схема TTL сообщения
Основная идея этого подхода заключается в создании очереди без потребителей и использовании времени истечения сообщения (TTL). Когда сообщение истекает, оно становится "мёртвым" и маршрутизируется в "мёртвый" обмен, а затем в "мёртвую" очередь, где его можно потребить.
В этом подходе время истечения сообщения служит в качестве времени задержки сообщения. Например, если время TTL сообщения установлено в 30 секунд и нет потребителей для очереди, сообщение истечет через 30 секунд и станет "мёртвым", после чего будет обработано мёртвой очередью.
Для реализации этого подхода необходимо установить соответствующие свойства, описанные в следующих двух учебниках:
- [Очередь "мёртвых" сообщений](dead-letter-queue.html "Очередь "мёртвых" сообщений")
- Время истечения сообщения (TTL)