31

我想知道它们之间有什么区别。他们描述的是同一件事吗?

Google App Engine 服务任务队列是消息队列的实现吗?

4

5 回答 5

35

我在 Facebook 上的一些开发者社区组上问了一个类似的问题。这与 GoogleAppEngine 无关——我更笼统地要求确定 RabbitMQ 和 Celery 之间的用例。以下是我得到的回复,我认为这些回复与该主题相关,并且清楚地阐明了消息队列和任务队列之间的区别。

我问:

是否可以说“Celery 是一个 QueueWrapper/QueueFramework,它消除了必须管理内部 queueManagement/queueAdministration 活动等的复杂性”?

我理解书中的语言“Celery 是一个任务队列”和“RabbitMQ 是一个消息代理”。然而,作为第一次使用 celery 的用户,这似乎有点令人困惑,因为我们一直都知道 RabbitMQ 是“队列”。

请帮助解释芹菜与rabbitMQ对比的方式/作用

我从Abu Ashraf Masnun得到的回复

任务队列和消息队列。RabbitMQ 是一个“MQ”。它接收消息并传递消息。

Celery 是一个任务队列。它接收任务及其相关数据,运行它们并交付结果。

让我们暂时忘记芹菜。我们来谈谈 RabbitMQ。我们通常会做什么?我们的 Django/Flask 应用程序将向队列发送消息。我们将运行一些工作人员,它们将在某些队列中等待新消息。当新消息到达时,它开始工作并处理任务。

Celery 完美地管理了整个过程。我们不再需要学习或担心 AMQP 或 RabbitMQ 的细节。我们可以使用 Redis 甚至数据库(例如 MySQL)作为消息代理。Celery 允许我们用工人代码定义“任务”。当我们需要在后台(甚至前台)做某事时,我们可以调用这个任务(即时执行)或者调度这个任务进行延迟处理。Celery 将处理消息传递和运行任务。它将启动知道如何运行您定义的任务并存储结果的工作人员。因此,您可以稍后在需要时查询任务结果甚至任务进度。

您也可以使用 Celery 作为 cron 工作的替代品(尽管我不太喜欢它)!

我从Juan Francisco Calderon Zumba得到的另一个回应

我的理解是 celery 只是一个非常高层次的抽象来实现事件的生产者/消费者。它消除了您需要做的一些痛苦的事情,例如使用 rabbitmq。芹菜本身不是队列。事件队列存储在您选择的系统中,celery 可以帮助您处理此类事件,而无需从头开始编写生产者/消费者。

最终,这是我带回家作为我最终学习的内容:

Celery 是一个队列包装器/框架,它消除了必须管理底层 AMQP 机制/架构的复杂性,这些机制/架构与直接操作 RabbitMQ

于 2015-11-16T07:26:18.320 回答
8

GAE 的任务队列是一种允许应用程序进行后台处理的方法,它们的用途与消息队列不同。它们是非常不同的东西,具有不同的功能。

消息队列是一种在进程、线程、系统之间共享信息的机制。

AppEngine 任务队列是 AppEngine 应用程序对自己说的一种方式,我需要这样做,但我稍后会在客户端请求的上下文之外执行它。

于 2012-04-09T16:19:02.560 回答
7

可能因上下文而异,但以下是我的理解:

消息队列

消息队列是消息代理的一部分——一个队列数据结构的实现,在这里你可以:

  1. Enqueue/produce/push/send(根据平台不同的术语,但指的是同一个东西)消息。
  2. 出列/消费/拉取/接收消息。
  3. 提供 FIFO 排序。

任务队列

另一方面,任务队列是处理任务:

  1. 以理想的速度 - 您的系统可以同时处理多少个任务?可能取决于您机器上的 CPU 内核数量,或者如果您在 Kubernetes 上,则取决于节点数量及其大小。它是关于并发控制,或者不那么酷的术语,“缓冲”。
  2. 以异步方式 - 非阻塞任务处理。在后台处理任务,因此您的主进程可以在启动任务后执行其他操作。HTTP 上的服务器 API 是一个流行的用例,您希望快速响应客户端,因为 HTTP 请求通常有很短的超时时间(<= 30 秒),尤其是当您的 API 由最终用户触发时(人类不耐烦)。如果您的任务花费的时间超过几秒钟,您需要考虑将其置于后台,并给出一个 API 响应,例如“好的,我收到了您的请求,我会在有时间时处理它”。

他们的区别

如您所见,消息队列和任务队列关注的方面不同,它们可以重叠,但不一定。

任务队列而不是消息队列的示例 - 如果您的任务不关心排序 - 每个任务不相互依赖 - 那么您不需要“队列”,FIFO数据结构。你可以,但你不必这样做。你只需要一个地方来存储缓冲任务,比如一个池、一个简单的 SQL/NoSQL 数据库,甚至 S3 就足够了。

一个相反的例子是推送通知。您使用消息队列但不一定使用任务队列。服务器生成事件/通知并希望将它们传递给客户端。服务器将在队列中推送通知。当客户端准备好这样做时,客户端会从队列中消费/拉下通知。GCP PubSub、AWS SNS 等产品可用于此目的。

带走

由于并发控制,任务队列通常比消息队列更复杂,更不用说您是否想要水平扩展,例如跨节点分配工作人员以优化并发性。

像 Celery 这样的工具是任务队列 + 消息队列合二为一。据我所知,像 Celery 这样的工具并不多,我猜这就是它如此受欢迎的原因(NodeJS 中的替代品是 Bull 或 Bee,或者如果你知道更多,请告诉我!)。

我的公司最近不得不实施一个任务队列。在谷歌搜索合适的工具时,这两个术语让我很困惑,因为我知道我想要什么,但不知道人们如何称呼它以及我应该搜索什么关键字。

我个人没有太多使用 AppEngine,所以无法回答这个问题,但您可以随时检查以上几点,看看它是否满足要求。

于 2021-08-11T20:06:07.403 回答
0

如果我们只谈论功能,那么就很难辨别其中的区别。在我的公司,由于我们在两者之间的误解,我们尝试并惨遭失败。我们创建我们的工作队列(又名任务队列,又名调度程序,又名 cron),并将其用于长轮询。我们将任务计划设置为未来 5 秒(延迟)以触发轮询代码。该代码触发一个请求并检查响应。如果条件不满足,我们将再次创建一个任务来扩展轮询,否则不会扩展。这是一个数据库、网络和计算密集型。我们的新用例需要快速响应,我们必须将延迟减少到 0.1,这会导致每次轮询的大量浪费。所以这是技术实现相同目标但熟练程度不同的主要示例所以答案是主要区别在于消息队列和任务队列试图实现的目标。好读: https://stackoverflow.com/a/32804602/3422861

于 2021-07-13T03:14:09.677 回答
-1

如果从浏览器的 JavaScript 运行环境或 Nodejs JavaScript 运行环境的角度来考虑,答案是:

消息队列微任务队列(如Promises )的区别在于微任务队列的优先级高于消息队列,也就是说微任务队列里面的Promise任务会在里面的回调之前执行消息队列。

于 2020-02-03T10:07:28.290 回答