Java Kafka消费者投票方法尝试加入组失败,原因是出现致命错误:组成员';s支持的协议不兼容

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

我有一个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}

消费者代码是:

            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.