RabbitMQ — как сделать отсрочку по времени?

Как в MQ ( раббит или редис ) сделать задания по времени?
Например, мне нужно чтобы сообщение пришло ровно в такое-то время или, например, нужно сделать таймаут между входом и выходом сообщения 10 сек.

И еще, как перемешать очередь или выбрать случайное сообщение?
  • Вопрос задан
  • 4473 просмотра
Пригласить эксперта
Ответы на вопрос 5
Tsyganov_Ivan
@Tsyganov_Ivan
У меня была похожая задача когда-то
Выше правильно сказали - не для этого Rabbit, но если уже надо, то надо)
Я таки сообщения клал в очередь вида message_type_delivery_timestamp и выставлял ей TTL в секундах до времени отправки. Так же у этой очереди указывается exchange, куда попадут просроченные сообщения. Так вот этой очередью я выставлял очередь message_type, у которой нет TTL и которую слушали воркеры.
Таким образов в отложенной очереди истекал TTL, сообщения перебрасывались в очередь для немедленной отправки и воркеры обрабатывали их.

Прошу прощения за сумбурность в изложении, надеюсь более-менее понятно =) Если тема все-еще актуальна - обращайтесь, расскажу подробней
Ответ написан
Комментировать
zarincheg
@zarincheg
Похоже что для ваших задач очереди не очень то и нужны. Вам нужен планировщик заданий. А рандомный выбор сообщения можно делать например из БД.
Ответ написан
Fesor
@Fesor
Full-stack developer (Symfony, Angular)
RabbitMQ: доставка сообщений по...

но вообще rabbitmq не предназначен для подобного. Используйте cron или воспользуйтесь какой-нибудь библиотекой что бы реализовать процесс-демон со своей логикой. И там уже в нужный момент отправляйте сообщение в очередь.

По поводу "вытащить надромное сообщение" не подскажу и даже не уверен что можно.
Ответ написан
Комментировать
afiskon
@afiskon
Ну во-первых, вы можете писать в очередь с задержкой. Конечно, если вы пишите на нормальном языке, в котором это можно без особых затруднений сделать. Но это не круто, так как машина может сдохнуть и сообщение не запишется.

Еще можно к каждому сообщению добавлять время, в которое оно должно быть обработано. Тогда на самом деле та же задача с задержкой перекладывается на воркера, который разгребает очередь.
Ответ написан
@cadmi
Ну посмотрите, как в Celery написан их sheduler.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы