gpt4 book ai didi

celery - 解决 celerybeat 的单点故障问题

转载 作者:行者123 更新时间:2023-12-03 04:22:13 41 4
gpt4 key购买 nike

我正在寻找推荐的解决方案来解决 celerybeat 成为 celery/rabbitmq 部署的单点故障的问题。到目前为止,通过搜索网络,我没有找到任何有意义的东西。

就我而言,定时调度程序每天启动一次可以运行半天或更长时间的一系列作业。由于只能有一个 celerybeat 实例,如果它或其运行的服务器发生问题,关键作业将不会运行。

我希望已经有一个可行的解决方案,因为我不能是唯一需要可靠(集群或类似)调度程序的人。如果不需要的话,我不想诉诸某种数据库支持的调度程序。

最佳答案

celery github 存储库中有一个关于此的未决问题。不知道他们是否正在努力。

作为一种解决方法,您可以为任务添加锁,以便一次仅运行特定 periodictask 的 1 个实例。

类似于:

if not cache.add('My-unique-lock-name', True, timeout=lock_timeout):
return

弄清楚锁定超时是一件很棘手的事情。如果不同的 celerybeats 尝试在不同的时间运行它们,我们将使用 0.9 * 任务 run_every 秒。0.9 只是为了留出一些余量(例如,当 celery 稍微落后于计划一次时,那么它会按计划进行,这将导致锁仍然处于事件状态)。

然后你就可以在所有机器上使用celerybeat实例了。每个任务都会为每个 celerybeat 实例排队,但其中只有一个任务会完成运行。

任务仍将以这种方式尊重 run_every - 最坏的情况:任务将以 0.9*run_every 速度运行。

这种情况下的一个问题:如果任务已排队但未在计划时间处理(例如,因为队列处理器不可用),则可能会在错误的时间放置锁,从而可能导致下一个任务根本无法运行。为了解决这个问题,您需要某种检测机制,无论任务是否准时。

不过,在生产中使用时这不应该是常见情况。

另一个解决方案是子类化 celerybeat Scheduler 并重写其 tick 方法。然后在处理任务之前为每个刻度添加一个锁。这确保只有具有相同周期性任务的 celerybeats 不会多次对相同的任务进行排队。每个tick只有一个celerybeat(赢得竞争条件的人)会对任务进行排队。在一个 celery 节拍下降时,下一个节拍另一个将赢得比赛。

这当然可以与第一个解决方案结合使用。

当然,要实现此功能,需要为所有服务器复制和/或共享缓存后端。

这是一个老问题,但我希望它对任何人都有帮助。

关于celery - 解决 celerybeat 的单点故障问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9286221/

41 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com