【Spring连载】使用Spring访问 Apache Kafka(十八)----非阻塞重试

【Spring连载】使用Spring访问 Apache Kafka(十八)----非阻塞重试Non-Blocking Retries

  • [一、这种模式是如何运作的How The Pattern Works](#一、这种模式是如何运作的How The Pattern Works)
  • [二、回退延迟精度Back Off Delay Precision](#二、回退延迟精度Back Off Delay Precision)
    • [概述和保证Overview and Guarantees](#概述和保证Overview and Guarantees)
  • 三、配置Configuration
  • [四、Programmatic Construction](#四、Programmatic Construction)
  • 五、Features
    • [5.1 BackOff Configuration](#5.1 BackOff Configuration)
    • [5.2 Global timeout](#5.2 Global timeout)
    • [5.3 Exception Classifier](#5.3 Exception Classifier)
    • [5.4 Include and Exclude Topics](#5.4 Include and Exclude Topics)
    • [5.5 Topics AutoCreation](#5.5 Topics AutoCreation)
    • [5.6 失败报头管理Failure Header Management](#5.6 失败报头管理Failure Header Management)

版本2.9将机制更改为bootstrap基础设施bean;请参阅 配置,了解引导此功能所需的两种机制。
使用Kafka实现无阻塞重试/dlt功能通常需要设置额外的主题并创建和配置相应的监听器。由于2.7 Spring for Apache Kafka通过@RetryableTopic注解和RetryTopicConfiguration类提供了对它的支持,以简化bootstrap。
batch监听器不支持非阻塞重试。

一、这种模式是如何运作的How The Pattern Works

如果消息处理失败,则会将消息转发到具有back off时间戳的重试主题。重试主题consumer检查时间戳,如果不到期,则暂停该主题分区的消费。到期时,将恢复分区消费,消息再次被消费。如果消息处理再次失败,则消息将转发到下一个重试主题,并重复该模式,直到成功处理或尝试次数用完,并将消息发送到死信主题Dead Letter Topic(如果已配置)。

例如,如果你有一个"main-topic"主题,并且希望设置非阻塞重试,其backoff为1000ms,乘数为2,最大尝试次数4次,则它将创建 main-topic-retry-1000, main-topic-retry-2000, main-topic-retry-4000 和 main-topic-dlt 主题,并配置相应的consumers。框架还负责创建主题以及设置和配置监听器。

通过使用这种策略,你将失去Kafka对该主题的排序保证。

你可以设置自己喜欢的AckMode模式,但建议使用RECORD。

目前,此功能不支持类级别的@KafkaListener注解。

当使用asyncAcks设置为true的手动AckMode时,DefaultErrorHandler必须配置为seekAfterError设置为false。从2.9.10和3.0.8版本开始,对于此类配置,这将无条件设置为true。对于早期版本,有必要重写RetryConfigurationSupport.configureCustomizers()方法以将属性设置为true。

java 复制代码
@Override
protected void configureCustomizers(CustomizersConfigurer customizersConfigurer) {
    customizersConfigurer.customizeErrorHandler(eh -> eh.setSeekAfterError(false));
}

此外,在这些版本之前,无论asyncAcks属性如何,使用默认(日志记录)DLT处理程序都与任何类型的手动AckMode不兼容。

二、回退延迟精度Back Off Delay Precision

概述和保证Overview and Guarantees

所有消息处理和回退都由consumer线程处理,因此,在尽最大努力的基础上保证了延迟精度。如果一条消息的处理时间比该消费者的下一条消息back off时间长,则下一条信息的延迟将高于预期。此外,对于短延迟(约1秒或更短),线程必须做的维护工作,如提交偏移量,可能会延迟消息处理的执行。如果重试主题的consumer正在处理多个分区,则精度也会受到影响,因为我们依赖于从轮询中唤醒consumer,并使用完整的pollTimeouts来进行时间调整。

也就是说,对于处理单个分区的consumers来说,在大多数情况下,消息的处理应该大致在其确切的到期时间进行。

消息在到期时间之前永远不会被处理是保证的。

三、配置Configuration

从2.9版本开始,对于默认配置,@EnableKafkaRetryTopic注释应该在@Configuration注解类中使用。这使该功能能够正确地引导,并允许在运行时插入要查找的一些功能组件。

如果添加此注释,则不必同时添加@EnableKafka,因为@EnableKafcaRetryTopic是用@EnableKavka进行元注释的。

此外,从该版本开始,对于功能组件和全局功能的更高级配置,RetryTopicConfigurationSupport类应在@configuration类中进行扩展,并覆盖适当的方法。有关更多详细信息,请参阅配置全局设置和功能。

默认情况下,重试主题的容器将与主容器具有相同的并发性。从3.0版本开始,您可以为重试容器设置不同的并发性(可以在注释上,也可以在RetryConfigurationBuilder中)。

只能使用上述技术中的一种,并且只有一个@Configuration类可以扩展RetryTopicConfigurationSupport。

四、Programmatic Construction

五、Features

5.1 BackOff Configuration

5.2 Global timeout

5.3 Exception Classifier

5.4 Include and Exclude Topics

5.5 Topics AutoCreation

5.6 失败报头管理Failure Header Management

相关推荐
摇滚侠6 小时前
《On Java 中文版 基础卷》阅读笔记 实现隐藏 12
java·数据库·笔记
川石课堂软件测试7 小时前
学习软件测试需掌握的一些知识
数据库·python·sql·功能测试·网络协议·mysql·http
2501_937767167 小时前
自建 SQL 数据库定时备份踩坑复盘与落地思路
数据库·sql
starzy19909 小时前
Kafka源码深度剖析:消息有异常是如何处理的
大数据·kafka
silvamux_9 小时前
10款模型写种草笔记:可发布性、返工来源与成本数据缺口复盘
java·数据库·笔记
步行cgn10 小时前
StringHttpMessageConverter 详解:Spring MVC 中字符串读写的默认转换器
java·spring·mvc
I Am a robert girl10 小时前
从 GameHorizon 拆解多时间尺度游戏评测:数据管线、离线基准与在线回放的三层设计
数据库·游戏·多时间尺度·数据管线·游戏评测·离线基准·在线回放
躺柒11 小时前
读数据安全架构设计与实践17安全架构案例(下)
数据库·安全·零信任·安全架构·防火墙·无边界
SelectDB11 小时前
实时更新排错现场:导入了却查到旧数据,和 FINAL 越加越慢的两条路
大数据·数据库·数据分析
SelectDB12 小时前
拿 Planet 的账单一行行对下来,我总结出三个可自查的校验点
大数据·数据库·数据分析