首页 > 解决方案 > 是否可以将一个spring kafka消费者分配给一个实例,将另一个消费者分配给同一服务的另一个实例

问题描述

我有两个 kafka 听众,如下所示:

@KafkaListener(topics = "foo1, foo2", groupId = foo.id, id = "foo")
 public void fooTopics(@Header(KafkaHeaders.RECEIVED_TOPIC) String topic, String message, Acknowledgment acknowledgment) {
 //processing
 }

@KafkaListener(topics = "Bar1, Bar2", groupId = bar.id, id = "bar")
 public void barTopics(@Header(KafkaHeaders.RECEIVED_TOPIC) String topic, String message, Acknowledgment acknowledgment) {
 //processing

同一个应用程序在两个实例上运行,例如 inc1 和 inc2。如果我可以将 foo 侦听器分配给 inc1 并将 bar 侦听器分配给 inc2,有什么办法吗?如果一个实例出现故障,则侦听器(foo 和 bar)都分配给正在运行的实例。

标签: apache-kafkakafka-consumer-apispring-kafka

解决方案


您可以使用自 2.2 以来引入的 @KafkaListener 属性autoStartup
当一个实例死机时,您可以像这样在另一个实例中自动启动它:

@Autowired
private KafkaListenerEndpointRegistry registry;

...

@KafkaListener(topics = "foo1, foo2", groupId = foo.id, id = "foo", autoStartup = "false")
public void fooTopics(@Header(KafkaHeaders.RECEIVED_TOPIC) String topic, String message, Acknowledgment acknowledgment) {
    //processing
}

//Start up condition
registry.getListenerContainer("foo").start();

推荐阅读