RabbitMQ не поддерживает отложенные сообщения встроенным образом. В настоящее время основные способы реализации включают использование "мёртвого" обмена + схемы TTL сообщения или плагина rabbitmq-delayed-message-exchange.

Применение отложенных очередей

  • Сценарии, где требуются временные рамки для производства и потребления сообщений. Например, в электронной коммерции существует сценарий, при котором заказы закрываются, если оплата не завершена в тайм-аут. В этом случае отложенное сообщение отправляется при создании заказа. Это сообщение будет доставлено потребителю через 30 минут, и потребитель должен проверить, был ли соответствующий заказ оплачен. Если оплата не завершена, заказ закрывается; если оплата завершена, сообщение игнорируется.
  • Сценарии, где отложенные задачи активируются сообщениями. Например, отправка напоминательных сообщений пользователям после определенного временного периода.

Схема "мёртвого" обмена + схема TTL сообщения

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

В этом подходе время истечения сообщения служит в качестве времени задержки сообщения. Например, если время TTL сообщения установлено в 30 секунд и нет потребителей для очереди, сообщение истечет через 30 секунд и станет "мёртвым", после чего будет обработано мёртвой очередью.

Для реализации этого подхода необходимо установить соответствующие свойства, описанные в следующих двух учебниках: