Spring Kafka使用者无法使用记录

时间:2019-07-11 11:29:16

标签: apache-kafka spring-kafka

我们正在使用Spring Kafka批量使用记录。有时我们遇到一个问题,即应用程序启动,即使有足够的未读消息,它也不会消耗任何记录。相反,我们不断看到信息日志说。

[INFO]-[FetchSessionHandler:handleError:440] - [Consumer clientId=consumer-2, groupId=groupId] Error sending fetch request (sessionId=INVALID, epoch=INITIAL) to node 1027: org.apache.kafka.common.errors.DisconnectException. 

人们正面临着这个问题,每个人都说要忽略它,因为它只是一个信息日志。甚至,我们看到一段时间后,应用程序开始不做任何事情来获取记录。但是,开始消耗记录需要多长时间是非常不可预测的:(

我们在使用Spring云流时没有看到此错误。不知道我们是否错过了spring-kafka中的任何配置。

任何人过去都曾遇到此问题,如果我们缺少某些东西,请告诉我们。 我们的主题工作量很大,如果滞后很大,会发生这种情况吗?

我们使用的是 2.2.2.RELEASE的Spring Kafka Spring Boot 2.1.2.RELEASE Kafka 0.10.0.1 (我们知道它很旧,由于不可避免的原因,我们不得不使用::)

这是我们的代码:

application.yml

li.topics: CUSTOM.TOPIC.JSON
    spring:
      application:
        name: DataPublisher
      kafka:
        listener:
          type: batch
          ack-mode: manual_immediate
        consumer:
          enable-auto-commit: false
          max-poll-records: 500
          fetch-min-size: 1
          fetch-max-wait: 1000
          group-id: group-dev-02
          key-deserializer: org.apache.kafka.common.serialization.StringDeserializer
          value-deserializer:CustomResourceDeserialiser
          auto-offset-reset: earliest

消费者:

public class CustomKafkaBatchConsumer {


  @KafkaListener(topics = "#{'${li.topics}'.split(',')}", id = "${spring.kafka.consumer.group-id}")
  public void receiveData(@Payload List<CustomResource> customResources,
      Acknowledgment acknowledgment,
      @Header(KafkaHeaders.RECEIVED_PARTITION_ID) List<Integer> partitions,
      @Header(KafkaHeaders.OFFSET) List<Long> offsets) {
}
}

反序列化器:

public class CustomResourceDeserialiser implements Deserializer<CustomResource> {

  @Override
  public void configure(Map<String, ?> configs, boolean isKey) {
  }

  @Override
  public CustomResource deserialize(String topic, byte[] data) {
    if (data != null) {
      try {
        ObjectMapper objectMapper = ObjectMapperFactory.getInstance();
        return objectMapper.readValue(data, CustomResource.class);
      } catch (IOException e) {
        log.error("Failed to deserialise with {}",e.getMessage());
      }
    }
    return null;
  }

  @Override
  public void close() {

  }
}

2 个答案:

答案 0 :(得分:1)

我以前也遇到过同样的问题,解决方案是减少当前分区数或增加使用者数。在我的情况下,我们在60个分区上有大约100M数据,并且在运行单个Pod时遇到了相同的错误。我缩放了30个吊舱(有30个消费者),问题就解决了。

答案 1 :(得分:0)

这可能是由于此Kafka-8052 - Intermittent INVALID_FETCH_SESSION_EPOCH error on FETCH request问题。该问题已在Kafka 2.3.0中修复

不幸的是,截至2019年8月21日,kafka-clients的2.3.0版本尚未发布,Spring云流尚未升级其依赖项。

您可以尝试将它们作为显式依赖项添加到gradle中

    compile ('org.apache.kafka:kafka-streams:2.3.0')
    compile ('org.apache.kafka:kafka-clients:2.3.0')
    compile ('org.apache.kafka:connect-json:2.3.0')
    compile ('org.apache.kafka:connect-api:2.3.0')

更新

这也可能是由kafka Broker-客户端不兼容引起的。如果您的群集在客户端版本之后,您可能会遇到诸如此类的各种奇怪问题。例如,假设您的kafka经纪人位于1.x.x上,而kafka-consumer位于2.x.x上,则可能会发生