为啥使用 Celery 运行计划任务比使用 crontab 更可取?

Posted

技术标签:

【中文标题】为啥使用 Celery 运行计划任务比使用 crontab 更可取?【英文标题】:Why would running scheduled tasks with Celery be preferable over crontab?为什么使用 Celery 运行计划任务比使用 crontab 更可取? 【发布时间】:2013-08-13 19:25:38 【问题描述】:

考虑到 Celery 已经是运行任务队列的堆栈的一部分(即,它不仅仅是为了运行 crons 而添加的,恕我直言,这似乎有点过头了)。

作为 crontab 的替代品,它的“周期性任务”功能如何带来好处? 具体找以下几点。

crontab 的主要优点/缺点 celery 比 crontab 更好的用例 Django 特定用例:Celery 与 crontab 运行基于 django 的周期性任务,当 celery 已作为 django-celery 包含在堆栈中以用于排队 django 任务时。

【问题讨论】:

对我来说最重要的事情是 cron 的 env vars 往往与应用程序部署的其余部分有很大不同——wsgi 应用程序服务器和 celery worker。在 celery 中执行定期任务可以避免很多路径和设置地狱。但这完全是一个判断:我的分析主要是针对 django 的代码库和部署设置,但是具有许多其他 cronjobs 的多语言代码库可能会认为 cron 环境比 django 环境“更标准”。 This answer 虽然并不详尽,但在这个方向上提供了一些优点。而且通过 django admin 更容易管理/控制任务,而不是登录服务器并手动编辑 crontab。 【参考方案1】:

我一直在将 cron 用于生产网站,并在当前项目中切换到 celery。 比起 cron,我更喜欢 celery,原因如下:

Celery + Celerybeat 的粒度比 cron 更精细。 Cron 不能每分钟运行一次以上,而 celery 可以(我有一个任务每 90 秒运行一次,它检查一个电子邮件队列以发送消息,另一个任务是清理在线用户列表)。 cron 行必须调用脚本或唯一命令,并带有绝对路径和用户信息。 Celery调用python函数,无需多写代码。 使用 celery,要部署到另一台机器,您通常只需提取/复制您的代码,这通常在一个地方。使用 cron 进行部署需要更多工作(您可以将其自动化,但是...) 我真的发现 celery 比 cron 更适合日常清理(缓存、数据库),通常更适合短期任务。但是,转储数据库对于 cron 来说更像是一项工作,因为您不希望事件队列因太长的任务而变得混乱。 最重要的是,Celery 很容易跨机器分布。

【讨论】:

+1。您可以随时从管理站点添加和管理定期任务,无需连接到服务器控制台。 一些注意事项:当不需要重叠时,经常运行并且可以“重叠”的 Cron 任务应该与flock 一起运行。此类情况下的 Celery 任务应指定到期时间。服务器可能有不同的默认时区,在设置 cron 时应考虑这一点。可以通过 CELERY_TIMEZONE 将 Celery 配置为在应用程序级别使用特定时区。芹菜任务队列消耗内存或磁盘空间:您应该确保队列不会无限增长。 run-parts 可以在一定程度上自动化“使用 cron 部署”【参考方案2】:

Celery 可在您需要在多台机器之间协调作业时指示,确保作业即使在工作组中添加或删除机器时也能运行,能够设置作业的到期时间,使用图形样式定义多步骤作业而不是线性依赖流,或者有一个调度逻辑存储库,在多个操作系统和版本中运行相同。

【讨论】:

以上是关于为啥使用 Celery 运行计划任务比使用 crontab 更可取?的主要内容,如果未能解决你的问题,请参考以下文章

Django Celery 计划任务 django.core.exceptions.ImproperlyConfigured

防止 Celery Beat 运行相同的任务

Celery/redis 任务并不总是完成 - 不知道为啥或如何适应它

为啥 Celery 守护进程看不到任务?

Celery 任务计划(确保一个任务一次只执行一个)

Celery 每日计划任务与 Crontab