【问题标题】:partition allocation to consumers分配给消费者的分区
【发布时间】:2020-02-25 17:48:37
【问题描述】:

有没有办法强制 kafka 始终让消费者满足单个分区的需求。
即使消费者崩溃,导致重新平衡 - 我们必须以某种方式确保消费者不满足多个分区。
这是为了防止我们的业务聚合和容错逻辑的复杂性 - 试图满足动态/不可预测的分区数量。

【问题讨论】:

标签: apache-kafka kafka-consumer-api


【解决方案1】:

您可以考虑实现自定义 ConsumerPartitionAssignor 并将其用于您的消费者 - 这使您可以显式控制分区分配,同时仍然使用组管理功能。

通过覆盖subscriptionUserData,您应该能够将此消费者读取的当前分区(或在其配置中显式配置并转发)传播到组长,该组长决定在重新平衡期间谁必须从哪个分区读取. 在重新平衡中,您可以确保按原样分配分区。

话虽如此,我不确定我是否会推荐这种方法,如果您需要如此深入地参与内部工作,那么您可能没有正确使用 Kafka。也许花点时间重新考虑你的方法:)

Kafka 在最近的版本中也有 CooperativeStickyAssignor,它可以从重新平衡中“咬”很多,看看它也可能有助于减轻你的痛苦。..

【讨论】:

    【解决方案2】:

    我认为您无法使用订阅方式在消费者组内自动重新平衡来处理它。我看到不同的问题。 如果你有一个有 X 个分区的主题,你需要 X 个消费者在同一个消费者组中,以便每个消费者获得一个分区。在启动期间,可能会发生在其他消费者正在启动时,其中一个消费者获得了多个分区。也可能发生这样的情况,当一个或多个消费者崩溃时,其中一个仍然活着的消费者会获得更多分区,而死去的消费者会恢复。 您无法保证只有一个消费者——每一刻都有一个分区。 出于这个原因,唯一的方法是使用分配而不是订阅 (http://kafka.apache.org/24/javadoc/org/apache/kafka/clients/consumer/KafkaConsumer.html#assign-java.util.Collection-)。 请注意,通过这种方式,您必须指定分区,并且您没有开箱即用的自动重新平衡功能。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-06-14
      • 1970-01-01
      • 2019-03-17
      • 2019-11-28
      • 1970-01-01
      • 2019-04-07
      • 2020-12-26
      相关资源
      最近更新 更多