我在heroku上有一个django Web应用程序,其中一些芹菜任务可能在后台运行。 Redis用作代理。
问题是,当我在执行某些任务时使用heroku restart
或通过heroku container:release
重启heroku应用程序时,它们被SIGTERM杀死,这意味着这些任务永远不会完成。
2018-11-23T19:35:24.506833+00:00 heroku[beat.1]: Restarting
2018-11-23T19:35:24.507645+00:00 heroku[beat.1]: State changed from up to starting
2018-11-23T19:35:24.517551+00:00 heroku[web.1]: Restarting
2018-11-23T19:35:24.518013+00:00 heroku[web.1]: State changed from up to starting
2018-11-23T19:35:24.528684+00:00 heroku[worker.1]: Restarting
2018-11-23T19:35:24.529175+00:00 heroku[worker.1]: State changed from up to starting
2018-11-23T19:35:24.952139+00:00 app[worker.1]:
2018-11-23T19:35:24.952156+00:00 app[worker.1]: worker: Warm shutdown (MainProcess)
2018-11-23T19:35:24.949622+00:00 heroku[worker.1]: Stopping all processes with SIGTERM
2018-11-23T19:35:24.996307+00:00 heroku[worker.1]: Process exited with status 143
2018-11-23T19:35:25.456920+00:00 heroku[web.1]: Stopping all processes with SIGTERM
2018-11-23T19:35:25.480748+00:00 app[web.1]: [2018-11-23 19:35:25 +0000] [16] [INFO] Handling signal: term
2018-11-23T19:35:25.481026+00:00 app[web.1]: [2018-11-23 19:35:25 +0000] [19] [INFO] Worker exiting (pid: 19)
2018-11-23T19:35:25.481491+00:00 app[web.1]: [2018-11-23 19:35:25 +0000] [20] [INFO] Worker exiting (pid: 20)
2018-11-23T19:35:25.481519+00:00 app[web.1]: [2018-11-23 19:35:25 +0000] [21] [INFO] Worker exiting (pid: 21)
2018-11-23T19:35:25.623274+00:00 heroku[web.1]: Process exited with status 143
2018-11-23T19:35:25.816061+00:00 heroku[beat.1]: Stopping all processes with SIGTERM
2018-11-23T19:35:25.928498+00:00 heroku[beat.1]: Process exited with status 143
根据我在互联网上发现的信息,由SIGTERM引起的热关机应等待任务完成,但这没有发生。他们只是被杀死。
根据当前行为,我不确定如何进行部署,除非我以某种方式检查没有任何任务正在运行,然后重新启动。
答案 0 :(得分:0)
这里的问题是heroku向芹菜发送了错误的信号,而不是热关机,并被杀死以重新启动。
从芹菜4开始(如果我没记错的话),您可以告诉芹菜听不同的信号。对于我们来说,这很有效。
将您的Procfile
更改为包含REMAP_SIGTERM=SIGQUIT
用于您的工作进程:
celeryworker: REMAP_SIGTERM=SIGQUIT celery -A testproject worker
这将具有芹菜,例如在本地排队的重新排队任务。
要记住:
大约10或20秒后,仍然会有致命的一击。因此,如果您的任务运行时间更长,则必须调整acks_late
。