Задачи сельдерея с длинной eta (8+ часов) выполняются несколько раз подряд, когда эта достигнута

Я создаю задачу с eta в пределах от 3 до 20 часов, и когда я смотрю на рабочий журнал, для этой задачи рабочий говорит "Got task from broker: ..." каждый час после того, как исходная задача была получена до тех пор, пока эта достиг.

Я знаю, что это связано с установкой BROKER_TRANSPORT_OPTIONS = {'visibility_timeout': X}, где X - это число в секундах.

Итак, я играл с visibility_timeout, и если я установил его на что-то меньше 1 часа, то я вижу, что работник получает одну и ту же задачу каждые X секунд, однако, когда я устанавливаю значение visibility_timeout на X, превышающее 1 час, тогда сохраняет значение по умолчанию не более 1 часа, независимо от времени, которое я установил.

Кто-нибудь еще сталкивается с этой проблемой? Это ошибка?

Я использую Celery 3.0.11 (Chiastic Slide) с сервером Redis версии 2.4.15

Ответы

Ответ 1

EDIT: любой пользователь сообщения, использующий kombu *, подключенный к тому же URL-адресу Redis поможет восстановить неустановленные сообщения, поэтому вы должны убедиться, что все они настроены с тем же значением visibility_timeout.

Общей ошибкой является запуск монитора Flower следующим образом:

celery flower -b redis://somewhere

вместо этого:

celery -A proj flower

поскольку первый означает, что экземпляр Flower не будет настроен с конфигурацией сельдерея, а затем пропустить BROKER_TRANSPORT_OPTIONS и настройку visibility_timeout.

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

  • kombu - это библиотека обмена сообщениями, используемая Celery.

Оригинальный ответ:

Даже если я ничего не слышал об этом, это может быть ошибкой. Я добавил несколько операторов печати в kombu/transport/redis.py, чтобы проверить, правильно ли установлен visibility_timeout, и это определенно для меня. Тестирование того, что он работает со значениями, превышающими час, займет больше времени (точнее, примерно 2 часа), поэтому я могу сообщить об этом.

В то же время вы можете убедиться, что вы правильно устанавливаете visiblity_timeout, добавив инструкцию печати самостоятельно (например, к методу restore_visible в redis-транспорте).

Обратите внимание, что эта функция использует временные метки, поэтому, если у вас есть несколько машин, важно, чтобы часы были в значительной степени синхронизированы (особенно, не отходя от часов). Вы всегда должны использовать ntp на сетевых серверах и регулярно синхронизировать.