分布式任务队列(例如芹菜)与 crontab 脚本

我很难理解“分布式任务队列”的用途,例如,python 的 芹菜图书馆

我知道在 python 框架芹菜中,可以为函数设置执行时间窗口。但是,这也可以很容易地在直接针对 python 脚本的 linux crontab 中完成。

据我所知,从我自己的 Django-celery 网络应用程序中可以看出,芹菜消耗的内存要比仅仅设置一个原始的 crontab 要多得多。对于一个相对较小的应用程序,几百 MB 的差异。

有人能帮我区分一下吗?也许对任务队列/crontab 如何一般工作的高级解释也会很好。

谢谢你。

17783 次浏览

这取决于您希望您的任务做什么,是否需要分发它们,以及您希望如何管理它们。

Crontab 能够每 N 个间隔执行一个脚本。它运行,然后返回。实际上,每个时间间隔只有一次执行。您可以直接使用 crontab 来执行 django 管理命令并访问整个 django 环境,因此芹菜在这方面并没有实际帮助。

在消息队列的帮助下,芹菜为表带来的是分布式任务。许多服务器可以加入工作者池,每个服务器接收一个工作项,而不用担心双重处理。也可以在任务准备好的时候立即执行它。对于 cron,您被限制为最少一分钟。

As an example, imagine you've just launched a new web application and you're receiving hundreds of sign ups that require an email to be sent to each user. Sending an email may take a long time (comparatively) so you decide that you'll handle activation emails via tasks.

如果您使用 cron,则需要确保每一分钟 cron 都能够处理需要发送的所有电子邮件。如果你有几个服务器,你现在需要确保你没有发送多个激活电子邮件给同一个用户-你需要某种同步。

对于芹菜,可以向队列添加任务。每个服务器可能有几个工作人员,因此您已经超越了一个错误任务。您可能还有几个服务器,允许您扩展更多。同步作为“队列”的一部分进行处理。

您使用芹菜作为 cron 的替代品,但这并不是它的主要用途。它用于在分布式集群中分配异步任务。

And of course, celery has a 一大堆特征 that cron does not.