Java 同一主题上2个kafka使用者的分区结构

Java 同一主题上2个kafka使用者的分区结构,java,apache-kafka,microservices,kafka-consumer-api,Java,Apache Kafka,Microservices,Kafka Consumer Api,如果我创造 2卡夫卡消费者实例 传递相同的属性 订阅同一主题 这两个使用者实例(在diff-group-Id)是否具有相似的分区结构,或者可能不同 i、 如果我做.assignment(),我会在两个阶段得到相同的结果吗 我的实际问题陈述,我将在其中使用此验证 在我的应用程序中,我在特定的状态下获得代理的偏移量(这是通过我的第一个kafka消费者对象完成的) 稍后,我将创建第二个kafka consumer对象,并使用它来迭代主题,从前面获得的偏移量中进行搜索 (因此,如果问题中提到的假设

如果我创造

  • 2卡夫卡消费者实例
  • 传递相同的属性
  • 订阅同一主题
这两个使用者实例(在diff-group-Id)是否具有相似的分区结构,或者可能不同

i、 如果我做
.assignment()
,我会在两个阶段得到相同的结果吗


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

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

稍后,我将创建第二个kafka consumer对象,并使用它来迭代主题,从前面获得的偏移量中进行搜索

(因此,如果问题中提到的假设是错误的,我的逻辑将失败)

让我澄清一下

卡夫卡有主题,消费者可以订阅。每个主题都有分区(创建分区时可以定义分区)。当给定主题有多个分区时,每个主题分区都会分配给消费者组中的消费者。如果用户数超过分区数,那么这些额外的用户将变为空闲

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


因此,如果您希望为两个使用者获得相同的结果,您可以将它们添加到两个不同的使用者组中。

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

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

因此,在创建第二个使用者和来自第二个使用者的轮询操作之后,分区结构将发生变化

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

EDIT2::如果您有两个不同的使用者组id,并且两个组中只有一个使用者,那么分区结构将是相同的

如果一个消费者组下有多个消费者,但这两个消费者组中的消费者数量相同(例如,每个消费者组中有3个消费者),并且使用的消费者分区策略也相同,则分区结构将相同


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

我仍然不明白您想要实现什么?并行处理?手动设置起始偏移量?以友好的方式更改它?@BartoszWardziński在我的应用程序的某个阶段获取主题的最后偏移量。在稍后的阶段(可能我现在会在我的主题中填充更多的消息),从这个
保存的偏移量中阅读这个主题的新条目
它是如何在一个答案中写入的,您可以使用组管理来实现这一点-它将自动实现-免费供两个消费者使用。。在不同的groupId。刚刚更新了同样的问题!是的,没问题:)请检查编辑2。