2017-02-12 6 views
0

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

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

Так что, если в очереди есть 3 сообщения, каждое сообщение будет отправлено на один час.

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

Есть ли прямой способ сделать это?

ответ

0

Да, есть, описано here. Я просто процитирую одну часть:

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

также другой подход (до RabbitMQ добавлен обмен задержки) был использованием комбинации мертвой буквы обмена сообщениями и ТТЛ, как описано, например, here.

+0

Я не думаю, что это сработает. Флаг x-delay будет работать в отношении сообщения. Так скажите, что я публикую сообщение на 't0' с задержкой в ​​60 минут. Тогда этот msg будет отправлен в очередь через 60 минут. Теперь, если я опубликую 3 сообщения с той же задержкой, все эти сообщения будут отправлены через 60 минут. Я хочу, чтобы первое сообщение было отправлено во время 't0' второго во время' t0 + 60', а третье - на 't0 + 120'. Исправьте меня Если я неправильно понял ваш ответ – pratikvasa

+0

Возможно:) Возможно, я неправильно понял ваш комментарий.Но последняя часть вашего комментария - именно то, что я имел в виду - вы публикуете сообщение nr N и устанавливаете задержку N * 60. Очевидно, для первого сообщения N = 1. – cantSleepNow

+0

Итак, вы говорите, что при публикации сообщения установите задержку для первого msg как '0', затем для 2-го msg установите его' 60', затем '120'. Это не будет работать для этого случая. Допустим, что первое сообщение приходит в 't0', и я устанавливаю задержку на' 0'. Тогда Если второе сообщение приходит, скажем, 't0 + 100', я бы хотел, чтобы задержка была' 0', а не '60'. – pratikvasa

0

После большого рытья я не мог найти прямой способ сделать это.

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

Единственный недостаток заключается в том, что если первое сообщение поступило на t0+1, то даже если бы не было сообщений, прежде чем он будет ожидать 60 minutes перед обработкой сообщения.

Если это может быть улучшено, дайте мне знать.

0

Одним из способов может быть:

  1. Расписание крон за каждые 5 или "х" минут.
  2. Cron проверяет, есть ли сообщение в очереди, оно извлекает ОДИН посыльный из очереди. Если уведомление отправлено успешно, вы можете изменить расписание cron на следующий прогон через 60 минут (и через 5 или x минут после этого запуска). Проверьте связь this, чтобы переназначить запланированные задачи окна.
  3. Cron ничего не делает, если в очереди нет сообщений.

 Смежные вопросы

  • Нет связанных вопросов^_^