如何并行化 Kafka 消费者

830 阅读4分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 26 天,点击查看活动详情

Kafka 是一个异步消息队列。Kafka 消费者,消费来自 Kafka 的消息并进行一些处理,如更新数据库或进行网络调用。如果您对 Kafka 概念相当陌生,请阅读我关于 Kafka 基本概念的博客

如我们所见,Kafka 消费者可能会做一些时间操作。这意味着消费者可能无法跟上消息生成的速度,从而增加延迟。滞后是尚未阅读的新消息的数量。

我们使用像 Kafka 这样的异步消息队列获得的好处之一是生产者和消费者可以按照自己的速度写入和读取。但是,慢速处理消费者可能会导致卡夫卡的高度滞后。Kafka 解决这个问题的方法是使用消费者组。

什么是消费者组?

消费者组是一个组下多个消费者的分组机制。数据在一个组的所有消费者之间平均分配,一个组中没有两个消费者接收到相同的数据。让我们看看有关它的更多细节。

在从 Kafka 消费时,消费者可以使用特定的组 ID 注册到 Kafka。使用相同组 ID 注册的消费者将属于一个组。Group-id在Kafka的消费中起着至关重要的作用。消费者只能从 Kafka 分配给它的主题分区中消费。

Kafka 如何将分区分配给消费者?

在将分区分配给消费者之前,Kafka 将首先检查是否存在具有给定组 ID 的现有消费者。

当没有具有给定 group-id 的现有消费者时,它将将该主题的所有分区分配给这个新消费者。
当已经有两个消费者具有给定的 group-id 并且第三个消费者想要使用相同的 group-id 进行消费时。它会在所有三个消费者之间平均分配分区。同一组 ID 的两个消费者不会被分配到同一分区。

假设,有一个主题有 4 个分区和两个消费者,消费者 A 和消费者 B 想要使用组 ID“app-db-updates-consumer”从中消费。

image.png

Kafka 将分配:

  • partition-1 和 partition-2 到 consumer-A
  • 分区 3 和分区 4 到消费者 B。

这意味着,相同 的数据不会被同一组内的消费者消费

如何决定消费者是使用相同的还是不同的消费组?这取决于用例到用例。让我们更详细地了解这一点。

什么时候使用同一个消费者组?

当执行操作的消费者需要扩展到并行处理时,消费者应该属于同一组。同一组的消费者部分将被分配不同的分区。如前所述,同一组 ID 的两个消费者不会被分配到同一分区。因此,组中的每个消费者部分将处理与同一组中的其他消费者不同的数据。导致并行处理。这是Kafka建议的在消费者中实现并行处理的方式之一。

什么时候使用不同的消费者群体?

当消费者执行不同的操作时,消费者不应该在同一个组内。一些消费者可能会更新数据库,而其他一组消费者可能会对消费的数据进行一些计算。在这种情况下,我们肯定希望所有这些不同的消费者从所有分区读取所有数据。因此,在这种从所有分区读取数据的用例中,我们应该使用不同的组 ID 注册这些消费者。

image.png

如何为不同群体的消费者维持补偿?

偏移量是消费者已阅读了多少消息的指示器,将按消费者组 ID 和分区进行维护。当有两个不同的消费者组时,每个分区将维护 2 个不同的偏移量。不同消费者组的消费者可以独立于其他消费者组恢复/暂停。因此,不同群体的消费者之间没有依赖关系。