分布式任务队列(例如Celery)与crontab脚本的区别

120

我不太明白“分布式任务队列”的目的。例如,Python的 celery 库

我知道在 celery 这个 Python 框架中,你可以设置函数按时间窗口执行。但是,在一个指向 Python 脚本的 Linux crontab 中也可以很容易地完成这个功能。

据我所知,并且根据我自己的 Django-celery Web 应用程序所显示的,相对于设置原始 crontab,celery 使用了更多的 RAM 内存。即使是相对较小的应用程序,也有数百 MB 的差异。

请问有人能帮我区分一下吗?或者提供一些高层次解释,介绍任务队列 / crontab 工作原理等等也行。

谢谢。

1个回答

175

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

crontab 能够每隔 N 个间隔执行一次脚本。它运行,然后返回。实际上,每个间隔只有一次执行。您可以直接指示 crontab 执行 django 管理命令并访问整个 django 环境,因此 celery 对此并没有什么帮助。

通过消息队列,celery 提供了分布式任务。许多服务器可以加入工作池,并且每个服务器都可以接收一个工作项而不必担心重复处理。还可以在任务准备好时立即执行任务。使用 cron,您最少需要等待一分钟。

例如,假设您刚刚启动了一个新的 Web 应用程序,并收到了数百个注册,需要向每个用户发送电子邮件。发送电子邮件可能需要很长时间(相对而言),因此您决定通过任务处理激活电子邮件。

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

使用 celery,您将任务添加到队列中。您可以每个服务器拥有多个 worker,因此您已经超越了 cronjob。您还可以拥有几台服务器,从而使您能够扩展更多。同步作为“队列”的一部分进行处理。

可以 将 celery 用作 cron 的替代品,但实际上它的主要用途是在分布式集群中分配异步任务。

当然,celery 还具有比 cron 更多的 功能列表


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接