【问题标题】:Does Kafka rebalancing algorithm balance across topics?Kafka 再平衡算法是否跨主题平衡?
【发布时间】:2020-12-31 04:50:44
【问题描述】:

Kafka 再平衡算法是否可以跨主题工作?

假设我有 5 个主题,每个主题有 10 个分区,并且同一消费者组中的 20 个消费者应用程序实例分别订阅这 5 个主题。

Kafka 会尝试在 20 个实例之间平均平衡 50 个分区吗?

或者它会仅在一个主题内保持平衡,因此 10 个第一个实例可能(或可能)接收所有 50 个分区,而其他 10 个实例可能保持空闲?

我知道过去 Kafka 并没有平衡不同的主题,但现在的版本呢?

【问题讨论】:

  • 你是如何实现“订阅这 5 个主题”的?您是否为每个消费者实例创建了 5 个侦听器?

标签: apache-kafka kafka-consumer-api


【解决方案1】:

消费者实例到分区的分配取决于Consumer Configurationpartition.assignment.strategy。它的默认值为class org.apache.kafka.clients.consumer.RangeAssignor,但您也可以选择RoundRobinAssignorStickyAssignor,或者您甚至可以通过扩展抽象类AbstractPartitionAssignor来构建自己的策略。

我认为对于您的情况,RoundRobin 分配策略会导致分配更加平衡。 RangeRoundRobin 策略之间的区别如下图所示。

在您的情况下(每个主题中有 10 个分区和 20 个消费者实例),Range 策略将导致 10 个实例处于空闲状态。但是,使用 RoundRobin 策略会使所有实例保持忙碌,因为它遵循以下原则:分区将均匀分布在最大的 分配之间的差异应该是一个分区。

请注意,消费者对主题分区的分配不同于重新平衡再平衡

时启动
  • 消费者离开消费者组(例如,未能发送心跳或明确请求离开)

  • 一个新的消费者加入了 ConsumerGroup

  • 消费者更改其主题订阅

  • 订阅主题的变化,例如增加/减少分区。

在重新平衡期间,整个 consumerGroup 的消费暂停,并且根据您选择的策略再次发生分配。

【讨论】:

  • 如果 RangeAssignor 这么无效,为什么它是默认策略?
  • 如果您有一个消费者组阅读多个主题,您通常希望将数据加入消费者中。完成此操作后,通常最好对主题进行共同分区,并且组内的消费者拥有执行连接所需的所有数据。
【解决方案2】:

您可以选择 RoundRobin 作为分区分配器,而不是默认的 Range 分配,以使所有实例都使用。

范围分配器:

范围分配器作用于每个主题,它会根据消费者的总数将分区分成几个范围。然后所有的消费者将按字典顺序排序,每个消费者将采取一定范围的分区。

对于您的情况,每个主题有 10 个分区,总共有 20 个消费者。然后协调器将为前 10 个消费者中的每一个分配一个分区。在这种情况下,您将获得 10 个空闲消费者。

每个主题都会发生同样的事情,因此您将获得前 10 个消费者已分配 5 个分区(每个主题 1 个),其他 10 个将处于空闲状态。

循环分配器:

循环分配器将列出消费者组订阅的所有主题的所有分区。并且每个消费者都将循环使用分区。

对于您的情况,协调器将列出所有分区,例如:

t1p1, t1p2, t1p3 ... t5p9, t5p10

并且所有 20 个消费者都会按照这个顺序进行分区,所以最后你会得到:

Consumer1: t1p1, t3p1, t5p1
Consumer2: t1p2, t3p2, t5p2
.
.
.
Consumer 10: t2p10, t4p10

它可能比 Range Assignor 更平衡。

【讨论】:

    猜你喜欢
    • 2015-04-18
    • 2018-11-03
    • 1970-01-01
    • 1970-01-01
    • 2019-02-27
    • 2018-10-04
    • 1970-01-01
    • 1970-01-01
    • 2020-06-30
    相关资源
    最近更新 更多