芹菜在处理任务时随机失败
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 周没有问题。
希望这对遇到类似问题的人有所帮助!
我有一个 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 周没有问题。
希望这对遇到类似问题的人有所帮助!