【问题标题】:Spring Kafka Consumer KafkaListenerErrorHandler vs ErrorHandler. What is the difference?Spring Kafka 消费者 KafkaListenerErrorHandler 与 ErrorHandler。有什么区别?
【发布时间】:2021-12-28 00:17:43
【问题描述】:

我很难理解 KafkaListenerErrorHandler 和 ErrorHandler 的角色和职责。到目前为止,这是我对其中每一个的理解。如果我错了,请纠正我。

假设:使用开箱即用的默认 Spring Kafka 配置。

KafkaListenerErrorHandler

  • 只要在使用@KafkaListener 注释的方法中发生异常,就会调用此处理程序。根据文档,这发生在侦听器级别。

错误处理程序

  • 只要在容器级别引发异常,就会调用此处理程序。这将在处理错误(这只是一条日志消息)后提交偏移量(因为默认情况下 isAckAfterHandle() 返回 true)。

我的困惑

  • 既然我们已经在容器级别上拥有了 ErrorHandler 并且侦听器属于容器,为什么还要有一个单独的 KafkaListenerErrorHandler?

  • 这是否意味着当我们使用@KafkaListener 注解时,错误永远不会由容器级别的ErrorHandler 处理,而是由侦听器级别的KafkaListenerErrorHandler 处理?

  • 如果容器级别的 ErrorHandler 在使用 @KafkaListener 注解时从未被调用,那么如何提交偏移量? KafkaListenerErrorHandler 对此负责吗? KafkaListenerErrorHandler 会重试失败的消息多少次?

  • KafkaListenerErrorHandler 的重试/恢复如何工作?

【问题讨论】:

    标签: apache-kafka spring-kafka


    【解决方案1】:

    KafkaListenerErrorHandler 主要用于请求/回复场景 - 它允许将一些错误指示作为结果发送给调用者,但返回一些值。

    它还可以用于,例如,记录转换后的Message<?> 并重新引发异常,以便容器错误处理程序(现在默认为SeekToCurrentErrorHandler)可以处理异常。容器错误处理程序无权访问转换后的消息。

    如果侦听器错误处理程序没有重新抛出异常,则取消重试。

    不推荐使用适配器中的重试以支持容器错误处理程序,因为现在SeekToCurrentErrorHandler 支持退避、异常分类等。

    【讨论】:

    • 这是否意味着如果KafkaListenerErrorHandler不向容器抛出异常,那么偏移量将被提交,主题中的下一条消息将被@KafkaListener注解的方法接收?跨度>
    • 是的;没错。
    • 感谢您的回答。一个后续问题是开箱即用的 Spring Configuration 是否会通过 KafkaListenerErrorHandler 抛出异常,当处理来自带有 @KafkaListener 注释的方法的消息时出错?在我看来,它必须这样做,因为我肯定已经看到日志中发生重试,并且就像你说的,如果侦听器错误处理程序不抛出异常,重试就不会发生。
    • 默认没有监听器错误处理程序,因此监听器抛出的任何异常都会被抛出到容器中。
    • 这是否意味着为带有@KafkaListener注解的侦听器提供侦听器错误处理程序,我们必须配置KafkaListenerErrorHandler,因为默认情况下没有侦听器错误处理程序?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-12-04
    • 2019-08-25
    • 2017-01-04
    • 2017-11-16
    • 1970-01-01
    • 2016-04-05
    • 2018-11-01
    相关资源
    最近更新 更多