我想知道重新启动 Celery 的最佳方法是什么,而不会在重新启动期间丢失任何任务。
我目前正在使用 celery 提供的 init.d/ 脚本将其作为守护进程运行 - 一切都运行良好。
尽管如此,我需要重新启动它(我想?)才能看到代码更新。我担心的是,如果有人上传了一张照片,而我们想在 celery 重新启动的 5 秒左右的窗口期间对其进行处理,任务将永远丢失,我们将开始看到奇怪的问题。
有没有建议的方法来重新加载芹菜代码而不丢失任何交易?
谢谢,
菲尔
答案1
使用 TERM 信号,您可以安全地重启 celery worker,而不会丢失任何任务。这样 celery 就会结束当前任务并死亡。
如果您希望在出现问题时重试任务,您也可以使用 acks_late 选项(Task.acks_late / CELERY_ACKS_LATE)。
问:如何安全地关闭工作进程?(来自:http://celery.readthedocs.org/en/latest/faq.html#how-can-i-safely-shut-down-the-worker)
答案:使用 TERM 信号,工作进程将完成所有当前正在执行的作业并尽快关闭。不会丢失任何任务。
您永远不应该使用 KILL 信号 (-9) 停止工作程序,除非您尝试过 TERM 几次并等待几分钟让它有机会关闭。就好像您确实在执行过程中终止任务,并且除非您设置了 acks_late 选项 (Task.acks_late / CELERY_ACKS_LATE),否则它们不会重新运行。
要停止工作程序(来自:http://celery.readthedocs.org/en/latest/userguide/workers.html#worker-stopping)
问:停止 worker
应使用 TERM 信号来完成关闭。
要发送 TERM 信号,请使用 Linux 命令 KILL(来自:http://linux.about.com/od/commands/l/blcmdl1_kill.htm)
kill - 终止进程 摘要
kill [ -s 信号 | -p ] [ -a ] [ -- ] pid ... kill -l [ 信号 ] 描述
kill 命令向指定进程或进程组发送指定信号。如果未指定信号,则发送 TERM 信号。TERM 信号将杀死未捕获此信号的进程。对于其他进程,可能需要使用 KILL (9) 信号,因为无法捕获此信号。