我有 ETA 任务发送到 Celery 的 Redis 代理。它是一个 celery 和 redis 实例,两者都在同一台机器上。
问题是,任务被执行多次。我见过任务执行了 4 到 11 次。
鉴于我的预计到达时间在 4-11 小时之间(在运行时确定),我将可见性超时设置为 12 小时:
BROKER_TRANSPORT_OPTIONS = {'visibility_timeout': 12 * 60 * 60}
即使如此,任务仍然会被执行多次。
最初,所讨论的任务不是幂等的,因此我尝试添加数据库检查以使其具有幂等性。
它看起来像这样:
@app.task
def foo(side_effect_action):
if side_effect_action.executed:
return ALREADY_EXECUTED
else:
do_side_effect()
side_effect_action.executed = True
side_effect_action.save() #hits the db
return JUST_EXECUTED
事实证明,芹菜工作人员在 foo 能够调用之前就完成了任务side_effect_action.save()
并保存状态,所以在所有情况下,当它寻找side_effect_action.executed
它仍然是 False,因此被执行多次。
我有什么想法可以解决这个问题吗?
我将我的 celery 代理切换到 RabbitMQ 以避免这个问题。不幸的是,因为我的 web 应用程序中现在多了一个组件(我仍然需要 redis 来做其他事情),但它确实解决了 ETA 任务的多次执行错误。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)