【问题标题】:Can multiple Kafka consumers read same message from the partition多个 Kafka 消费者可以从分区中读取相同的消息吗
【发布时间】:2016-06-04 07:41:09
【问题描述】:

我们计划编写一个 Kafka 消费者(java),它读取 Kafka 队列以执行消息中的操作。

由于消费者独立运行,消息是否一次只由一个消费者处理?否则所有消费者处理相同的消息,因为他们在分区中有自己的偏移量。

请帮助我理解。

【问题讨论】:

  • 看起来 kafka 没有队列。它只有主题
  • 所有 kafka 主题都是有序集——换句话说,它们是队列。
  • Kafka topics 不是队列,因为一旦从 topic 消费了一条消息,它就会停留在那里(除非它的生命周期已过期)并且 offset 移动到下一个,而对于一个队列,一旦消息被消费,该消息就会从该队列中删除。订购的套装也仅限partitions

标签: apache-kafka kafka-consumer-api


【解决方案1】:

这取决于Group ID。假设您有一个包含 12 个分区的主题。如果您有 2 个具有相同组 ID 的 Kafka 消费者,他们将读取 6 个分区,这意味着他们将读取不同的分区集 = 不同的消息集。如果您有 4 个具有相同 Group Id 的 Kafka cosnumer,则每个人都将读取三个不同的分区等。

但是当你设置不同的 Group Id 时,情况就发生了变化。如果您有两个具有不同组 ID 的 Kafka 消费者,他们将读取所有 12 个分区,而彼此之间没有任何干扰。这意味着两个消费者将独立阅读完全相同的一组消息。如果您有四个具有不同组 ID 的 Kafka 消费者,他们都会读取所有分区等。

【讨论】:

  • 您不能通知其他消费者一条消息没有被正确处理。但是,如果一个消费者失败了,另一个消费者将接替他的工作。含义:如果你有 12 个分区和 3 个具有相同 Group Id 的消费者,则每个消费者读取 4 个分区。如果一个消费者失败,rebalancing 发生,现在两个活着的消费者将读取 6 个分区。请注意,如果您不在每条消息后更新偏移量,您可能会多次阅读某些消息。
  • 2) 偏移量由主题、分区和组 id 定义。具有相同组 id 的活着的消费者可以检索偏移量,因为他们阅读相同的主题并且具有相同的组 id。
  • @FaizHalde:在我们的例子中:首先,我们使用每条消息进行实时处理,然后当我们将消息从 Kafka 传输到 HDFS 以进行进一步分析时,我们第二次使用同一组消息。一般来说,如果你有多个微服务,每个微服务都可以读取相同的消息并用它们做不同的事情。
  • 当同一个组中有更多的消费者,比如说14个,而只有12个分区会发生什么?多余的消费者还能连接到 Kafka 吗?
  • @BiancaTesila 剩下的两个消费者将被连接,但他们什么也不读。基本上他们是不活跃的。
【解决方案2】:

我发现这张来自 OReilly 的图片很有帮助:

在同一组内:

  • 同一组 (Group 1) 中的两个消费者 (Consumer 1, 2) 不能 从分区 (分区 0)。

跨不同组:

  • 两组中的两个消费者(Group 1 中的Consumer 1Group 2 中的Consumer 1)CAN 从分区(Partition 0)消费相同的消息。

【讨论】:

    【解决方案3】:

    Kafka 会将订阅主题中的每条消息传递给每个消费者组中的一个进程。这是通过平衡消费者组中所有成员之间的分区来实现的,以便每个分区都分配给组中的一个消费者。从概念上讲,您可以将消费者组视为恰好由多个进程组成的单个逻辑订阅者。

    简而言之,每个消费者组仅由一个消费者进程处理 Kafka 消息/记录。因此,如果您希望多个消费者处理消息/记录,您可以为消费者使用不同的组。

    【讨论】:

    • 非常感谢。这有助于我了解消费者群体背后的真正目的。
    猜你喜欢
    • 2022-06-13
    • 1970-01-01
    • 2021-11-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-04
    • 2021-10-26
    • 2017-08-25
    相关资源
    最近更新 更多