Celery: Могут ли предварительно созданные рабочие процессы игнорировать сигналы TERM?

Созданный на 4 июн. 2018  ·  3Комментарии  ·  Источник: celery/celery

Общий

Затронутая версия: последняя (4.1.1)

Ожидаемое поведение

Предварительно подготовленные рабочие процессы игнорируют сигнал sigterm - только родительский процесс, ответственный за горячее завершение работы, реагирует на него и корректно завершает дочерние процессы.

Текущее поведение

Когда предварительно загруженные рабочие процессы получают сигнал, они немедленно закрываются (например, kill <pid> ):

celery_1        | [2018-06-04 09:19:57,376: ERROR/MainProcess] Process 'ForkPoolWorker-2' pid:26 exited with 'signal 15 (SIGTERM)'

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

Актуальность

Я не могу найти способ сделать правильное выключение сельдерея в контейнере докера с системой инициализации.
(см. список рассылки: https://groups.google.com/forum/#!topic/celery-users/9UF_VyzRt8Q). Похоже, что я должен убедиться, что термин signal достигает только родительского процесса, но не любого из предварительно форкованных рабочих процессов. Это кажется очень сложным при запуске сценария bash с несколькими экземплярами сельдерея (например, beat и две очереди)

Возможное решение

Можно ли добавить функцию, позволяющую предварительно созданным рабочим процессам игнорировать сигтерм?

Deployment Prefork Workers Pool

Самый полезный комментарий

Спасибо @georgepsarakis и @xirdneh за ваши полезные предложения. Мне удалось получить рабочую настройку с супервайзером! 🎉
Также неплохо было бы иметь одного рабочего на контейнер! Большое спасибо!

Все 3 Комментарий

Для правильного распространения сигнала при запуске нескольких процессов внутри контейнера Docker вам, вероятно, понадобится диспетчер процессов, например supervisord .

Для получения дополнительной информации вот обзор того, как docker останавливает вещи: https://www.ctl.io/developers/blog/post/gracefully-stopping-docker-containers/#docker -stop

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

Последняя вещь. Если вы действительно хотите развернуть свой собственный сценарий bash для управления несколькими воркерами, вам придется запускать каждого воркера, а затем бездействовать до тех пор, пока не появится SIGTERM .
Когда это произойдет, вы можете пойти и получить рабочий PID, а затем изящно остановить каждого из них.
Это в основном то, что делает supervisord , как указал @georgepsarakis .

Спасибо @georgepsarakis и @xirdneh за ваши полезные предложения. Мне удалось получить рабочую настройку с супервайзером! 🎉
Также неплохо было бы иметь одного рабочего на контейнер! Большое спасибо!

Была ли эта страница полезной?
0 / 5 - 0 рейтинги