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

时间:2012-04-09 15:49:05

标签: google-app-engine message-queue

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

Google App Engine服务Task Queue是Message Queue的实现吗?

5 个答案:

答案 0 :(得分:8)

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

我问道:

  

说#芹草是一个什么是合适的   QueueWrapper / QueueFramework消除了拥有的复杂性   管理内部queueManagement / queueAdministration活动   等&#34 ;?

     

我理解书中的语言" Celery是一个任务队列"和   " RabbitMQ是一个消息代理"。但是,这看起来有点令人困惑   作为第一次使用芹菜的用户,因为我们一直都知道RabbitMQ   成为队列'。

     

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

A response我来自 Abu Ashraf Masnun

  

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

     

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

     

让我们暂时忘掉芹菜。我们来谈谈RabbitMQ。什么   我们通常会这样做吗?我们的Django / Flask应用程序会向一个消息发送消息   队列。我们将有一些工人正在等待新工作   某些队列中的消息。当新消息到达时,它将启动   工作和处理任务。

     

Celery精心管理整个过程。我们不再需要   学习或担心AMQP或RabbitMQ的细节。我们可以使用Redis   甚至是数据库(例如MySQL)作为消息代理。芹菜   允许我们定义"任务"与我们的工人代码。当我们需要做的时候   在背景(甚至是前景)中的东西,我们可以打电话   此任务(用于即时执行)或安排此任务延迟   处理。 Celery会处理传递和运行的消息   任务。它会启动那些知道如何管理你的员工   定义任务并存储结果。所以你以后可以查询任务   结果甚至是需要时的任务进度。

     

你也可以使用芹菜作为cron工作的替代品(虽然我不会   非常喜欢它!)

Another response我来自 Juan Francisco Calderon Zumba

  

我的理解是芹菜只是一个非常高的水平   抽象实现事件的生产者/消费者。它需要   你需要做的几件痛苦的事情,例如   RabbitMQ的。芹菜本身不是队列。事件队列存储   在您选择的系统中,芹菜可以帮助您使用   无需从头开始编写生产者/消费者的事件。

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

  

Celery是一个队列包装/框架,它消除了复杂性   必须管理即将到来的基础AMQP机制/架构   直接操作RabbitMQ

答案 1 :(得分:3)

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

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

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

答案 2 :(得分:0)

如果您以浏览器的JavaScript运行时环境或Nodejs JavaScript运行时环境来看,答案是:

消息队列微任务队列(例如 Promise )之间的差异是,微任务队列具有较高的优先级高于消息队列,这意味着微任务队列中的Promise任务将在消息队列中的回调之前执行。

答案 3 :(得分:0)

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

答案 4 :(得分:0)

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

消息队列

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

  1. 入队/生产/推送/发送(根据平台不同的术语,但指同一事物)消息到。
  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,所以无法回答这个问题,但您可以随时检查以上几点,看看它是否满足要求。