Kafka系列(19)CommitFailedExCeption异常怎么处理

Consumer客户端在提交位移时出现了错误或异常,而且还是那种不可恢复的严重异常。

本次提交位移失败了,原因是消费者组已经开启了Rebalance过程,并且将要提交位移的分区分配给了另一个消费者实例。

出现这个情况的原因,你的消费者实例连续两次调用poll方法的时间间隔超过了期望的max.poll.interval.ms参数值。这通常表示,你的消费者实例花费了太长的时间进行消息处理,耽误了调用poll方法。

 

解决方案:

     1增加期望的时间间隔max.poll.interval.ms参数值

     2减少poll方法一次性返回的消息数量,即减少max.poll.records参数值。

 

发生异常的场景:

   场景一:当消息处理的总时间超过预设的max.poll.interval.ms参数值时


Properties props = new Properties();

props.put("max.poll.interval.ms", 5000);
consumer.subscribe(Arrays.asList("test-topic"));
 
while (true) {
    ConsumerRecords records = 
        consumer.poll(Duration.ofSeconds(1));
    // 使用 Thread.sleep 模拟真实的消息处理逻辑
    Thread.sleep(6000L);
    consumer.commitSync();
}
 

   解决办法有四种:

     1.缩短单条消息处理的时间

     2.增加Consumer端允许下游系统消费一批消息的最大时长  0.10.0.0之后才有的max.poll.interval.ms  

     3减少下游系统一次性消费的消息总数  max.poll.records

     4下游系统使用多线程来加速消费   让下游系统手动创建多个消费线程处理poll方法返回的一批消息。

         很多主流的大数据处理框架使用的都是这个方法,比如Flink 在集成Kafka时,就是创建多个KafkaConsumerThread

  使用解决办法的思路:

    首先,要弄清楚你的下游系统消费每条消息的平均延时是多少,比如你的消费逻辑是从Kafka

获取消息写入到下游的MongoDB中,假设MongoDB的平均时延不超过2秒,那么可以认为消息处理需要花费2秒的时间。如果按照max.poll.records等于500来计算,一批消息的总消费时长大约是1000秒,因此你的Consumer端的max.poll.interval.ms参数

 就不能低于1000秒

    除了调整max.poll.interval.ms之外,还可以选择调整max.poll.records

 

场景二

  假如你的程序中同是出现相同的group.id的值的消费者程序和独立消费者程序,那么当独立消费者程序手动提交位移时,会抛出异常。

 

Kafka系列(19)CommitFailedExCeption异常怎么处理_第1张图片     

 

 

 

你可能感兴趣的:(Kafka)