Java 多消费者春天卡夫卡

Java 多消费者春天卡夫卡,java,spring-boot,apache-kafka,spring-kafka,Java,Spring Boot,Apache Kafka,Spring Kafka,重复标记的注意事项:我没有检查另一个问题,但它没有回答我下面的具体问题 假设我在一台只有一个分区的服务器上有一个卡夫卡主题。因此,它非常类似于队列 现在让我们假设我想要100个侦听器等待接受队列中的值。 因此,根据设计,如果所有100个使用者都在一个组中,那么来自日志(或此处的队列)的内容将分布在使用者之间。因此,手术将在百分之一的时间内结束 问题是Spring Kafka侦听器只配置了主题名 @Service public class Consumer { @KafkaListene

重复标记的注意事项:我没有检查另一个问题,但它没有回答我下面的具体问题

假设我在一台只有一个分区的服务器上有一个卡夫卡主题。因此,它非常类似于队列

现在让我们假设我想要100个侦听器等待接受队列中的值。 因此,根据设计,如果所有100个使用者都在一个组中,那么来自日志(或此处的队列)的内容将分布在使用者之间。因此,手术将在百分之一的时间内结束

问题是Spring Kafka侦听器只配置了主题名

@Service
public class Consumer {

    @KafkaListener(topics = "${app.topic}")
    public void receive(@Payload String message,
                        @Headers MessageHeaders headers) {
        System.out.println("Received message="+message);
        headers.keySet().forEach(key -> System.out.println(key+"->"+headers.get(key)));
    }
}
我似乎可以让卡夫卡产生100个消费者来处理来自“队列”(日志)的消息。
如何做到这一点?

查看此答案,了解卡夫卡消费者

要在单个使用者组之间正确分发消息,您必须有多个分区。一旦找到了负载的正确分区数量,我将使用SpringCloudStreaming更好地管理并发性和消费组分配

    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-stream-kafka</artifactId>
    </dependency>
并发设置

cloud:
  stream:
    bindings:
      input:
        destination: <topic-name>
        group: <consumer-group>
        consumer:
          headerMode: raw
          partitioned: true
          concurrency: 20
云:
流:
绑定:
输入:
目的地:
组:
消费者:
headerMode:原始
分区:正确
并发:20

此处提供更多信息

请参见答案。你的问题不是关于阿帕奇·卡夫卡的。卡夫卡根本没有排队的行为。在Kafka中,无法均匀地分发来自同一分区的消息。有一个
偏移量
实体需要处理。这个必须按正确的顺序处理。所以,如果你想排队,不要去卡夫卡!不要把“队列”和“主题”混为一谈——它们根本不相似。卡夫卡使用“主题”
cloud:
  stream:
    bindings:
      input:
        destination: <topic-name>
        group: <consumer-group>
        consumer:
          headerMode: raw
          partitioned: true
          concurrency: 20