【问题标题】:Partition structure for 2 kafka consumers on same topic同一主题上 2 个 kafka 消费者的分区结构
【发布时间】:2020-09-19 19:24:02
【问题描述】:

如果我创建

  • 2 个 kafka 消费者实例
  • 传递相同的属性
  • 订阅同一主题

这 2 个 Consumer 实例(在 diff 组 Id 处)是否具有相似的分区结构,或者可能不同?

也就是说,如果我这样做.assignment(),我会在两者上得到相同的结果


我的实际问题陈述,我将在哪里使用此验证

在我的应用程序中,我在特定状态下获得了代理的偏移量(这是通过我的第一个 kafka 消费者对象完成的)。

稍后,我将创建第二个 kafka 消费者对象,并使用它来迭代主题,从早期获得的偏移量中寻找。

(所以如果问题中提到的假设是错误的,我的逻辑就会失败)

【问题讨论】:

  • 我还是不明白你想达到什么目的?并行处理?手动设置起始偏移量?动态改变它?
  • @BartoszWardziński 在我的应用程序的某个阶段获取主题的最后一个偏移量。在稍后阶段(现在我的主题中可能已经填充了更多消息),从此saved offset 阅读该主题的新条目
  • 它是如何写在您可以使用组管理的答案之一的 - 它会自动实现 - 免费

标签: java apache-kafka microservices kafka-consumer-api


【解决方案1】:

假设您在创建消费者对象后订阅的主题中有 10 个分区。当您创建第一个消费者对象并开始执行poll 操作时,所有10 个分区都将分配给此消费者对象。

当您创建第二个消费者对象时,消费者组协调员会意识到其他一些消费者已加入该组,因此会触发重新平衡。根据使用的分区分配策略,一些分区将分配给第二个消费者。在默认情况下,分区中的 5 个将从第一个使用者中取出并分配给第二个使用者。现在每个消费者将有 5 个分区。

所以分区结构会在创建第二个消费者和来自第二个消费者的轮询操作之后改变

EDIT1: 如果您对两个消费者都执行.assignment(),则在您开始从两个消费者消费之后。你会得到同样的结果。

EDIT2::如果您有两个不同的消费者组 ID,并且如果两个组中只有 1 个消费者,那么分区结构将是相同的。

如果一个consumer group下有多个consumer,但是consumer group中的consumer个数相同(比如每个consumer group有3个consumer)并且使用的consumer分区策略也一样,那么partition结构是一样的。

如果您在两个组中都有多个消费者,但每个消费者组中的人数不同(例如第一个消费者组有 2 个消费者,第二个消费者组有 3 个消费者),那么您可以猜测分区结构会有所不同。

【讨论】:

  • 两个消费者..在不同的groupId。刚刚更新了同样的问题!
  • 是的,没问题 :) 请检查 EDIT 2。
【解决方案2】:

让我澄清一下。

Kafka 有主题,消费者可以订阅它们。每个主题都有分区(您可以在创建它们时定义)。当给定主题有多个分区时,每个主题分区都分配给消费者组中的一个消费者。如果您的消费者数量多于分区数量,那么这些额外的消费者将变得空闲。

如果您希望您的两个 Kafka 消费者分别消费消息,则必须将它们添加到两个不同的消费者组中。如果消费者组中有一个 Kafka 消费者,则所有分区都分配给该消费者。

所以如果你想为两个消费者获得相同的结果,你可以将他们添加到两个不同的消费者组中。

【讨论】:

    猜你喜欢
    • 2017-10-17
    • 1970-01-01
    • 2017-12-23
    • 2022-06-14
    • 1970-01-01
    • 2021-07-28
    • 1970-01-01
    • 2020-05-03
    • 1970-01-01
    相关资源
    最近更新 更多