为什么我的 spring 云流配置创建了多个 kafka 消费者

Why is my spring cloud stream config creating multiple kafka consumers

这不是什么大问题,但我很好奇一些额外的流消费者来自哪里,如果这是我可以更改的设置。

我有一个针对本地 Kafka 代理的非常简单的 spring 云流消费者设置。这是 spring 配置

spring:
  cloud:
    stream:
      bindings:
        consumer-in-0:
          destination: test-topic
          group: test-group

消费者class本身:

@Bean
Consumer<Message<String>> consumer() {
 return message -> System.out.println("Got it: " + message.getPayload());
}

当我 运行 应用程序时,我可以看到在输出中创建了 3 个消费者。但是当我检查本地代理中的消费者组成员时,它 always 只有一个消费者,并且 always 第二个消费者创建(即与客户编号 test-group-2)

为清楚起见,我使用 Spring 引导版本 2.3.4.RELEASE 和云依赖版本 Hoxton.SR10

这是 pom 中的依赖项:

<dependencies>
  <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter</artifactId>
  </dependency>
  <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-devtools</artifactId>
    <scope>runtime</scope>
    <optional>true</optional>
  </dependency>
  <dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-stream</artifactId>
  </dependency>
  <dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-stream-binder-kafka</artifactId>
  </dependency>
  <dependency>
    <groupId>org.springframework.kafka</groupId>
    <artifactId>spring-kafka</artifactId>
  </dependency>
<dependencies>

为什么我有 3 个消费者?为什么只有第二个真正在听 Kafka 话题?

在启动期间,会创建一个临时使用者以获取有关为该主题配置的分区的信息。

第二个消费者才是真正的消费者

如果类路径上有执行器(实际上是 Micrometer),KafkaBinderMetrics 会创建另一个使用者,以便它可以计算延迟。它实际上不消耗任何东西。