Celery: Bisakah proses pekerja yang telah dipotong sebelumnya mengabaikan sinyal TERM?

Dibuat pada 4 Jun 2018  ·  3Komentar  ·  Sumber: celery/celery

Umum

Versi yang terpengaruh: terbaru (4.1.1)

Perilaku yang diharapkan

pekerja preforked mengabaikan sinyal sigterm - hanya proses induk yang bertanggung jawab atas shutdown hangat yang bereaksi dan dengan anggun mematikan proses anak.

Perilaku saat ini

Ketika proses pekerja preforked mendapatkan sigterm, mereka segera ditutup (misalnya kill <pid> ):

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

Ketika sigterm mencapai proses parent worker, warm shutdown dilakukan. Jika sementara itu pekerja preforked juga mendapat sinyal istilah, tugas-tugas itu dibunuh saja.

Relevansi

Saya tidak dapat menemukan cara untuk melakukan seledri shutdown yang tepat dalam wadah buruh pelabuhan dengan sistem init.
(lihat milis: https://groups.google.com/forum/#!topic/celery-users/9UF_VyzRt8Q). Tampaknya saya harus memastikan bahwa sinyal istilah hanya mencapai proses induk, tetapi tidak ada pekerja yang telah dipotong sebelumnya. Ini tampaknya sangat sulit ketika menjalankan skrip bash dengan beberapa contoh seledri (misalnya beat, dan dua antrian)

Solusi yang mungkin

Apakah mungkin untuk menambahkan fitur yang memungkinkan proses preforked worker mengabaikan sigterm?

Deployment Prefork Workers Pool

Komentar yang paling membantu

Terima kasih @georgepsarakis dan @xirdneh atas saran Anda yang bermanfaat. Saya berhasil mendapatkan pengaturan yang berfungsi dengan supervisord! 🎉
Memiliki satu pekerja per kontainer juga merupakan saran yang sangat bagus! Terima kasih banyak!

Semua 3 komentar

Untuk memiliki propagasi sinyal yang tepat saat memulai beberapa proses di dalam wadah Docker, Anda mungkin memerlukan manajer proses seperti supervisord .

Untuk informasi lebih lanjut, inilah ikhtisar tentang bagaimana buruh pelabuhan menghentikan hal-hal: https://www.ctl.io/developers/blog/post/gracefully-stopping-docker-containers/#docker -stop

Juga, jika Anda sudah menggunakan buruh pelabuhan, saya akan merekomendasikan memecat satu pekerja per kontainer.
Lebih mudah untuk mengelola dan kontainer tidak memiliki banyak overhead. Juga lebih mudah untuk melakukan penskalaan otomatis saat menggunakan alat seperti k8s.

Satu hal terakhir. Jika Anda benar-benar ingin menggulung skrip bash Anda sendiri untuk mengelola banyak pekerja, Anda harus menjalankan setiap pekerja dan kemudian tidur tanpa batas hingga SIGTERM muncul .
Ketika itu terjadi, Anda dapat pergi dan mendapatkan PID pekerja dan kemudian dengan anggun menghentikan masing-masing.
Yang pada dasarnya adalah apa yang dilakukan supervisord seperti yang ditunjukkan oleh @georgepsarakis .

Terima kasih @georgepsarakis dan @xirdneh atas saran Anda yang bermanfaat. Saya berhasil mendapatkan pengaturan yang berfungsi dengan supervisord! 🎉
Memiliki satu pekerja per kontainer juga merupakan saran yang sangat bagus! Terima kasih banyak!

Apakah halaman ini membantu?
0 / 5 - 0 peringkat