Простая масштабируемая очередь работы/сообщений с задержкой
-
23-09-2019 - |
Вопрос
Мне нужно настроить очередь заданий/сообщений с возможностью установить задержку для задачи, чтобы свободный работник не подбирал ее сразу, а через определенное время (может варьироваться от задачи к задаче).Я рассмотрел несколько решений для работы с очередями в Linux (rabbitmq, gearman, memcacheq), но ни одно из них, похоже, не предлагает эту функцию «из коробки».
Есть идеи, как я могу этого добиться?
Спасибо!
Решение
Я с большим успехом использовал BeanstalkD, используя опцию задержки при вставке нового задания, чтобы подождать несколько секунд, пока элемент не станет доступен для резервирования.
Если вы выполняете долгосрочные задержки (более, скажем, 30 секунд) или задания несколько важны для выполнения (хотя и позже), тогда у него также есть система двоичного журнала, так что при любом сбое демона все равно будет сохраняться запись о задании. .Тем не менее, я пропустил сотни тысяч живых заданий через экземпляры Beanstalkd, и воркеры, которые я написал, всегда были более проблематичными, чем сервер.
Другие советы
Вы можете использовать брокера AMQP (например, RabbitMQ), и у меня есть «агент» (например,процесс Python, созданный с использованием pyton-amqplib), который находится на бирже и перехватывает определенные сообщения (конкретные routing_key
);по истечении таймера отправьте сообщение обратно на обмен с другим routing_key
.
Я понимаю, что это означает «перевод/сопоставление» routing keys
но это работает.Работать с RabbitMQ и python-amqplib очень просто.