Apache kafka 是否可以将一个spring kafka使用者分配给同一服务的一个实例,将另一个使用者分配给另一个实例

Apache kafka 是否可以将一个spring kafka使用者分配给同一服务的一个实例,将另一个使用者分配给另一个实例,apache-kafka,kafka-consumer-api,spring-kafka,Apache Kafka,Kafka Consumer Api,Spring 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 = "

我有两位卡夫卡听众,如下所示:

@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-listener分配给inc1,将bar-listener分配给inc2。如果一个实例发生故障,则侦听器(foo和bar)将分配给正在运行的实例。

您可以使用@KafkaListener属性,该属性从2.2开始引入。
当一个实例死亡时,您可以在另一个实例中自动启动它,如下所示:

@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();

非常感谢。但我关心的是,如何强制应用程序将一个卡夫卡侦听器(foo)分配给同一应用程序的一个实例,将另一个卡夫卡侦听器(bar)分配给同一应用程序的另一个实例?您可以使用标识符来标识它,例如,通过主机名(您可以使用
InetAddress.getLocalHost().getHostName();
)。因此,如果instance=hostname,bar-container-autoStartup=false,否则foo-container-autoStartup=false。请注意,可以使用属性占位符${…}指定AutoStart值