Fast-Retry高性能百万级任务重试框架

2024-06-02 20:44

本文主要是介绍Fast-Retry高性能百万级任务重试框架,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Fast-Retry高性能百万级任务重试框架

文章目录

  • 1.前言
    • 1.1简介
    • 1.2项目地址
    • 1.3 分布式重试服务平台 Easy-Retry
  • 2.原理
  • 3.使用
    • 3.1引入依赖
    • 3.2编程式
      • 3.2.1使用重试队列
      • 3.2.2使用FastRetryBuilder
    • 3.3注解式
  • 4.FastRetry、Spring-Retry和Guava-Retry的性能测试对比
  • 5.总结

1.前言

1.1简介

  Fast-Retry是什么?

  Fast-Retry是一个高性能任务重试框架,支持百万级别任务的并发重试处理。 与主流的Spring-Retry, Guava-Retry等同步重试框架不同,Fast-Retry是一个支持异步重试框架,支持异步任务的重试、超时等待、回调。 Spring-Retry, Guava-Retry均无法支持大批量任务的重试,因为会占用过多线程资源导致大量任务在等待处理,随着任务数的增加,系统吞吐量大大降低,性能指数级降低,Fast-Retry的性能是前者的指数倍。

1.2项目地址

https://github.com/burukeYou/fast-retry

1.3 分布式重试服务平台 Easy-Retry

  下面是我之前分享的一篇文章,该篇文章被官方收录至优秀文章页面

https://mp.weixin.qq.com/s/Rr1oR4ieoYSoU_jLjxybow
https://blog.csdn.net/qq_34905631/article/details/131187901?spm=1001.2014.3001.5501

   Easy-Retry官网优秀文章推荐

https://www.easyretry.com/pages/db78e2/

  easy-retry改名为:Snail Job,代码仓库还在爱祖搭

https://snailjob.opensnail.com/

2.原理

  利用springBoot的自动装配解析自定义注解等能力,在加上使用了aspectj的动态代理,为指定注解解析生成动态代理类,然后在方法调用时候进行拦截,如果拦截到异常,就利用线程池、多线程、CompletableFuture、队列、生产者+消费者模式提交一个重试任务到线程池中重试执行,然后返回结果,我翻看了Fast-Retry的源码,感兴趣的可以去把它的项目源码拉下来翻一翻,欣赏一下还是会发现一些新大陆的,基本的思路就是这种。

3.使用

3.1引入依赖

<dependency><groupId>io.github.burukeyou</groupId><artifactId>fast-retry-all</artifactId><version>0.2.0</version>
</dependency>

3.2编程式

3.2.1使用重试队列

        ExecutorService executorService = Executors.newFixedThreadPool(8);RetryQueue queue = new FastRetryQueue(executorService);RetryTask<String> task = new RetryTask<String>() {int result = 0 ;@Overridepublic long waitRetryTime() {return 2000;}@Overridepublic boolean retry() {return ++result < 5;}@Overridepublic String getResult() {return  result + "";}};CompletableFuture<String> future = queue.submit(task);log.info("任务结束 结果:{}",future.get());

3.2.2使用FastRetryBuilder

        RetryResultPolicy<String> resultPolicy = result -> result.equals("444");FastRetryer<String> retryer = FastRetryBuilder.<String>builder().attemptMaxTimes(3).waitRetryTime(3, TimeUnit.SECONDS).retryIfException(true).retryIfExceptionOfType(TimeoutException.class).exceptionRecover(true).resultPolicy(resultPolicy).build();CompletableFuture<String> future = retryer.submit(() -> {log.info("重试");//throw new Exception("test");//int i = 1/0;if (0 < 10){throw new TimeoutException("test");}return "444";});String o = future.get();log.info("结果{}", o);

3.3注解式

  • 依赖Spring环境,所以需要在配置上加上@EnableFastRetry注解启用配置才生效
  • 如果将结果类型使用CompletableFuture包装,自动进行异步轮询返回,否则同步阻塞等待重试结果。

  下面定义等价于 FastRetryer.execute方法

    @FastRetry(retryWait = @RetryWait(delay = 2))public String retryTask(){return "success";}

  下面定义等价于 FastRetryer.submit方法,支持异步轮询

    @FastRetry(retryWait = @RetryWait(delay = 2))public CompletableFuture<String> retryTask(){return CompletableFuture.completedFuture("success");}

4.FastRetry、Spring-Retry和Guava-Retry的性能测试对比

  下图是三者的性能对比

  • 测试线程池: 8个固定线程
  • 单个任务逻辑: 轮询5次,隔2秒重试一次,总耗时10秒
  • 未测预计公式: 当我们使用线程池的时候, 一般线程池中 总任务处理耗时 = 任务数/并发度 x 单个任务重试耗时
任务数FastRetrySpring-RetryGuava-Retry
110秒10秒10秒
1010.066秒20.092秒20.078秒
5010.061秒70.186秒70.168秒
10010.077秒130.33秒130.31秒
50010.154秒631.420秒631.53秒
100010.237秒1254.78秒1256.28秒
500010.482秒没测预计:6250秒没测预计:6250秒
1000010.686秒没测预计:12520秒没测预计:12520秒
10000013.71秒没测预计:125000秒没测预计:125000秒
50000028.89秒没测预计:625000秒没测预计:625000秒
100000058.05秒没测预计:1250000秒没测预计:1250000秒

  可以看到即使是处理100万个任务,Fast-Retry的性能也比Spring-Retry和Guava-Retry处理在50个任务时的性能还要快的多的多, 这么快的秘密在于除了是异步,更重要是当别人在重试间隔里休息的时候,Fast-Retry还在不停忙命的工作着。上面这个是官方gitHub上给出的性能测试表格,从他的描述上有一些估计的成份,有一些吹水的成份,测试需要用数据说话,而不是估计大概,用严谨的测试报告才能说明各自性能,所以我觉得这个表格是不严谨的。

5.总结

  Easy-Retry虽然没有分布式重试的能力,也没有重试监控和可视化展示管理的能力,但是它的实现思路还是值得我们的学习和借鉴的,实现代码写的也是很优雅很耐思的,可以运用在项目上让重试的姿势更加优雅、干净、整洁和美观、性能也有所提升,让你写出帅气的code,保持良好的编码风格和习惯可以避免一些bug的产生,本次分享到此结束,希望我的分享能对你有所启发和帮助,请一键三连,么么么哒!

这篇关于Fast-Retry高性能百万级任务重试框架的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1025035

相关文章

Spring使用@Retryable实现自动重试机制

《Spring使用@Retryable实现自动重试机制》在微服务架构中,服务之间的调用可能会因为一些暂时性的错误而失败,例如网络波动、数据库连接超时或第三方服务不可用等,在本文中,我们将介绍如何在Sp... 目录引言1. 什么是 @Retryable?2. 如何在 Spring 中使用 @Retryable

MyBatis框架实现一个简单的数据查询操作

《MyBatis框架实现一个简单的数据查询操作》本文介绍了MyBatis框架下进行数据查询操作的详细步骤,括创建实体类、编写SQL标签、配置Mapper、开启驼峰命名映射以及执行SQL语句等,感兴趣的... 基于在前面几章我们已经学习了对MyBATis进行环境配置,并利用SqlSessionFactory核

MySQL高性能优化规范

前言:      笔者最近上班途中突然想丰富下自己的数据库优化技能。于是在查阅了多篇文章后,总结出了这篇! 数据库命令规范 所有数据库对象名称必须使用小写字母并用下划线分割 所有数据库对象名称禁止使用mysql保留关键字(如果表名中包含关键字查询时,需要将其用单引号括起来) 数据库对象的命名要能做到见名识意,并且最后不要超过32个字符 临时库表必须以tmp_为前缀并以日期为后缀,备份

cross-plateform 跨平台应用程序-03-如果只选择一个框架,应该选择哪一个?

跨平台系列 cross-plateform 跨平台应用程序-01-概览 cross-plateform 跨平台应用程序-02-有哪些主流技术栈? cross-plateform 跨平台应用程序-03-如果只选择一个框架,应该选择哪一个? cross-plateform 跨平台应用程序-04-React Native 介绍 cross-plateform 跨平台应用程序-05-Flutte

Spring框架5 - 容器的扩展功能 (ApplicationContext)

private static ApplicationContext applicationContext;static {applicationContext = new ClassPathXmlApplicationContext("bean.xml");} BeanFactory的功能扩展类ApplicationContext进行深度的分析。ApplicationConext与 BeanF

数据治理框架-ISO数据治理标准

引言 "数据治理"并不是一个新的概念,国内外有很多组织专注于数据治理理论和实践的研究。目前国际上,主要的数据治理框架有ISO数据治理标准、GDI数据治理框架、DAMA数据治理管理框架等。 ISO数据治理标准 改标准阐述了数据治理的标准、基本原则和数据治理模型,是一套完整的数据治理方法论。 ISO/IEC 38505标准的数据治理方法论的核心内容如下: 数据治理的目标:促进组织高效、合理地

ZooKeeper 中的 Curator 框架解析

Apache ZooKeeper 是一个为分布式应用提供一致性服务的软件。它提供了诸如配置管理、分布式同步、组服务等功能。在使用 ZooKeeper 时,Curator 是一个非常流行的客户端库,它简化了 ZooKeeper 的使用,提供了高级的抽象和丰富的工具。本文将详细介绍 Curator 框架,包括它的设计哲学、核心组件以及如何使用 Curator 来简化 ZooKeeper 的操作。 1

【Kubernetes】K8s 的安全框架和用户认证

K8s 的安全框架和用户认证 1.Kubernetes 的安全框架1.1 认证:Authentication1.2 鉴权:Authorization1.3 准入控制:Admission Control 2.Kubernetes 的用户认证2.1 Kubernetes 的用户认证方式2.2 配置 Kubernetes 集群使用密码认证 Kubernetes 作为一个分布式的虚拟

Spring Framework系统框架

序号表示的是学习顺序 IoC(控制反转)/DI(依赖注入): ioc:思想上是控制反转,spring提供了一个容器,称为IOC容器,用它来充当IOC思想中的外部。 我的理解就是spring把这些对象集中管理,放在容器中,这个容器就叫Ioc这些对象统称为Bean 用对象的时候不用new,直接外部提供(bean) 当外部的对象有关系的时候,IOC给它俩绑好(DI) DI和IO

Sentinel 高可用流量管理框架

Sentinel 是面向分布式服务架构的高可用流量防护组件,主要以流量为切入点,从限流、流量整形、熔断降级、系统负载保护、热点防护等多个维度来帮助开发者保障微服务的稳定性。 Sentinel 具有以下特性: 丰富的应用场景:Sentinel 承接了阿里巴巴近 10 年的双十一大促流量的核心场景,例如秒杀(即突发流量控制在系统容量可以承受的范围)、消息削峰填谷、集群流量控制、实时熔断下游不可用应