VD
Боремся тут с Celery несколько месяцев, никак не можем понять в чем причина.
Стек такой: Python 3.7, Celery 4.4.2, очередь хранится в Redis 5 (редис крутится в контейнере вместе с другими воркерами), все крутится в Докер контейнерах (сейчас около 40-50 штук) в Swarm mode на 4х серверах по 4 Гб RAM, хостимся на DigitalOcean.
Основная проблема - иногда воркеры перестают брать задачи из очереди. На некоторых воркерах такое частенько происходит, на некоторые иногда, не некоторых никогда. В результате очередь переполняется и в редисе кончается оперативка.
Бывает, что редису не удается сделать bgsave, он становится недоступным, из-за этого воркеры теряют коннекшн и больше не пытаются к нему подключиться.
Бывает, что воркер вроде бы работает, но такое чувство что в пол силы - после рестарта воркеры по ощущениям начинают генерить в 2 раза больше логов.
В общем, искать причину почему отваливаются воркеры непонятно как, поэтому решили пойти по другому пути: воткнули на все контейнеры хелсчек через
celery ping
каждые 15 секунд (на каждом из 40 воркеров). Но и тут засада - воркер может работать, и не отвечать на пинг, и наоборот. А еще после включения таких хелсчеков редис стал постоянно ребутится.В общем, сейчас хочется:
- разобраться в первопричине, почему воркеры перестают брать задачи
- сделать хелсчеки, чтобы система сама восстанавливалась в случае, если воркер перестает брать задачи. ну или как минимум оповещала нас об этом.
- минимизировать падения редиса, а в случае если это все-таки происходит - чтобы выполнения задач не останавливалось (вводить дополнительную ноду?)