Apache Kafka消费者的退避策略

时间:2019-08-29 10:30:38

标签: apache-kafka apache-camel

在将kafka组件用于骆驼时,从kafka消费时有两种重试方法:

  • 在内存中重试,使用骆驼路线上的常规错误处理。但是问题是,重试时,消费者停止对代理进行轮询,并且如果达到了max.poll.interval.ms,Kafka代理会将消费者视为不健康,并将其从消费者组中删除:
  

org.apache.kafka.clients.consumer.internals.AbstractCoordinator |   [Consumer clientId = consumer-1,   groupId = 2862121d-ddc9-4111-a96a-41ba376c0143]该成员将离开   该组,因为消费者轮询超时已到期。这意味着   后续调用poll()之间的时间比配置的时间长   max.poll.interval.ms,通常表示轮询循环为   花太多时间处理邮件。您可以解决这个问题   通过增加max.poll.interval.ms或通过减小最大值   带有max.poll.records的poll()中返回的批次大小。

  • 使用参数breakOnFirstError对每次重试进行轮询。偏移量不会更新,我们将继续轮询来自代理的相同消息。问题是我找不到定义退避策略的方法,重试次数过多。

您知道如何为第二种方法定义退避策略吗?

1 个答案:

答案 0 :(得分:0)

我不熟悉Apache Camel,但是如果您能够修改使用者参数和轮询循环,那么第二种方法是正确的,这是Kafka重试的方法-不要提交偏移量,因此下一种轮询循环迭代将再次消耗该消息。

进一步的策略取决于您在发生故障时的确切需求:

  • 您希望重试最终成功吗?然后,为避免向同一封邮件发送垃圾邮件,您可以调整用户使用max.poll.interval.ms配置参数轮询Kafka邮件的时间间隔。更多详细信息here

  • 是否要重试一定次数然后继续下一条消息?在这种情况下,您将需要在轮询循环中手动实现重试计数器。一旦达到一定的重试次数,您就可以简单地将消费者进一步转移:

    final TopicPartition topicPartition = new TopicPartition(topic, partition); consumer.seek(topicPartition, consumer.position(topicPartition) + 1);