【问题标题】:How can I properly kill a celery task in a kubernetes environment?如何在 Kubernetes 环境中正确终止 celery 任务?
【发布时间】:2021-06-22 06:44:35
【问题描述】:

如何正确终止在 kubernetes 环境中的容器上运行的 celery 任务?整个应用的结构(全部用Python编写)如下:

  1. 向我们的 API 发出请求的 SDK;

  2. 一种 Kubernetes 结构,其中一个 pod 运行 API,其他 pod 运行 celery 容器,以处理一些可由 API 触发的长时间运行的任务。这些 celery 容器自动缩放。

假设我们调用一个 SDK 方法,该方法反过来向 API 发出请求,触发在 celery 容器上运行的任务。如果需要,终止此任务的正确/优雅方法是什么?我知道 celery 任务有一个 revoke() 方法,但我尝试使用这种方法但它不起作用,即使使用 terminate=Truesignal=signal.SIGKILL (可能这与我使用 Azure 服务的事实有关巴士作为经纪人?)

也许 celery 任务与其对应容器名称之间的映射会有所帮助,但我也找不到获取此信息的方法。

任何帮助和/或想法将不胜感激。

【问题讨论】:

  • 请问您为什么要撤销/终止任务?是由于应用原因(如不相关的任务)还是架构限制?
  • 这是由于任务可能卡住和/或用户想要取消其执行
  • 你能加点努力吗?你试过的撤销码sn-p?
  • 非常抱歉迟到的答案,@ItayB。我找到了一个使用在 API 和 celery 容器之间共享的文件的解决方案。我在下面的回答中更详细地描述了它。尽管如此,还是非常感谢!

标签: python kubernetes containers celery


【解决方案1】:

我找到的解决方案是写入 API 和 Celery 容器共享的文件。在此文件中,每当捕获到中断时,都会将标志设置为true。在芹菜容器内,我会定期检查此类文件的内容。如果标志设置为true,那么我会优雅地清理并引发错误。

【讨论】:

    猜你喜欢
    • 2015-10-17
    • 1970-01-01
    • 2012-04-12
    • 2013-06-24
    • 2019-11-29
    • 2018-01-20
    • 1970-01-01
    • 2012-02-20
    • 2018-07-06
    相关资源
    最近更新 更多