Rabbitmq 为什么芹菜需要消息代理?

Rabbitmq 为什么芹菜需要消息代理?,rabbitmq,celery,job-queue,celery-broker,Rabbitmq,Celery,Job Queue,Celery Broker,由于芹菜是一个作业队列/任务队列,所以它的名称说明它可以维护和处理任务。那么为什么它需要像rabbitmq或redis这样的消息代理呢?芹菜是一种分布式任务队列,这意味着系统可以通过一条集中总线跨多个位置驻留在多台计算机(容器)上 基本架构如下所示: 工作者-可以从总线(任务队列)获取作业(数据)并对其进行处理的进程 *它可以将结果放回总线,以便其他工作人员进一步处理(创建处理流) 总线-任务队列,这基本上是一个数据库,将作业存储为消息,以便工作人员可以检索它们 实现一个并发的、非阻塞的数据库是

由于芹菜是一个作业队列/任务队列,所以它的名称说明它可以维护和处理任务。那么为什么它需要像rabbitmq或redis这样的消息代理呢?

芹菜是一种分布式任务队列,这意味着系统可以通过一条集中总线跨多个位置驻留在多台计算机(容器)上

基本架构如下所示:

工作者-可以从总线(任务队列)获取作业(数据)并对其进行处理的进程

*它可以将结果放回总线,以便其他工作人员进一步处理(创建处理流)

总线-任务队列,这基本上是一个数据库,将作业存储为消息,以便工作人员可以检索它们

实现一个并发的、非阻塞的数据库是很重要的,因此当一个进程从总线上获取或放置作业时,它不会阻止其他工作人员获取/放置他们的作业

RabbitMQ
Redis
ActiveMQ
Kafka
,这些都是这种行为的最佳候选者

总线有一个api,允许为工人提交作业并检索它们(在更复杂的功能中)

大多数总线都实现了确认/失败功能,因此工作人员可以确认他们正在完成的工作,或者如果没有确认(或报告失败),该消息可以再次发送给另一个工作人员,并且这次可能会成功处理,因此不会丢失任何数据…(这在很大程度上取决于故障转移逻辑和作为任务输入的数据上下文)

芹菜
包括一个
调度程序
节拍),它定期在总线上放置特定作业,从而创建一个定期任务

让我们举一个报废的例子,你想报废世界,但中国只能允许来自该地区的交通,欧洲和美国也是如此 因此,你可以建立一个工人和地方,他们在世界各地

您只能使用一条总线,假设它位于美国,所有其他工人都知道这条总线并可以连接到它,因此,通过在位于美国的总线上放置特定作业(报废中国),中国的流程可以在其上工作,因此是分布式的

当然,工作人员将增加系统的吞吐量,这仅仅是由于并行性,与他们的地理位置无关,这是使用事件驱动架构(即中央总线、消费者和生产者)的常见情况


我建议阅读正式的,非常直接的分布式任务队列。你能解释一下分布式任务队列吗?我有一个问题,我不明白rabbitmq队列和芹菜队列的区别是什么,它们是相同的还是不同的?TnxTom@TomislavMikulin是和否,芹菜管理作业队列,此队列的实现取决于代理类型,它可能使用rabbitmq队列或redis列表来实现,甚至其他一些数据结构也取决于代理,当我们在rabbitmq上下文中使用芹菜时,“总线-任务队列”正如您在回答中提到的,它是rabbitmq队列还是芹菜队列?总线是rabbit(队列),芹菜公开了一个透明的api,即添加到队列、从队列中获取和such@shahaf问题是关于芹菜和兔子的。从答案来看,我们不清楚何时使用RabbitMQ。我在答案中加入了兔子。请让我知道它是否正确。