分配给消费者的分区

时间:2020-02-25 05:05:25

标签: apache-kafka kafka-consumer-api

是否有一种方法可以强迫kafka始终满足单个分区的消费者。
即使使用者崩溃,也导致重新平衡-我们必须以某种方式确保使用者不会满足于多个分区。
这是为了避免我们的业务聚合和容错逻辑中的复杂性-试图迎合动态/不可预测的分区数量。

2 个答案:

答案 0 :(得分:1)

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

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

话虽这么说,但我不确定我是否会推荐这种方法,如果您需要深入了解内部结构,则可能不正确使用Kafka。也许需要一些时间来重新考虑您的方法:)

Kafka在最新版本中还具有CooperativeStickyAssignor,它可以消除大量的“平衡”,看一下它也可以减轻您的痛苦。

答案 1 :(得分:0)

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