首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >解决celerybeat是单点故障的问题

解决celerybeat是单点故障的问题
EN

Stack Overflow用户
提问于 2012-02-15 08:18:53
回答 1查看 1.2K关注 0票数 18

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

在我的例子中,一天一次的定时调度程序会启动一系列作业,这些作业可能会运行半天或更长时间。由于只能有一个celerybeat实例,因此如果该实例或运行该实例的服务器发生了什么情况,则关键作业将不会运行。

我希望已经有了一个有效的解决方案,因为我不可能是唯一一个需要可靠(集群或类似的)调度器的人。如果没有必要的话,我不想求助于某种数据库支持的调度器。

EN

回答 1

Stack Overflow用户

发布于 2012-10-18 23:28:20

在celery github repo中有一个关于这方面的公开问题。我不知道他们是否在做这件事。

作为一种解决办法,您可以为任务添加一个锁,以便一次只运行特定PeriodicTask的一个实例。

类似于:

代码语言:javascript
复制
if not cache.add('My-unique-lock-name', True, timeout=lock_timeout):
    return

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

然后,您可以在所有计算机上使用celerybeat实例。每个任务将为每个celerybeat实例排队,但其中只有一个任务将完成运行。

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

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

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

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

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

当然,要做到这一点,需要为所有服务器复制和/或共享缓存后端。

这是一个古老的问题,但我希望它能帮助任何人。

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9286221

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档