【问题标题】:Celery Does Not Process Task in Kubernetes with RedisCelery 不使用 Redis 在 Kubernetes 中处理任务
【发布时间】:2018-06-25 16:38:33
【问题描述】:

我正在运行一个包含三个 Celery pod 的 Kubernetes 集群,使用单个 Redis pod 作为消息队列。 Celery 版本 4.1.0,Python 3.6.3,来自 helm 的标准 Redis pod。

在看似快速涌入的任务中,Celery pod 停止处理任何任务。他们在最初的几个任务中会很好,但最终会停止工作,我的任务会挂起。

我的任务遵循以下格式:

@app.task(bind=True)
def my_task(some_param):
    result = get_data(some_param)

    if result != expectation:
        task.retry(throw=False, countdown=5)

而且一般排队如下:

from my_code import my_task
my_task.apply_async(queue='worker', kwargs=celery_params)

deployment.yaml的相关部分:

command: ["celery", "worker", "-A", "myapp.implementation.celery_app", "-Q", "http"]

此集群与我使用docker-compose 管理的本地集群之间的唯一区别是集群运行prefork 池,而我在本地运行eventlet 池以便能够将代码放在一起覆盖报告。我已经尝试在集群上运行eventlet,但我看不出结果有什么不同,任务仍然挂起。

在 Kubernetes 中运行 Celery 工作器有什么我遗漏的吗?是否存在可能影响我的结果的错误?有什么好的方法可以闯入集群,看看这个问题到底发生了什么?

【问题讨论】:

    标签: python python-3.x redis kubernetes celery


    【解决方案1】:

    在没有apply_async 的情况下运行 celery 任务允许我调试此问题,表明 Celery 任务中存在并发逻辑错误。我强烈推荐这种调试 Celery 任务的方法。

    代替:

    from my_code import my_task
    
    celery_params = {'key': 'value'}
    my_task.apply_async(queue='worker', kwargs=celery_params)
    

    我用过:

    from my_code import my_task
    
    celery_params = {'key': 'value'}
    my_task(**celery_params)
    

    这使我能够找到并发问题。找到错误后,我将代码转换回使用apply_async 的异步方法调用。

    【讨论】:

    • 在任一任务更新自己的资源之前,两个任务正在检查彼此的资源
    猜你喜欢
    • 2019-11-20
    • 2020-11-08
    • 2018-06-03
    • 2013-06-15
    • 2012-01-22
    • 2018-08-06
    • 2015-12-18
    • 2018-05-03
    • 2013-08-23
    相关资源
    最近更新 更多