我想知道它们之间的区别。它们描述的是同一件事吗?
Google App Engine 服务中的任务队列,是消息队列的实现吗?
另一个回复,我收到了Juan Francisco Calderon Zumba的回复。
我的理解是,Celery只是实现事件生产者/消费者的高度抽象。它省去了您需要执行的一些痛苦操作,例如与rabbitmq一起工作。Celery本身不是队列。事件队列存储在您选择的系统中,Celery帮助您在不必从头开始编写生产者/消费者的情况下处理此类事件。
最终,以下是我得出的最终学习成果:
Celery是一个队列封装/框架,它消除了直接操作RabbitMQ时涉及的底层AMQP机制/架构的复杂性。
GAE的任务队列是一种允许应用程序进行后台处理的方式,它们不会像消息队列那样发挥相同的作用。它们是非常不同的东西,提供不同的功能。
消息队列是在进程、线程和系统之间共享信息的机制。
AppEngine任务队列是一种让AppEngine应用程序告诉自己,“我需要做这个,但我将在客户端请求的上下文之外稍后执行它”的方法。
消息队列是消息代理的一部分 - 一个队列的数据结构实现,您可以:
另一方面,任务队列是用于处理任务的:
正如您所看到的,消息队列和任务队列关注不同的方面,它们可能重叠,但不一定。
任务队列的一个示例但不是消息队列 - 如果您的任务不关心排序 - 每个任务不依赖于彼此 - 那么您不需要FIFO数据结构“队列”。您可以,但不必。您只需要一个地方来存储缓冲的任务,例如池、简单的SQL/NoSQL数据库甚至S3都足够了。
相反的例子是推送通知。您使用消息队列,但不一定使用任务队列。服务器生成事件/通知并希望将其传递给客户端。服务器将通知推入队列中。客户端在准备好这样做时从队列中消耗/拉取通知。可使用GCP PubSub、AWS SNS等产品进行此操作。
由于并发控制,任务队列通常比消息队列更复杂,更不用说如果您想进行水平扩展,例如分布式工作器优化并发性。
像Celery这样的工具是任务队列+消息队列融为一体。我所知道的没有像Celery这样同时做两者的工具,猜测这就是它如此受欢迎的原因(在NodeJS中的替代工具是Bull或Bee,如果您知道更多,请告诉我!)。
最近,我的公司不得不实现任务队列。在查找适当的工具时,这两个术语让我非常困惑,因为我有点知道我想要什么,但不知道人们称之为什么以及我应该使用哪些关键字进行搜索。
我个人很少使用AppEngine,无法回答这个问题,但您可以始终检查上述要点,看它是否满足需求。
如果你从浏览器的JavaScript运行环境或Nodejs的JavaScript运行环境来考虑,答案是:
消息队列和微任务队列(例如Promises)之间的区别在于,微任务队列比消息队列具有更高的优先级,这意味着微任务队列中的Promise任务将在消息队列中的回调函数之前执行。