【发布时间】:2020-11-18 05:04:08
【问题描述】:
我有一个 Django 项目,它使用 Celery 运行后台任务和计划任务(通过 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)) 将按预期工作。任何有关如何修复或更好地调试此问题的帮助或指示将不胜感激。
【问题讨论】: