小编Jea*_*ali的帖子

DisconnectException 情况下的 Kafka 消费者行为

我们有几个使用 Kafka 的应用程序,它们经常遇到 DisconnectException。

发生的事情总是像下面这样:

  • 应用程序在分区 5 和 6 上订阅,消息从两个分区进行处理
  • 从时间T开始,分区5上不再消费任何消息,仅消费分区6的消息。
  • 在 T + 5 分钟左右,Kafka 消费者吐出许多日志行:
Error sending fetch request (sessionId=552335215, epoch=INITIAL) to node 0: org.apache.kafka.common.errors.DisconnectException.
Run Code Online (Sandbox Code Playgroud)
  • 之后,消费从分区5和6恢复并赶上累积的滞后

如果应用程序消耗单个分区,也会出现同样的问题:在这种情况下,5 分钟内没有消耗任何消息。

根据https://issues.apache.org/jira/browse/KAFKA-6520 ,我的理解是,如果出现连接问题,Kafka 消费者会重试(根据 reconnect.backoff.max,默认情况下最多 1 秒) .ms config),向最终用户隐藏问题。对 poll() 的调用返回 0 消息,因此轮询循环不断进行。

然而,一些审问:

  1. 如果由于连接问题而获取失败,则代理不会收到这些请求,并且在“max.poll.interval.ms”(在我们的例子中为 50 秒)之后,它应该驱逐消费者并触发重新平衡。这并没有发生,为什么?
  2. 既然 Kafka 消费者每秒都会重试,为什么系统需要 5 分钟才能重新连接?除非出现一些基础设施/网络问题......
  3. 否则,有任何客户端配置参数可以解释 5 分钟的延迟吗?这种延迟是否与“metadata.max.age.ms”有关?(默认 5 分钟)

apache-kafka kafka-consumer-api

5
推荐指数
0
解决办法
2158
查看次数

标签 统计

apache-kafka ×1

kafka-consumer-api ×1