【问题标题】:How to make sure multiple Kafka topologies have same partition assignment of all topics?如何确保多个 Kafka 拓扑对所有主题具有相同的分区分配?
【发布时间】:2021-10-05 16:38:31
【问题描述】:

我有一个用例,我们在同一个应用程序中定义了多个 Kafka 拓扑。我正在运行我的应用程序的多个实例(例如,在 2 个实例上运行的 2 个拓扑)。假设第一个拓扑有 2 个主题 (t0, t1) 有 2 个分区 (p0, p1) 来消费,第二个拓扑有 2 个主题 (t2, t3) 有 2 个分区 (p0, p1) 消费并且所有主题都相同关键值(例如 eventId)。我可以看到第一个和第二个拓扑的两个主题的分区都被分配给了各自的消费者。

与第一个拓扑 t0-p0 一样,t1-p0 分配给 consumer-0,t0-p1,t1-p1 分配给 consumer-1。 与第二个拓扑 t2-p0 一样,t3-p0 分配给 consumer-1,t2-p1,t3-p1 分配给 consumer-0。

现在我要确定的是,它们各自拓扑中的所有主题的分区 0 应该始终分配给消费者 0。但我可以看到,在我的用例中,在第一个拓扑中,t0-p0、t1-p0 被分配给消费者 0,而在第二个拓扑中,t2-p0、t3-p0 被分配给消费者 1。

有什么方法可以将我的应用程序配置为始终将消费者 0 分配给第 0 个分区,而消费者 1 应该为不同拓扑上的所有主题监听分区 1?

【问题讨论】:

  • 您使用的是什么消费者方法?订阅还是分配?归根结底,你为什么要关心哪个分区分配给哪个消费者?
  • @OneCricketeer:这对我来说很重要,因为我的两个拓扑都将数据实体化到存储中,当我从任何一个拓扑中查询存储时,我无法得到结果,因为 partition-0其他拓扑与其他实例。
  • 那么您将错误地获取商店,因为所有实例都应该能够相互了解。 Refer docs on Interactive QueriesGlobalKTables

标签: apache-kafka kafka-consumer-api apache-kafka-streams spring-cloud-stream


【解决方案1】:

有一个名为partition.assignment.strategy 的消费者配置。这有三个选项,RangeRoundRobinStickyAssignor

范围分配器

RangeAssignor 是默认策略。该战略的目标 是对几个主题的共同本地化分区。这很有用,因为 例如,连接来自两个具有相同数量的主题的记录 分区和相同的键分区逻辑。

RoundRobinAssignor

RoundRobinAssignor 可用于分配可用分区 均匀分布于所有成员。如前所述,转让人将 在分配每个分区和消费者之前按字典顺序排列 分区。

StickyAssignor

StickyAssignor 与 RoundRobin 非常相似,不同之处在于它 将尝试最小化两个分配之间的分区移动,所有 同时确保均匀分布。

我认为在您的情况下,您应该使用RangeAssignor。如果同一消费者拥有same number of partitions,则确保同一消费者具有来自不同主题的相同分区。

你可以找到很棒的文档here

【讨论】:

  • 由于 RangeAssignor 是默认策略,理想情况下,我期待相同的行为,即所有主题的分区 0 总是将消费者 0 和分区 1 分配给消费者 1。但就我而言,我看不到同样的行为。
  • 你用的kafka客户端是什么?和卡夫卡版本?这些客户端和版本中可能存在错误
  • spring-cloud-stream-binder-kafka - 3.1.2,其中有 kafka 库版本 - 2.6.0
猜你喜欢
  • 2021-04-24
  • 2022-10-07
  • 2016-11-05
  • 1970-01-01
  • 2016-07-28
  • 2020-04-05
  • 2019-12-04
  • 1970-01-01
  • 2020-06-27
相关资源
最近更新 更多