使用Celery和RQ的优缺点比较

127

目前我正在开发一个需要实现一些后台任务的Python项目(主要是电子邮件发送和大量数据库更新)。 我使用Redis作为任务代理。 因此,在这一点上,我有两个选择:CeleryRQ。 我对这些作业队列有一些经验,但我想问问你们分享使用这些工具的经验。

  1. 使用Celery或RQ有哪些优缺点?
  2. 使用Celery或RQ适合哪些项目/任务?

Celery看起来非常复杂,但它是一个功能齐全的解决方案。 实际上,我认为我不需要所有这些功能。 另一方面,RQ非常简单(例如配置,集成),但似乎缺少一些有用功能(例如任务撤销,代码自动重新加载)。


3
很抱歉,这类问题不符合本网站的格式,请查看[FAQ#dontask]。这类问题往往会导致模糊的且很快就过时的答案。如果您有具体问题需要帮助解决,请随时发布另一个问题! - Martijn Pieters
顺便说一句,我觉得你甚至可以使用rq-dashboard撤销任务。 - Peter Kilczuk
2个回答

192

以下是在尝试回答这个完全相同的问题时我所找到的内容。它可能不全面,甚至在某些方面可能不准确。

简而言之,RQ旨在全面简化。Celery旨在更加强大。它们都很出色。

  • 文档。 RQ的文档 全面但不复杂,反映了项目的整体简单性 - 你永远不会感到迷失或困惑。 Celery的文档 也很全面,但在初始设置时可能需要多次访问,因为有太多的选项需要内化。
  • 监控。 Celery的FlowerRQ仪表板 都非常简单易用,并且能提供您所需的90%以上的所有信息。
  • 代理支持。 Celery是明显的赢家,RQ仅支持Redis。这意味着较少关于“代理是什么”的文档,但这也意味着如果Redis不再适用于您,则无法在将来切换代理。例如,Instagram考虑了使用Celery的Redis和RabbitMQ。这很重要,因为不同的代理具有不同的保证,例如Redis 目前 无法保证消息的100%传递。
  • 优先级队列。 RQ的优先级队列模型简单而有效 - 工作程序按顺序从队列中读取。 Celery需要启动多个工作程序来消耗不同的队列。两种方法都可以工作。
  • 操作系统支持。Celery是明显的赢家,因为RQ只能在支持fork的系统上运行,例如Unix系统。

  • 语言支持。RQ仅支持Python,而Celery可以让您从一种语言发送任务到另一种语言。

  • API。Celery非常灵活(多个结果后端、良好的配置格式、工作流画布支持),但这种强大往往会让人感到困惑。相比之下,RQ的api非常简单。

  • 子任务支持。Celery支持子任务(例如从现有任务创建新任务)。我不知道RQ是否支持。

  • 社区和稳定性。Celery可能更加成熟,但它们都是活跃的项目。截至撰写本文时,Celery在Github上有约3500颗星,而RQ有约2000颗星,并且两个项目都显示出积极的发展。

我的看法是,Celery并不像它的声誉所表明的那样复杂,但你需要阅读文档。

那么,为什么有人愿意用RQ来换取(可以说更全面的)Celery呢?在我看来,这完全取决于简单性。通过限制自己只使用Redis+Unix,RQ提供了更简单的文档、更简单的代码库和更简单的API。这意味着您(以及潜在的项目贡献者)可以专注于您关心的代码,而不必将任务队列系统的细节记在工作记忆中。我们所有人都有一个可以同时保留多少细节的限制,通过去除需要在其中保留任务队列细节的需求,RQ让您专注于关心的代码。这种简单性以牺牲诸如跨语言任务队列、广泛的操作系统支持、100%可靠的消息保证和轻松切换消息代理等功能为代价。


5
Celery 支持子任务(例如在现有任务中创建新任务)。我不知道 RQ 是否支持。 截至2019年5月24日,RQ也支持子任务(对队列进行内部调用)。 - eserdk
一个小提示:RQ支持传递你自己的连接类,因此如果你想实现Python Redis库的接口(即RedisPipelinePubSub类),那么你可以使用任何代理。 - Kostas Mouratidis

-1

Celery并不是很复杂。在其核心中,您可以从tutorials逐步进行配置,创建一个celery实例,使用@celery.task装饰您的函数,然后使用my_task.delay(*args, **kwargs)运行任务。

根据您自己的评估,似乎您必须在缺少(关键)功能或有一些多余的东西之间做出选择。在我看来,这并不是太难的选择。


63
我完全不同意你的评估。我为了在我的Debian服务器上成功运行Celery而苦苦挣扎了几个星期,即使阅读了大量的文档和博客文章。我遇到的主要问题是,如果你在配置文件中犯了错,Celery不会提供任何有关可能出现的问题的反馈。当我最终让它工作时,我开始在Celery堆栈深处收到某种类型的OSError错误。我在Github上发布了一个问题,但没有人能够帮助我。我再也不想碰Celery了。 - Jim
3
可恶的操作系统错误啊,“没有这个文件或目录”。我不知道该从哪里开始。今晚我要尝试使用RQ,这是我第一次使用它。 - MiniGunnR

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