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

时间:2020-07-28 17:18:14

标签: python django celery

我有一个使用Celery运行后台任务和计划任务的Django项目(通过Celery Beat)。它在本地运行良好,但是在生产中存在一些间歇性问题。这是很困难的部分,任务有50%的时间完成了预期的任务,而其他50%的任务却无声地“失败”。众多预定任务可以毫无问题地完成。

版本详细信息

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)

Procfile

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似乎在“选择”失败/跳过的方法。例如,将成功调用Task.create_lead,但不会调用Task.create_something_else。但是,self.is_actioned = True将始终无故障运行。我希望它会在代码失败的任何位置“停止”并且不运行self.is_actioned = True

我检查了服务器的内存使用情况,它位于73%左右,奇数峰值高达81%(这似乎有点高吗?)。 CPU平均介于1%和5%之间,奇数峰值高达30%。 action_task成功完成后,执行时间将在5到7秒之间(根据工作日志)。

action_task将失败,但是随后,如果没有干预/服务器从我自己重新启动,则下一次调用它(action_task.delay(task.id))将会按预期工作。对于如何解决或更好地调试它的任何帮助或指示,将不胜感激。

1 个答案:

答案 0 :(得分:0)

这毕竟是内存问题。将服务器上的可用RAM加倍(并且在负载下勉强达到5%以上的CPU核心)后,内存使用率现在为40%(约占10%)。有了额外的内存,Celery进程已经运行了大约2周,没有任何问题。

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

相关问题