Простая масштабируемая очередь работы/сообщений с задержкой

Мне нужно настроить очередь заданий/сообщений с возможностью установить задержку для задачи, чтобы она не сразу подхватывалась бесплатным работником, а через определенное время (может варьироваться от задачи к задаче). Я просмотрел пару решений для очередей Linux (rabbitmq, gearman, memcacheq), но ни одно из них не предлагает эту функцию из коробки.

Любые идеи о том, как я мог бы достичь этого?

Спасибо!


person idevelop    schedule 02.03.2010    source источник


Ответы (2)


Я использовал BeanstalkD с большим эффектом, используя опцию задержки при вставке нового задания, чтобы подождать несколько секунд, пока элемент не станет доступным для резервирования.

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

person Alister Bulman    schedule 03.03.2010
comment
Спасибо за ваш отзыв, я изучал beanstalkd последние пару дней, и он выглядит великолепно. И вы правы, рабочая логика и управление хитрые :) - person idevelop; 04.03.2010

Вы можете использовать брокера AMQP (например, RabbitMQ), и у меня есть «агент» (например, процесс python, созданный с использованием pyton-amqplib), который сидит на обмене и перехватывает определенные сообщения (конкретные routing_key); по истечении таймера отправьте сообщение обратно на биржу с другим routing_key.

Я понимаю, что это означает "перевод/сопоставление" routing keys, но это работает. Работать с RabbitMQ и python-amqplib очень просто.

person jldupont    schedule 02.03.2010
comment
Я думал об этом, но если ожидающий агент будет убит, пока он ожидает истечения таймера, сообщение никогда не будет добавлено в очередь. Возможно, я мог бы исправить это, создав вторую постоянную очередь и агента с несколькими внутренними таймерами. Тем не менее, это кажется уродливым обходным путем. - person idevelop; 02.03.2010
comment
Что ж, работа с этим режимом отказа является частью игры. Я был бы удивлен, если бы функциональность, которую вы запрашиваете, стала основной в AMQP Brokers, поскольку она идет вразрез с основной целью: минимизировать задержку. - person jldupont; 02.03.2010
comment
Спасибо за ваши ответы. Я думаю, что попробую beanstalkd, он кажется нормальным и поддерживает задержку, о которой я говорил. - person idevelop; 02.03.2010