重复标记的注释:我 DID 签出了另一个问题,但下面没有回答我的具体问题。
因此,假设我在只有一个分区的单个服务器上有一个Kafka主题。因此,它与队列非常相似。
现在假设我要100个侦听器等待接受队列中的值。 因此,根据设计,如果所有100个使用者都在一个组中,则日志(或此处的队列)中的内容将在这些使用者之间分配。因此操作将在1/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)));
}
}
我似乎可以让Kafka催生100个消费者,以处理“队列”(日志)中的消息。 怎么办?
答案 0 :(得分:2)
查看此答案,以了解Kafka消费者In Apache Kafka why can't there be more consumer instances than partitions?
要在单个使用者组中正确分发邮件,您必须具有多个分区。找到适合您的负载的分区数量后,我将使用Spring Cloud Streaming更好地管理并发和使用者组分配。
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-stream-kafka</artifactId>
</dependency>
水槽样品
@SpringBootApplication
@EnableBinding(Sink.class)
public class LoggingConsumerApplication {
public static void main(String[] args) {
SpringApplication.run(LoggingConsumerApplication.class, args);
}
@StreamListener(Sink.INPUT)
public void handle(Person person) {
System.out.println("Received: " + person);
}
public static class Person {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String toString() {
return this.name;
}
}
}
并发设置
cloud:
stream:
bindings:
input:
destination: <topic-name>
group: <consumer-group>
consumer:
headerMode: raw
partitioned: true
concurrency: 20