我想知道它们之间有什么区别。他们是在描述同样的事情吗?
Google App Engine服务Task Queue是Message Queue的实现吗?
答案 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)
可能因上下文而异,但以下是我的理解:
消息队列是消息代理部分——一个队列数据结构的实现,你可以:
另一方面,任务队列是处理任务:
如您所见,消息队列和任务队列侧重于不同的方面,它们可以重叠,但不一定。
一个任务队列而不是消息队列的例子——如果你的任务不关心排序——每个任务不相互依赖——那么你不需要“队列”,FIFO数据结构。你可以,但你没有必要。您只需要一个地方来存储缓冲任务,例如池、简单的 SQL/NoSQL 数据库甚至 S3 就足够了。
相反的例子是推送通知。您使用消息队列但不一定使用任务队列。服务器生成事件/通知并希望将它们传递给客户端。服务器将在队列中推送通知。当客户端准备好这样做时,它们会从队列中使用/拉下通知。 GCP PubSub、AWS SNS 等产品可用于此目的。
由于并发控制,任务队列通常比消息队列更复杂,更不用说如果你想要横向扩展,比如跨节点分配工作线程来优化并发。
像 Celery 这样的工具是任务队列 + 消息队列合二为一。据我所知,像 Celery 这样的工具并不多见,这就是为什么它如此受欢迎(NodeJS 中的 Bull 或 Bee 替代品,或者如果您知道更多,请告诉我!)。
我的公司最近不得不实施一个任务队列。在谷歌搜索合适的工具时,这两个术语让我很困惑,因为我有点知道我想要什么,但不知道人们怎么称呼它以及我应该用什么关键字来搜索。
我个人并没有经常使用 AppEngine,所以无法回答这个问题,但您可以随时检查以上几点,看看它是否满足要求。