kafka多个消费者消费一个topic_如何并行化Kafka消费者

Kafka是一个异步消息传递队列。 Kafka使用者,使用来自Kafka的消息并进行一些处理,例如更新数据库或进行网络呼叫。 如果您刚接触Kafka概念,请阅读我的有关Kafka基本概念的博客。

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

我们使用Kafka等异步消息传递队列获得的好处之一是,生产者和消费者可以以自己的速度进行读写。 但是,处理速度慢的消费者可能会导致卡夫卡的滞后时间过长。 卡夫卡(Kafka)解决此问题的方法是利用消费者群体。

什么是消费者组?

消费者群是一个小组中多个消费者的分组机制。 数据在组的所有使用者之间平均分配,组中没有两个使用者接收相同的数据。 让我们查看有关它的更多详细信息。

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

Kafka如何将分区分配给使用者?

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

如果不存在具有给定组ID的现有使用者,它将为该新使用者分配该主题的所有分区。 如果已经有两个使用给定组ID的消费者,而第三个消费者想使用相同的组ID消费。 它将在所有三个使用者之间平均分配分区。 不会将具有相同组ID的两个使用者分配到同一分区。

假设有一个包含4个分区和两个使用者的主题,使用者A和使用者B希望通过组ID" app-db-updates-consumer"从中使用。

kafka多个消费者消费一个topic_如何并行化Kafka消费者_第1张图片

Kafka consumer group

如图所示,Kafka将分配:

· 分区1和分区2到使用者A

· 消费者3的分区3和分区4。

这意味着,同一组中的消费者不会使用相同的数据。

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

何时使用相同的消费群体?

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

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

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

kafka多个消费者消费一个topic_如何并行化Kafka消费者_第2张图片

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

偏移量(指示消费者已读取多少条消息)将按消费者组ID和分区维护。 当有两个不同的使用者组时,每个分区将保留2个不同的偏移量。 不同消费群体的消费者可以独立于其他消费群体继续/暂停。 因此,在不同群体的消费者之间不存在依赖关系。

让我尝试考虑您可能仍然遇到的一些问题。

让我们再次使用相同的用例。 当有一个包含4个分区和两个使用者的主题时,使用者A和使用者B已经使用组ID" app-db-updates-consumer"从中使用。

问:如果消费者B下降了怎么办? 答:Kafka将进行重新平衡,并将所有四个分区分配给使用者A。

问:如果新消费者,消费者C和消费者D开始使用相同的组ID" app-db-updates-consumer"进行消费怎么办? 答:Kafka将再次进行重新平衡,它将为每个消费者平均分配一个分区。

问:如果新的使用者Consumer-E加入相同的组ID" app-db-updates-consumer",该怎么办? 总共有5个消费者,其中分区为4A。 Kafka将为4个消费者分配1个分区,而5个消费者中有1个将处于闲置状态。

问:Kafka可以将相同的分区分配给两个使用者吗? Kafka无法将相同的分区分配给同一组中的两个使用者。 那不同的消费者群体呢? 分区仅在同一组的使用者之间划分。 这意味着Kafka会将相同的分区分配给不同组的两个使用者。

问:同一组中的最佳消费者数量是多少? 一个组中的使用者数量最多可以是分区的数量。 Kafka最多可以将一个分区分配给一个使用者。 如果使用方数量大于分区数量,则Kafka将无法分配给使用方。 并非该组的所有使用者都将分配给一个分区,因此该组的某些使用者将处于空闲状态。

结论:

我们已经了解了Kafka消费者组的工作方式,以及如何通过共享相同的组ID来使消费者并行化。 但是,采用这种方法,使用者的扩展规模不能超过分区数。 我们可以使Kafka消费者的数量超出分区数量吗? 阅读我的博客,了解如何实现这一目标。

(本文翻译自Jhansi Karee的文章《How to parallelise Kafka consumers》,参考:https://medium.com/@jhansireddy007/how-to-parallelise-kafka-consumers-59c8b0bbc37a)

你可能感兴趣的:(kafka多个消费者消费一个topic_如何并行化Kafka消费者)