KafkaStreams - InconsistentGroupProtocolException

时间:2017-01-11 22:20:33

标签: apache-kafka apache-kafka-streams

我有一个Kafka Streams应用程序,它使用Kafka Streams DSL连接到我们的Kafka集群,如下所示:

KStreamBuilder builder = new KStreamBuilder();
KStream<String, byte[]> stream = builder.stream(myTopic);

// do work

kStreams = new KafkaStreams(builder, config);
kStreams.start();

我的代码库的另一部分,它直接使用消费者客户端与我们的集群建立连接。

KafkaConsumer<String, String> consumer = new KafkaConsumer<>(config, keyDeserializer, valueDeserializer);
consumer.subscribe(Collections.singletonList(sourceTopic));
consumer.poll(500L);
// etc
consumer.close();

我这样做的原因是在有条件地启动应用程序的其他部分(包括Kafka Streams拓扑)之前收集有关使用者组的元数据。可能还有其他方法可以做到这一点(例如通过各种钩子或不做什么),但我更好奇为什么这些方法的混合有时会(间歇性地)导致InconsistentGroupProtocolException被抛出。

有人可以说清楚为什么会抛出这个问题吗?我很难确定从源代码本身到底发生了什么,但我想Kafka Streams构建的基础消费者正在指定与KafkaConsumer客户端不同的分区协议。无论如何,我们将非常感谢您理解此异常的任何帮助

1 个答案:

答案 0 :(得分:7)

你自己回答了问题。 Kafka Streams使用自定义分区分配器,而Kafka Streams客户端仅适用于其他Kafka Streams客户端。如果您使用与您的Kafka Streams应用程序具有相同组ID的KafkaConsumer,则无法阻止KafkaConsumer加入Kafka Streams使用者组。显然,KafkaConsumer无法播放&#34;与Kafka Streams合作。