Java Kafka消费者投票方法尝试加入组失败,原因是出现致命错误:组成员';s支持的协议不兼容
我有一个kafka消费者正在处理一个消息主题名“ABC”,该主题名具有以下配置: {key.deserializer=class org.apache.kafka.common.serialization.StringDeserializer,value.deserializer=class org.apache.kafka.common.serialization.StringDeserializer,max.poll.records=250,group.instance.id=ABC,group.id=ABC,bootstrap.servers=localhost:9093,auto.commit.interval.ms=50,security.protocol=SSL,enable.auto.commit=true,SSL.truststore。location=,ssl.truststore.password=,ssl.endpoint.identification.algorithm=,client.id=ABC} 消费者代码是:Java Kafka消费者投票方法尝试加入组失败,原因是出现致命错误:组成员';s支持的协议不兼容,java,kafka-producer-api,Java,Kafka Producer Api,我有一个kafka消费者正在处理一个消息主题名“ABC”,该主题名具有以下配置: {key.deserializer=class org.apache.kafka.common.serialization.StringDeserializer,value.deserializer=class org.apache.kafka.common.serialization.StringDeserializer,max.poll.records=250,group.instance.id=ABC,gro
Runnable processMessageConsumer = () -> {
try (KafkaConsumer<String, String> consumer = new KafkaConsumer<>(consumerConfig)) {
log.debug("consumer created {} about to subscribe to topic ABC", consumer);
consumer.subscribe(Collections.singletonList("ABC"));
log.debug("subscribed to topic ABC {}", consumer);
while(!Thread.currentThread().isInterrupted()) {
try {
log.debug("about to call consumer.poll");
final ConsumerRecords<String, String> records = consumer.poll(Duration.ofMinutes(1));
log.debug("return from consumer.poll got records of {}", records);
if (records.isEmpty()) {
log.warn("Message receive queue is silent (no message received over kafka).");
} else {
log.debug("about to call processReceivedMessage");
processReceivedMessage(records);
consumer.commitAsync();
}
} catch (Exception ex) {
log.error("Failed to process received message", ex);
}
}
};
所以我现在已经弄清楚了问题所在。基本上,我们的库中有标准的kakfa代码来执行通用消息传递,其中每个服务都有自己的“收件箱”它从其他服务接收消息的主题。该主题以服务命名。在本例中,ABC是服务。因此,如果XYZ服务希望向ABC服务发送消息,它会将消息放在ABC主题上。然后,使用者线程会确定如何将特定类型的消息发送到相关端点(消息处理方法)和…为了方便起见,消费者还将group.id设置为ABC 这个机制一直运行得很好,直到最近,一些流消费者代码也被添加到库中,该库使用它自己的特定主题,但是将application.id(用于流配置)设置为服务名称,所以在本例中再次设置为“ABC”。这就是导致不一致GroupProtocolException的原因 问题是,我相信在封面下,application.id被用作group.id,因此我们有不同的主题,但都是相同的group.id。Kafka似乎不太喜欢这个!修复非常简单,我只是将streams处理程序的类名添加到application.id中,就解决了这个问题
因此,对于不同的主题,请使用不同的group.id/application.id,因此我现在已经解决了问题所在。基本上,我们的库中有标准的kakfa代码来执行通用消息传递,其中每个服务都有自己的“收件箱”它从其他服务接收消息的主题。该主题以服务命名。在本例中,ABC是服务。因此,如果XYZ服务希望向ABC服务发送消息,它会将消息放在ABC主题上。然后,使用者线程会确定如何将特定类型的消息发送到相关端点(消息处理方法)和…为了方便起见,消费者还将group.id设置为ABC 这个机制一直运行得很好,直到最近,一些流消费者代码也被添加到库中,该库使用它自己的特定主题,但是将application.id(用于流配置)设置为服务名称,所以在本例中再次设置为“ABC”。这就是导致不一致GroupProtocolException的原因 问题是,我相信在封面下,application.id被用作group.id,因此我们有不同的主题,但都是相同的group.id。Kafka似乎不太喜欢这个!修复非常简单,我只是将streams处理程序的类名添加到application.id中,就解决了这个问题
因此,对于不同的主题,使用不同的group.id/application.id这可能会有帮助:Thank@Armando这意味着我已经更改了分区分配策略,但我没有?这可能会有帮助:Thank@Armando这意味着我已经更改了分区分配策略,但我没有?
</properties>
<kafka.version>2.3.0</kafka.version>
...
</properties>
...
<dependencies>
<dependency>
<groupId>org.apache.kafka</groupId>
<artifactId>kafka-clients</artifactId>
<version>${kafka.version}</version>
</dependency>
<dependency>
<groupId>org.apache.kafka</groupId>
<artifactId>kafka-streams</artifactId>
<version>${kafka.version}</version>
</dependency>
</dependencies>
- DEBUG [ MSG-Consumer-0] n.r.r.s.i.KafkaService$$EnhancerBySpringCGLIB$$30ee2b7b :367 about to call consumer.poll
- ERROR [ MSG-Consumer-0] o.a.k.c.c.internals.AbstractCoordinator :569 [Consumer clientId=ABC, groupId=ABC] Attempt to join group failed due to fatal error: The group member's supported protocols are incompatible with those of existing members or first group member tried to join with empty protocol type or empty protocol list.
- ERROR [ MSG-Consumer-0] n.r.r.s.i.KafkaService$$EnhancerBySpringCGLIB$$30ee2b7b :381 Failed to process received message
-
org.apache.kafka.common.errors.InconsistentGroupProtocolException: The group member's supported protocols are incompatible with those of existing members or first group member tried to join with empty protocol type or empty protocol list.