Spring kafka不支持大消息使用者

时间:2017-07-03 23:30:18

标签: apache-kafka spring-kafka

我使用spring Kafka来消费LinkedIn large message supported Kafka client

生成的消息

鉴于此Kafka客户端始终将AUTO_OFFSET_RESET_CONFIG覆盖为无,如其构造函数中所示。

private LiKafkaConsumerImpl(LiKafkaConsumerConfig configs,
    Deserializer<K> keyDeserializer,
    Deserializer<V> valueDeserializer,
    Deserializer<LargeMessageSegment> largeMessageSegmentDeserializer,
    Auditor<K, V> consumerAuditor) {
        _kafkaConsumer = new KafkaConsumer<>(configs.configForVanillaConsumer(),
        byteArrayDeserializer,
        byteArrayDeserializer);
    }
Map<String, Object> configForVanillaConsumer() {
    Map<String, Object> newConfigs = new HashMap<>();
    newConfigs.putAll(this.originals());
    newConfigs.put(ConsumerConfig.ENABLE_AUTO_COMMIT_CONFIG, false);
    newConfigs.put(ConsumerConfig.AUTO_OFFSET_RESET_CONFIG, "none");
    return newConfigs;
}

因此,一旦我开始使用批量提交并将ENABLE_AUTO_COMMIT_CONFIG设置为false,就会抛出以下错误:

  

[org.springframework.kafka.KafkaListenerEndpointContainer#0-1-C-1] ERROR oakcciConsumerCoordinator - 用户提供的侦听器com.linkedin.kafka.clients.consumer.LiKafkaConsumerRebalanceListener for group document-event-consumer在分区分配org上失败.apache.kafka.clients.consumer.NoOffsetForPartitionException:未定义的偏移量,没有分区的重置策略:DocumentEvents-2           在org.apache.kafka.clients.consumer.internals.Fetcher.resetOffset(Fetcher.java:369)           在org.apache.kafka.clients.consumer.internals.Fetcher.updateFetchPositions(Fetcher.java:247)           在org.apache.kafka.clients.consumer.KafkaConsumer.updateFetchPositions(KafkaConsumer.java:1602)           在org.apache.kafka.clients.consumer.KafkaConsumer.position(KafkaConsumer.java:1265)           在com.linkedin.kafka.clients.consumer.LiKafkaConsumerImpl.position(LiKafkaConsumerImpl.java:403)           在org.springframework.kafka.listener.KafkaMessageListenerContainer $ ListenerConsumer $ 1.onPartitionsAssigned(KafkaMessageListenerContainer.java:447)           在com.linkedin.kafka.clients.consumer.LiKafkaConsumerRebalanceListener.onPartitionsAssigned(LiKafkaConsumerRebalanceListener.java:62)           在org.apache.kafka.clients.consumer.internals.ConsumerCoordinator.onJoinComplete(ConsumerCoordinator.java:255)           在org.apache.kafka.clients.consumer.internals.AbstractCoordinator.joinGroupIfNeeded(AbstractCoordinator.java:339)           在org.apache.kafka.clients.consumer.internals.AbstractCoordinator.ensureActiveGroup(AbstractCoordinator.java:303)           在org.apache.kafka.clients.consumer.internals.ConsumerCoordinator.poll(ConsumerCoordinator.java:286)           在org.apache.kafka.clients.consumer.KafkaConsumer.pollOnce(KafkaConsumer.java:1030)           在org.apache.kafka.clients.consumer.KafkaConsumer.poll(KafkaConsumer.java:995)           在com.linkedin.kafka.clients.consumer.LiKafkaConsumerImpl.poll(LiKafkaConsumerImpl.java:231)           在org.springframework.kafka.listener.KafkaMessageListenerContainer $ ListenerConsumer.run(KafkaMessageListenerContainer.java:558)           at java.util.concurrent.Executors $ RunnableAdapter.call(Executors.java:511)           at java.util.concurrent.FutureTask.run(FutureTask.java:266)           在java.lang.Thread.run(Thread.java:745)

发生此问题的原因是此使用者群体第一次使用此主题的消息,因此它尝试使用偏移重置策略。

虽然我把它设置为&#34;最早的&#34;但它被覆盖到&#34;无&#34;由底层的LinkedIn kafka客户端

我还尝试覆盖 ConsumerRebalanceListener 以手动搜索到这种情况的开头,但实际上它还没有达到这一点。

我该如何解决这个问题?

1 个答案:

答案 0 :(得分:0)

有趣;请在GitHub中打开一个问题。

如果政策为none,我们应该抓住该例外。

与此同时,您可以通过使用常规客户端一次来解决它,实际设置组的初始偏移量(您不必实际接收任何消息,只需获取分配的分区并设置组的初始位置。