发布者/订阅者模型消费者扩展和一致性

时间:2021-05-04 15:35:55

标签: apache-kafka rabbitmq message-queue publish-subscribe

据我所知,发布者/订阅者基于 PUSH 模型,其中消费者声明他们对某个特定事件的兴趣(我更愿意避免在此处使用“主题”一词,以免混淆任何人,甚至是我自己)并订阅队列.因此,来自队列的消息将传递给在此特定队列上订阅的所有消费者。这里的要点是来自 Queue 的消息被推送给消费者,而且这条消息不仅可以传递给一个消费者。这就是发布者/订阅者模型的要点,不是吗? (如果有必要,我强烈建议您调整我的定义)

另一方面,消息队列在两方面有所不同——首先,消费者从队列中拉取信息,对于大多数情况,第二个条款是每条消息将被处理一次,只有一个消费者。 (如果我混淆了,也请调整我的理解)

如果可以,我有几个问题:

  1. 对我来说,根据定义,使用 Pulling 模型实现 Pub/Sub 似乎是不可能的。然而在一些文章中,我曾经看到作者这样说:“Kafka 的发明和最初设计是为了实现消息队列模式,以及发布/订阅” - 等一下,据我所知 Kafka 基于轮询模型,消费者基本上从分区轮询,然后出现一个问题 - 如果消费者从队列中轮询,如何将消息传递给多个消费者?是我误解了什么还是作者声明在本质上是无效的?

  2. 根据 RabbitMQ 文档:

<块引用>

使用 AMQP 0-9-1,可以使用 basic.get 协议方法。按 FIFO 顺序获取消息。它 可以使用自动或手动确认,就像 与消费者(订阅)。

非常不鼓励一一获取消息,因为它非常 与普通的长寿消费者相比,效率低下。与任何 基于轮询的算法,在系统中会非常浪费 消息发布是零星的,队列可以保持为空 很长一段时间。

2.1) 同时在我的脑海中出现了几个问题——你为什么要创建一个用于消费的 API,消费者一次只能消费一条消息?以Apache Kafka为例,你可以批量消费,那么,为什么在RabbitMQ中就不是这样了(或者可能是这样,但我简单不知道什么)?是否有任何限制或类似的东西?

2.2) 在文档中,基本上说轮询方法效率很低。所以,如果我们一次只消费一条消息,那么,让我们暂时假设 RabbitMQ 可以像 Kafka 一样批量消费消息。 Kafka 在高负载下表现出色,基本上是轮询。我知道不同代理上的分区、复制,这对于可扩展性非常重要,但无论如何 - 他们可以宣布这样的事情吗?我的意思是宣布轮询效率低下。因为我不能同时记住两件事 - 一方面,RabbitMQ 文档表明轮询本身作为一种从队列获取消息的方式效率低下,另一方面我们有 Kafka - 它是如何工作的?

  1. 是否可以扩展 Push 模型?我的意思是,让我们假设我们有一个队列,它将消息推送给消费者。对我来说(特别是如果我们希望一条消息只处理一次)实际上不可能横向扩展它,不是吗?

非常感谢您的帮助,看来我很困惑...

0 个答案:

没有答案