【问题标题】:Same task executed multiple times多次执行相同的任务
【发布时间】:2014-03-01 08:36:53
【问题描述】:

我有 ETA 任务被发送到 Celery 的 Redis 代理。它是单个 celery 和 redis 实例,都在同一台机器上。

问题是,任务被多次执行。我见过任务执行了 4 到 11 次。

鉴于我的 ETA 介于 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

事实证明,celery 工作人员在 foo 能够调用 side_effect_action.save() 并保存状态之前到达任务,因此在所有情况下,当它正在寻找 side_effect_action.executed 时,它仍然是 False,因此会被执行多次。

有什么想法可以解决这个问题吗?

【问题讨论】:

标签: python redis celery


【解决方案1】:

我将 celery 代理切换到 RabbitMQ 以避免这个问题。不幸的是,我现在的 web 应用程序中多了一个组件(我仍然需要 redis 来做其他事情),但它确实解决了 ETA 任务的多次执行错误。

【讨论】:

    猜你喜欢
    • 2014-09-14
    • 2021-09-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多