Java Spring Kafka-选择@TopicPartition将停用组中的使用者

Java Spring Kafka-选择@TopicPartition将停用组中的使用者,java,spring,spring-boot,apache-kafka,publish-subscribe,Java,Spring,Spring Boot,Apache Kafka,Publish Subscribe,我有两个消费群体第一个和第二个使用Spring Boot版本2.1.8订阅了我的主题主题。我有两个服务使用每个单独的消费者群体 使用I定义侦听器: @KafkaListener(topics = "my-topic") public void consume(@Payload String message) { logger.info(String.format("#### -> Consumed message -> %s", message)); } @KafkaLis

我有两个消费群体
第一个
第二个
使用Spring Boot版本2.1.8订阅了
我的主题
主题。我有两个服务使用每个单独的消费者群体

使用I定义侦听器:

@KafkaListener(topics = "my-topic")
public void consume(@Payload String message) {
    logger.info(String.format("#### -> Consumed message -> %s", message));
}
@KafkaListener(topicPartitions = {
    @TopicPartition(
        topic = "my-topic",
        partitions = { "0", "2" }
    )}
)
public void consume(@Payload String message) {
    logger.info(String.format("#### -> Consumed message -> %s", message));
}
使用
kafka消费群体的列表显示以下内容:

root@8d49c1b2c3bf:/# kafka-consumer-groups --bootstrap-server localhost:9092 --describe --all-groups

GROUP TOPIC  PARTITION  CURRENT-OFFSET  LOG-END-OFFSET  LAG             CONSUMER-ID                                     HOST            CLIENT-ID
first my-topic  2          0               0               0         consumer-2-42b222ac-998a-4629-8358-1846c85f37e7 /172.18.0.9     consumer-2
first my-topic  0          0               0               0         consumer-2-42b222ac-998a-4629-8358-1846c85f37e7 /172.18.0.9     consumer-2
first my-topic  1          0               0               0         consumer-2-42b222ac-998a-4629-8358-1846c85f37e7 /172.18.0.9     consumer-2

GROUP TOPIC  PARTITION  CURRENT-OFFSET  LOG-END-OFFSET  LAG             CONSUMER-ID                                     HOST            CLIENT-ID
second my-topic  0          0               0               0        consumer-2-294ef783-2cd8-450b-8ac0-9e8a2f287df8 /172.18.0.8     consumer-2
second my-topic  1          0               0               0        consumer-2-294ef783-2cd8-450b-8ac0-9e8a2f287df8 /172.18.0.8     consumer-2
second my-topic  2          0               0               0        consumer-2-294ef783-2cd8-450b-8ac0-9e8a2f287df8 /172.18.0.8     consumer-2
我希望
first
组中的使用者只使用0和2个分区,因此我尝试使用侦听器实现它:

@KafkaListener(topics = "my-topic")
public void consume(@Payload String message) {
    logger.info(String.format("#### -> Consumed message -> %s", message));
}
@KafkaListener(topicPartitions = {
    @TopicPartition(
        topic = "my-topic",
        partitions = { "0", "2" }
    )}
)
public void consume(@Payload String message) {
    logger.info(String.format("#### -> Consumed message -> %s", message));
}
为什么使用相同命令的列表除了第一个组的分区1外,没有显示与上面相同的内容?此外,
消费者ID
值和进一步值均为空,
@KafkaListener
对于
第一个
组(第二个
组中的侦听器的工作原理相同)接收消息。如何修复它

Consumer group 'first' has no active members.

GROUP TOPIC  PARTITION  CURRENT-OFFSET  LOG-END-OFFSET  LAG             CONSUMER-ID     HOST            CLIENT-ID
first my-topic  2          0               0               0               -               -               -
first my-topic  0          0               0               0               -               -               -

GROUP  TOPIC  PARTITION  CURRENT-OFFSET  LOG-END-OFFSET  LAG             CONSUMER-ID                                     HOST            CLIENT-ID
second my-topic  0          0               0               0        consumer-2-294ef783-2cd8-450b-8ac0-9e8a2f287df8 /172.18.0.8     consumer-2
second my-topic  1          0               0               0        consumer-2-294ef783-2cd8-450b-8ac0-9e8a2f287df8 /172.18.0.8     consumer-2
second my-topic  2          0               0               0        consumer-2-294ef783-2cd8-450b-8ac0-9e8a2f287df8 /172.18.0.8     consumer-2
由于您正在向特定分区分配使用者线程,Kafka将使用
assign()
方法,而不会使用组协调。即使每个消费者与另一个消费者共享一个groupId,每个消费者也会独立行事

假设您希望始终从所有分区读取所有记录(例如,当使用压缩主题加载分布式缓存时),手动分配分区而不使用Kafka的组管理可能会很有用

但是检查消费者位置的命令将仅显示使用组协调的消费者的位置

有时,了解消费者的立场很有用我们有一个工具,可以显示所有消费者在一个消费者群体中的位置,以及他们离日志末尾有多远。要在名为my group的消费者组上运行此工具,请使用名为my topic的主题

手动分区分配不使用组协调,因此使用者故障不会导致重新平衡分配的分区。即使每个消费者与另一个消费者共享一个groupId,它们也会独立行事。为避免偏移提交冲突,通常应确保每个使用者实例的groupId是唯一的。

侦听器不使用消息的最后一个原因是偏移量,默认情况下,偏移量设置为最新,您需要特别像这样指定偏移量位置

@KafkaListener(id = "thing2", topicPartitions =
    { @TopicPartition(topic = "topic1", partitions = { "0", "1" }),
      @TopicPartition(topic = "topic2", partitions = "0",
         partitionOffsets = @PartitionOffset(partition = "1", initialOffset = "100"))
    })
 public void listen(ConsumerRecord<?, ?> record) {
      ...
 }
@KafkaListener(id=“thing2”,主题分区=
{@TopicPartition(topic=“topic1”,partitions={“0”,“1”}),
@TopicPartition(topic=“topic2”,partitions=“0”,
PartitionOffset=@PartitionOffset(partition=“1”,initialOffset=“100”))
})
公共无效侦听(消费者记录记录){
...
}
有关

第一个构造函数接受一个TopicPartitionOffset参数数组,以明确指示容器使用哪些分区(使用consumer assign()方法),并使用可选的初始偏移量。默认情况下,正值是绝对偏移量。默认情况下,负值相对于分区内的当前最后一个偏移量。提供了TopicPartitionOffset的构造函数,该构造函数采用附加的布尔参数。如果这是真的,则初始偏移(正或负)相对于此耗电元件的当前位置。偏移量在容器启动时应用


注意:您可以在“分区”或“分区偏移量”属性中指定每个分区,但不能同时指定两者。

感谢您通过链接给出非常有用的答案。我会读它,晚上试一下。这种神奇的数字背后有什么原因吗?
initialOffset=“100”
100
表示分区的偏移量,通过上述配置,您指定使用者线程读取表单分区1和偏移量100@Nikolas