0


图解kafka-Parallel Consumer的三种并行消费方式

1.增加分区提高并行消费能力的局限性

当 Kafka 主题的分区数量非常多时,会引发以下问题:

  1. Rebalance 时间增长: 每增加一个消费者实例,消费者组内部的Rebalance过程会变得更加耗时。这是因为系统需要重新分配每个消费者实例负责的分区,确保负载均衡。因此,随着消费者实例数量的增加,Rebalance 的恢复时间也会相应延长。
  2. 磁盘打开文件数限制: 每个 Kafka Broker 节点将数据存储在多个分区目录中,每个目录不仅包括数据文件(.log 文件),还包括元数据信息(如 .index、.timeindex、.snapshot 等)。由于每个磁盘都有其打开文件数的限制(通过 ulimit -n 查看),随着分区数的增加,文件的打开成本和磁盘的使用成本会显著上升。
  3. 分区 Leader 选举时间增加: 每个 Broker 上负责的分区副本数量增多,例如存储了大量分区的 Broker 或有多个分区副本 Leader 的 Broker,一旦某个 Broker 发生宕机,将导致需要重新选举分区副本 Leader。这种情况会扩大分区不可用的范围,尤其在大规模分区环境下更为显著。
  4. 分区副本数据复制成本高昂: 为了确保数据可靠性,Kafka 使用分区副本机制。在多副本间同步数据时,会增加磁盘使用量和传输延迟。在分区数众多的情况下,这种复制成本可能会显著上升,特别是在需要频繁进行数据同步的情况下。

2.如何不增加分区提高并行消费能力

Parallel Consumer

Parallel Consumer 是由 Confluent 公司开发和开源的一个工具,旨在增加 Kafka 消费者的并行度,而无需增加主题的分区数量。它通过在单个分区上启动多个消费线程来实现并行消费。传统上,Kafka 的并行消费是基于分区的,即每个消费者实例只能处理一个分区。但是,如果要提高整体消费的并发性,必须增加消费者实例的数量,这会增加 Rebalance 的时间和复杂性,也会增加系统资源的开销。

通过 Parallel Consumer,可以在不增加分区的情况下,使用多线程来处理单个分区的消息。这种方法可以显著提升单个消费者实例的处理能力,从而提高整体消费的并行度,而不会增加 Kafka 集群的分区数量,也不会增加 Rebalance 的复杂性和时间。

因此,Parallel Consumer 提供了一种灵活且高效的方式,特别适用于那些希望在保持较少分区数的同时,提高 Kafka 消费性能的应用场景。

普通 Kafka 消费者程序

普通 Kafka 消费者程序的并行消费单位是分区(Topic-Partition)。每个消费者实例会分配一个或多个分区来处理。这意味着消费者的最大并行度受限于分区的数量。例如,如果一个主题有3个分区,一个消费者组中有3个消费者实例,每个消费者实例将处理一个分区,最多可以同时处理3个分区中的消息。

图解Parallel Consumer

Parallel Consumer 是一种特殊的消费者实现,它允许在单个分区上使用多个线程并行处理消息,而不需要增加分区的数量。这种方式可以显著提高单个消费者实例的处理能力和整体的消费并行度。

如下图,Consumer0就是按照消息的 key 进行设置进行并行消费的示例

  • 普通消费者程序: 按照分区进行并行消费。每个消费者实例处理一个或多个分区。
  • Parallel Consumer: 可以按照消息的 key 进行设置,或者仍然按照分区进行设置。这意味着,即使主题只有一个分区,也可以通过并行处理消息来提高消费的并发度。

并行消费提交 Offset 存在的问题

在实现消息级别的并行消费时,在使用 Parallel Consumer 的情况下,需要考虑如何有效地管理和提交消费的 offset。

图解Offset提交导致消息丢失

在处理 offset=3、4、5和6的消息时,3和5已经消费完成,把offset5进行了存储,提交offset线程读取到最新的offset后把offset5进行了提交,T2线程还在处理offset为4的消息,如果此时T2线程宕机,就会导致offset为4的消息再得不到消费

图解惰性提交 Offset机制

在使用 Parallel Consumer 进行消息并行消费时,由于并行处理的特性,可能会打破消息到达的顺序。为了避免 offset 提交顺序的问题,可以采用惰性提交 offset 的策略:

  • 连续最后一个已处理的 offset: 在处理一批消息时,只有当该批次中最后一条消息被成功处理后,才会提交这批次中连续的最后一个已处理的 offset。这种方式确保了提交的 offset 是连续的、有序的。
  • 避免乱序提交: 惰性提交 offset 可以有效地避免在处理并行消费过程中由于线程执行顺序不同而导致的 offset 提交乱序问题。如下图,在处理 offset=3、4、5和6的消息时,只有在处理完 offset=4 的消息后,T3线程先处理完offset=5的消息,会暂存,直到offset=4及以前的消息都处理完才会提交 offset=5 到 Kafka 的 __consumer_offsets 主题中。

3.图解Parallel Consumer的三种并行消费方式

  1. Partition 并行消费:- 这种方式将消息按照分区进行并行处理,每个分区在任何给定时间最多只有一条消息处于处理状态。- 并行度受限于分区的数量,分区数越多,理论上并行度越高。- 它的优点是不需要运行多个消费者实例,但缺点是处理缓慢的消息会阻塞同一分区内后续消息的处理,尽管其他分区的消息可以继续被处理。
  2. Key 并行消费:- 当每条消息都有 key 时,可以根据 key 的哈希值分配到不同的分区。- 这种方式可以保证具有相同 key 的消息按顺序处理,而不同 key 的消息可以并行处理。- 即使在同一个分区中,只要 key 不同,也可以实现并行消费,而不需要增加分区数量。- 在消费者失败或重新平衡后,已标记为消费成功的消息不会被重新处理,确保了顺序性和效率。
  3. Unordered 并行消费:- 这种方式不保证消息的顺序性,只关注最大化并行消费的能力。- 由于没有顺序性的要求,这种消费方式在性能上是最高的,因为它可以无限制地并行处理消息。
标签: kafka 分布式 后端

本文转载自: https://blog.csdn.net/m0_63833709/article/details/140351000
版权归原作者 m0_63833709 所有, 如有侵权,请联系我们删除。

“图解kafka-Parallel Consumer的三种并行消费方式”的评论:

还没有评论