【问题标题】:Can Kafka reassign partition to another consumer based solely on traffic?Kafka 可以仅根据流量将分区重新分配给另一个消费者吗?
【发布时间】:2021-01-07 13:53:11
【问题描述】:

我正在研究在我的项目中使用 Kafka 作为具有强大消息处理顺序保证的消息代理的可能性。

我了解到,在 Kafka 中,主题被分成多个分区,每个分区都将分配一个准确的消费者(假设有一个消费者组)。这有利于保持订购。重新平衡是将分区重新分配给消费者的过程,当分区数量或消费者数量发生变化(失败,添加新工作人员)时触发。

是否有可能在不改变消费者数量的情况下即时利用这种再平衡?

假设我们有以下场景:

                P1 -- C1

heavytraffic -> P2 -- C2
heavytraffic -> P3 --/    

所以消费者 C1 只处理 P1 分区,C2 分配了两个:P2,P3。 假设 P2、P3 上的流量很大,但 P1 空闲。

                P1 -- C1
heavytraffic -> P2 --/
 
heavytraffic -> P3 -- C2

Kafka 有什么方法可以重新分配例如 P2 到 C1 以提高消费者的利用率?

【问题讨论】:

    标签: apache-kafka load-balancing kafka-consumer-api


    【解决方案1】:

    虽然每个分区只有一个消费者,但一个消费者可以分配给多个分区。因此,为了获得最佳性能,您需要将分区数量与订阅主题的 ConsumerGroup 中的消费者数量相匹配。

    重新平衡基于消费者重新平衡策略(请参阅下面的配置),而不是基于流量或工作负载。一旦重新平衡完成,分配就会被固定,直到发生另一个重新平衡。

    通常,最好避免任何重新平衡,因为在此期间 ConsumerGroup 的所有消费者都将暂停并且不会轮询任何数据。因此,我不会使用重新平衡来平衡您的工作量。如果各个分区上的流量如此不同,我宁愿考虑将一些分区拆分为另一个主题或将分区拆分为更多分区。如果你有更多的分区,你可以使用更多的消费者。

    partition.assignment.strategy:类名或类类型列表,按优先顺序排列,支持分区分配策略,当使用组管理时,客户端将使用这些策略在消费者实例之间分配分区所有权。除了下面指定的默认类之外,您还可以使用 org.apache.kafka.clients.consumer.RoundRobinAssignor 类将分区循环分配给消费者。实现 org.apache.kafka.clients.consumer.ConsumerPartitionAssignor 接口允许您插入自定义分配策略。

    【讨论】:

    • 我正在尝试实现类似“消息组”功能 - 保证在每个消息组(约 1000 个组)的范围内进行排序,同时由 10-20 名工作人员使用。组可能没有很好地平衡,因此最好不要以固定方式绑定消费者,而是在特别的基础上进行映射。我发现老式系统具有该功能(Weblogic JMS、Apache Qpid、ActiveMq),但没有现代系统 - Kafka、RabbitMQ。
    • 好吧,好吧……答案是一样的。 :)
    猜你喜欢
    • 1970-01-01
    • 2021-01-26
    • 1970-01-01
    • 1970-01-01
    • 2015-07-04
    • 2022-06-13
    • 1970-01-01
    • 2019-03-17
    • 1970-01-01
    相关资源
    最近更新 更多