消息队列与任务队列的区别

Rud*_*udy 17 google-app-engine message-queue

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

Google App Engine服务任务队列是Message Queue的实现吗?

Rak*_*kib 12

我在Facebook上的一些开发者社区群组中提出了类似的问题.这不是专门针对GoogleAppEngine的 - 我更多地要求确定RabbitMQ和Celery之间的用例.以下是我认为与主题相关的响应,并明确说明了消息队列和任务队列之间的区别.

我问:

是否适当地说"Celery是QueueWrapper/QueueFramework,它消除了必须管理内部队列管理/队列管理活动等的复杂性"?

我理解书中的语言"Celery是一个任务队列"和"RabbitMQ是一个消息代理".然而,作为第一次使用芹菜的用户似乎有点混乱,因为我们总是将RabbitMQ称为"队列".

请帮助解释芹菜与RabbitMQ的对比方式/用途

的响应,我从拿到阿布阿什拉夫Masnun

任务队列和消息队列.RabbitMQ是一个"MQ".它接收消息并传递消息.

芹菜是一个任务队列.它接收任务及其相关数据,运行它们并提供结果.

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

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

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

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

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

最后,这是我最后学习的内容:

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


Sha*_*eng 9

根据上下文可能会有所不同,但以下是我的理解:

消息队列

消息队列是消息代理部分 - 队列数据结构实现,您可以在其中:

  1. 排队/生产/推送/发送(不同的术语取决于平台,但指的是同一件事)消息。
  2. 出队/使用/拉取/接收消息。
  3. 提供先进先出排序。

任务队列

任务队列则是处理任务的:

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

他们的区别

可以看到,消息队列和任务队列侧重于不同的方面,它们可以重叠,但不一定。

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

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

带走

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

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

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

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


Ada*_*and 5

GAE的任务队列是允许应用程序进行后台处理的一种方法,它们不会起到与消息队列相同的作用。它们是完全不同的事物,具有不同的功能。

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

AppEngine任务队列是AppEngine应用程序自言自语的一种方式,我需要这样做,但是稍后将在客户端请求的上下文之外进行操作。

  • App Engine上的消息队列和拉入队列之间没有功能上的区别(我知道)。 (3认同)