Celery: Os processos de trabalho pré-bifurcados podem ignorar os sinais TERM?

Criado em 4 jun. 2018  ·  3Comentários  ·  Fonte: celery/celery

Em geral

Versão afetada: mais recente (4.1.1)

Comportamento esperado

os trabalhadores pré-bifurcados ignoram o sinal sigterm - apenas o processo pai responsável pelo desligamento a quente reage a ele e desliga normalmente os processos filho.

Comportamento atual

Quando os processos de trabalho pré-bifurcados obtêm um sigterm, eles encerram imediatamente (por exemplo, kill <pid> ):

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

Quando um sigterm atinge o processo de trabalho pai, o desligamento a quente é executado. Se, nesse ínterim, os trabalhadores pré-bifurcados também receberem um sinal de término, as tarefas serão simplesmente eliminadas.

Relevância

Não consigo encontrar uma maneira de fazer um aipo de desligamento adequado em um contêiner docker com um sistema init.
(consulte a lista de correspondência: https://groups.google.com/forum/#!topic/celery-users/9UF_VyzRt8Q). Parece que tenho que ter certeza de que o termo sinal atinge apenas o processo pai, mas não qualquer um dos trabalhadores pré-bifurcados. Isso parece ser muito difícil ao executar um script bash com várias instâncias de aipo (por exemplo, batida e duas filas)

Solução possível

É possível adicionar um recurso que permite que os processos de trabalho pré-bifurcados ignorem o sigterm?

Deployment Prefork Workers Pool

Comentários muito úteis

Obrigado @georgepsarakis e @xirdneh por suas sugestões úteis. Consegui uma configuração de trabalho com supervisord! 🎉
Ter um trabalhador por contêiner também é uma sugestão muito boa! Muito obrigado!

Todos 3 comentários

Para ter uma propagação de sinal adequada ao iniciar vários processos dentro de um contêiner Docker, você provavelmente precisa de um gerenciador de processos, como supervisord .

Para obter mais informações, aqui está uma visão geral de como o docker interrompe as coisas: https://www.ctl.io/developers/blog/post/gracefully-stopping-docker-containers/#docker -stop

Além disso, se você já estiver usando o docker, recomendo disparar um trabalhador por contêiner.
É mais fácil de gerenciar e os contêineres não têm tanta sobrecarga. Também é mais fácil fazer o escalonamento automático ao usar ferramentas como o k8s.

Uma última coisa. Se você realmente quiser lançar seu próprio script bash para gerenciar vários trabalhadores, terá que ativar cada um deles e dormir indefinidamente até que apareça um SIGTERM .
Quando isso acontecer, você pode obter o PID dos workers e, em seguida, interromper cada um.
O que é basicamente o que supervisord faz conforme @georgepsarakis apontou.

Obrigado @georgepsarakis e @xirdneh por suas sugestões úteis. Consegui uma configuração de trabalho com supervisord! 🎉
Ter um trabalhador por contêiner também é uma sugestão muito boa! Muito obrigado!

Esta página foi útil?
0 / 5 - 0 avaliações