芹菜在处理任务时随机失败

Celery randomly fails silently when handling tasks

我有一个 Django 项目,它使用 Celery 运行 后台任务和计划任务(通过 Celery Beat)。它 运行 在本地很好,但在生产中有一些间歇性问题。这是困难的部分,50% 的时间任务按预期完成,但另外 50%,它 'fails' 默默地完成。众多计划任务顺利完成。

版本详情

django = "==2.2.4"
celery = "==4.4.6"

python_version = "3.6"

这是代码的简化示例:

models.py

class Task(models.Model):
    is_actioned = models.BooleanField(default=False...)
    # Other fields...

    def create_lead(self):
        Lead.objects.create(....)

    def create_something_else(self):
        # Add M2M records, for example: lead.add(obj)

    def handle_task(self):
        self.create_lead()
        self.create_something_else()
        # Make various API calls
    
    def action(self):
        self.handle_task()
        self.is_actioned = True
        self.save()

tasks.py

@shared_task
def action_task(task_id):
    tasks = Task.objects.get(id=task_id)
    task.action()

views.py

# Call the task
action_task.delay(task.id)

过程文件

web: daphne -b 0.0.0.0 -p 5000 myproj.asgi:application
worker: celery worker --app=myproj.celery -l debug
beat: celery beat --app=myproj.celery -l info

查看日志时,工作人员似乎没有收到失败的任务。

奇怪的是 Celery 似乎 'select' 哪个方法 fail/skip。比如Task.create_lead会调用成功,但是Task.create_something_else不会调用。然而,self.is_actioned = True 总是 运行 不会失败。我希望这是 'stop' 在它失败的代码中的任何一点而不是 运行 self.is_actioned = True.

我已经检查了服务器内存使用情况,大约为 73%,奇数峰值高达 81%(这似乎有点高?)。 CPU 平均在 1% 到 5% 之间,奇数峰值高达 30%。 action_task 成功完成后,执行需要 5 到 7 秒(根据工作日志)。

action_task 会失败,但是如果没有 intervention/server 从我自己重新启动,下次调用 (action_task.delay(task.id)) 时会按预期工作。非常感谢任何有关如何修复或更好地调试此问题的帮助或指示。

毕竟这是内存问题。在将服务器上的可用 RAM 加倍后(以及 CPU 核心,现在在负载下几乎没有超过 5% 的使用率),内存使用率现在大约为 40% 或 10%。有了额外的内存,Celery 进程 运行 大约 2 周没有问题。

希望这对遇到类似问题的人有所帮助!