您当前的位置:首页 > 电脑百科 > 程序开发 > 框架

一款功能强大、配置灵活、高性能异步编排框架(多线程管理)

时间:2022-12-10 16:54:12  来源:今日头条  作者:一飞开源
一飞开源,介绍创意、新奇、有趣、实用的免费开源应用、系统、软件、硬件及技术,一个探索、发现、分享、使用与互动交流的开源技术社区平台。致力于打造活力开源社区,共建开源新生态!
一、开源项目简介本框架是什么

 

Gobrs-Async是一款功能强大、配置灵活、带有全链路异常回调、内存优化、异常状态管理于一身的高性能异步编排框架。为企业提供在复杂应用场景下动态任务编排的能力。 针对于复杂场景下,异步线程复杂性、任务依赖性、异常状态难控制性;Gobrs-Async为此而生。

二、开源协议

使用Apache-2.0开源协议

三、界面展示为什么写这个项目

在开发复杂中台业务过程中,难免会遇到调用各种中台业务数据, 而且会出现复杂的中台数据依赖关系,在这种情况下。代码的复杂程度就会增加。 如下图所示:


 

电商平台业务中, 各中台数据可能依赖 商品Product 数据,而且需要依赖特殊属性中 Item的数据。(有朋友会问,为什么Product 数据不和 Item数据出自同一个中台呢?中台业务发展是多样性的,不同业务中台设计方式不同 , 难道我们就不对接了吗?所以我们要针对于这种复杂多变的中台业务数据提供技术支撑才是一个合格的开发者应该做的)而且Item数据是HTTP的服务,但Product 是rpc服务。 如果按照Future的 开发方式。我们可能会这样开发


// 并行处理任务 Product 、 Item 的任务 @Resource List paraExectors; // 依赖于Product 和 Item的 任务 @Resource List serExectors; public void testFuture(HttpServletRequest httpServletRequest) { DataContext dataContext = new DataContext(); dataContext.setHttpServletRequest(httpServletRequest); List list = new ArrayList<>(); for (AsyncTask asyncTask : paraExectors) { Future submit = GobrsThreadPoolExecutor.submit(() -> { asyncTask.com.gobrs.async.com.gobrs.async.test.task(dataContext, null); }); list.add(submit); } for (Future future : list) { try { future.get(); } catch (InterruptedException e) { e.printStackTrace(); } catch (ExecutionException e) { e.printStackTrace(); } } List ser = new ArrayList<>(); for (AsyncTask asyncTask : serExectors) { Future submit = gobrsThreadPoolExecutor.submit(() -> { asyncTask.com.gobrs.async.com.gobrs.async.test.task(dataContext, null); }); ser.add(submit); } for (Future future : ser) { try { future.get(); } catch (InterruptedException e) { e.printStackTrace(); } catch (ExecutionException e) { e.printStackTrace(); } } }存在的问题

以上示例中,Product数据是通过RPC 方式获取, Item是通过HTTP服务获取,大家都知道, RPC性能要高于HTTP性能。 但是通过Future 的方式, get会阻塞等待 Item数据返回后才会往下执行。 这样的话, 图书音像、装修数据、限购数据等都要等待Item数据返回,但是这些中台并不依赖Item返回的数据, 所以会产生等待时间影响系统整体QPS。

起源


 

 

  • 作者通过对开源中间件的源码详细阅读和二次开发的经验和使用心得总结而来。
  • 用户的一些使用体验 包括业务的需求
Gobrs-Async 核心能力

 


 

四、功能概述能解决什么问题

能解决 CompletableFuture 所不能解决的问题。 怎么理解呢?

传统的Future、CompleteableFuture一定程度上可以完成任务编排,并可以把结果传递到下一个任务。如CompletableFuture有then方法,但是却无法做到对每一个执行单元的回调。譬如A执行完毕成功了,后面是B,我希望A在执行完后就有个回调结果,方便我监控当前的执行状况,或者打个日志什么的。失败了,我也可以记录个异常信息什么的。

此时,CompleteableFuture就无能为力了。

Gobrs-Async框架提供了这样的回调功能。并且,如果执行成功、失败、异常、超时等场景下都提供了管理线程任务的能力!

场景概述场景一


 

说明任务A 执行完了之后,继续执行 B、C、D

场景二


 

说明任务A 执行完了之后执行B 然后再执行 C、D

场景三


 

说明任务A 执行完了之后执行B、E 然后按照顺序 B的流程走C、D、G。 E的流程走F、G

 

还有更多场景,如果你想详细理解任务编排的概念, 请仔细阅读文档,或者通过资源索引导航到官网了解全貌!
业界对比

 

在开源平台找了挺多任务异步编排框架,发现都不是很理想,唯一一款现阶段比较好用的异步编排框架就数asyncTool比较好用。但是在使用时发现,API不是很好用。而且需要频繁的创建 WorkerWrApper 对象 用起来有点不爽。对于业务比较复杂的场景,在开发时需要写较多的 WorkerWrapper 代码,而且框架不能对全局异常进行拦截。只能通过任务的 result 方法捕捉单任务的异常。 不能在任意任务出现异常后 停止全局的异步任务。同时无法在发生全局异常的时候进行异常拦截。如果需要实现在发生需停止全局任务流的时候,发送报警邮件的功能。 asyncTool就显得力不从心了。

asyncTool 本身已经功能很强大了,本人与asyncTool 作者 都是在京东担任研发工作。 涉及到的场景大同小异。 会有很多业务场景,很复杂的中台接口调用关系。所以针对当前业务场景。需要探索更多的技术领域。本身技术是应该服务于业务,落地业务场景。

想给项目起一个简单易记的名字,类似于 Eureka、Nacos、redis;经过再三考虑后,决定命名:Gobrs-Async

功能

asyncTool

Gobrs-Async

sirector

多任务处理

单任务异常回调

全局异常中断

可配置任务流

自定义异常拦截器

内存优化

可选的任务执行

它解决了什么问题

在请求调用各大中台数据时,难免会出现多个中台数据互相依赖的情况,现实开发中会遇到如下场景。

并行常见的场景 1 客户端请求服务端接口,该接口需要调用其他N个微服务的接口

譬如 请求我的购物车,那么就需要去调用用户的rpc、商品详情的rpc、库存rpc、优惠券等等好多个服务。同时,这些服务还有相互依赖关系,譬如必须先拿到商品id后,才能去库存rpc服务请求库存信息。 最终全部获取完毕后,或超时了,就汇总结果,返回给客户端。

2 并行执行N个任务,后续根据这1-N个任务的执行结果来决定是否继续执行下一个任务

如用户可以通过邮箱、手机号、用户名登录,登录接口只有一个,那么当用户发起登录请求后,我们需要并行根据邮箱、手机号、用户名来同时查数据库,只要有一个成功了,都算成功,就可以继续执行下一步。而不是先试邮箱能否成功、再试手机号……

再如某接口限制了每个批次的传参数量,每次最多查询10个商品的信息,我有45个商品需要查询,就可以分5堆并行去查询,后续就是统计这5堆的查询结果。就看你是否强制要求全部查成功,还是不管有几堆查成功都给客户做返回

再如某个接口,有5个前置任务需要处理。其中有3个是必须要执行完毕才能执行后续的,另外2个是非强制的,只要这3个执行完就可以进行下一步,到时另外2个如果成功了就有值,如果还没执行完,就是默认值。

3 需要进行线程隔离的多批次任务。

如多组任务, 各组任务之间彼此不相关,每组都需要一个独立的线程池,每组都是独立的一套执行单元的组合。有点类似于hystrix的线程池隔离策略。

4 单机工作流任务编排。

5 其他有顺序编排的需求。

它有什么特性

Gobrs-Async 在开发时考虑了众多使用者的开发喜欢,对异常处理的使用场景。并被运用到电商生产环境中,在京东经历这严酷的高并发考验。同时框架中 极简灵活的配置、全局自定义可中断全流程异常、内存优化、灵活的接入方式、提供SpringBoot Start 接入方式。更加考虑使用者的开发习惯。仅需要注入GobrsTask的Spring Bean 即可实现全流程接入。

Gobrs-Async 项目目录及其精简

 

  • gobrs-async-example:Gobrs-Async 接入实例,提供测试用例。
  • gobrs-async-starter:Gobrs-Async 框架核心组件

 

Gobrs-Async 在设计时,就充分考虑了开发者的使用习惯, 没有依赖任何中间件。 对并发框架做了良好的封装。主要使用 CountDownLatch 、ReentrantLock 、volatile 等一系列并发技术开发设计。

五、技术选型整体架构


 

任务触发器

任务流的启动者, 负责启动任务执行流

规则解析引擎

负责解析使用者配置的规则,同时于Spring结合,将配置的 Spring Bean 解析成 TaskBean,进而通过解析引擎加载成 任务装饰器。进而组装成任务树

任务启动器

负责通过使用解析引擎解析的任务树。结合JUC并发框架调度实现对任务的统一管理,核心方法有

 

  • trigger 触发任务加载器,为加载任务准备环境
任务加载器

 

负责加载任务流程,开始调用任务执行器执行核心流程

 

  • load 核心任务流程方法,在这里阻塞等待整个任务流程
  • getBeginProcess 获取子任务开始流程
  • completed 任务完成
  • errorInterrupted 任务失败 中断任务流程
  • error 任务失败
任务执行器

 

最终的任务执行,每一个任务对应一个TaskActuator 任务的 拦截、异常、执行、线程复用 等必要条件判断都在这里处理

 

  • prepare 任务前置处理
  • preInterceptor 统一任务前置处理
  • task 核心任务方法,业务执行内容
  • postInterceptor 统一后置处理
  • onSuccess 任务执行成功回调
  • onFail 任务执行失败回调
任务总线

 

任务流程传递总线,包括 请求参数、任务加载器、 响应结果, 该对象暴露给使用者,拿到匹配业务的数据信息,例如: 返回结果、主动中断任务流程等功能 需要任务总线(TaskSupport)支持

核心类图


 

六、源码地址

访问一飞开源:https://code.exmay.com/



Tags:框架   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,如有任何标注错误或版权侵犯请与我们联系(Email:2595517585@qq.com),我们将及时更正、删除,谢谢。
▌相关推荐
一飞开源,介绍创意、新奇、有趣、实用的免费开源应用、系统、软件、硬件及技术,一个探索、发现、分享、使用与互动交流的开源技术社区平台。致力于打造活力开源社区,共建开源新...【详细内容】
2022-12-10  Tags: 框架  点击:(0)  评论:(0)  加入收藏
前端开发人员负责创建用户在其显示器上看到的材料,他们正在尝试使用最可接受的前端框架来提供最佳的用户体验。现在,终端客户比以往任何时候都更重要,维护长期客户取决于提供非...【详细内容】
2022-12-01  Tags: 框架  点击:(29)  评论:(0)  加入收藏
众所周知,经历了计算机科学过去几十年没有突破的瓶颈期之后,人工智能技术这些年由于算法和算力(并行计算)革命,迈入了一个高速发展的时期。不仅如此,在编程语言和开发者环境不断演...【详细内容】
2022-12-01  Tags: 框架  点击:(15)  评论:(0)  加入收藏
前言今天本篇主要介绍一下MyBatis的全局配置文件的使用。configurationmybatis-config.xml文件的头部格式我们就不说了,直接从属性开始介绍,configuration为最顶层节点,其余所...【详细内容】
2022-11-24  Tags: 框架  点击:(23)  评论:(0)  加入收藏
关于应用模块页面的生成应用模块页面函数如:public partial class userblog : BaseJsonMode{[ModeMethod("{CanNoLogin:true,CanEnable:true}")]static public ReturnJson i...【详细内容】
2022-11-19  Tags: 框架  点击:(26)  评论:(0)  加入收藏
2021 年 9 月 8 日,字节跳动宣布正式开源 CloudWeGo。CloudWeGo 是一套字节跳动内部微服务中间件集合,具备高性能、强扩展性和稳定性的特点,专注于解决微服务通信与治理的难题,...【详细内容】
2022-11-19  Tags: 框架  点击:(34)  评论:(0)  加入收藏
最近研究了一下Mybatis,给大家磕叨磕叨,MyBatis框架的核心功能其实不难,无非就是动态代理和jdbc的操作,难的是写出来可扩展,高内聚,低耦合的规范的代码。本文完成的Mybatis功能比...【详细内容】
2022-11-19  Tags: 框架  点击:(30)  评论:(0)  加入收藏
缘由什么是 KMS ?要了解 KMS,首先要了解 DRM。DRM 是 Direct Rendering Manager 的缩写,最初只是用来支持 GPU 的,最初它负责: Initialize GPU card, load its firmware, etc. ...【详细内容】
2022-11-18  Tags: 框架  点击:(28)  评论:(0)  加入收藏
升级vs或者装了.Net 7.0后, 工程框架用 net6 的 dotnet watch 出错 &#39;Unhandled exception. System.IO.FileNotFoundException: Could not load file or assembly &#39;S...【详细内容】
2022-11-16  Tags: 框架  点击:(45)  评论:(0)  加入收藏
一、Scrapy框架简介Scrapy是:由Python语言开发的一个快速、高层次的屏幕抓取和web抓取框架,用于抓取web站点并从页面中提取结构化的数据,只需要实现少量的代码,就能够快速的抓...【详细内容】
2022-11-16  Tags: 框架  点击:(41)  评论:(0)  加入收藏
▌简易百科推荐
一飞开源,介绍创意、新奇、有趣、实用的免费开源应用、系统、软件、硬件及技术,一个探索、发现、分享、使用与互动交流的开源技术社区平台。致力于打造活力开源社区,共建开源新...【详细内容】
2022-12-10  一飞开源  今日头条  Tags:框架   点击:(0)  评论:(0)  加入收藏
环境:SpringBoot2.4.12概述项目中开发的API接口,可能有些接口返回的字段信息不能以明文的形式传输,这时候我们该如何进行处理呢?以下给出3中方式: 数据库层面处理 在SQL查询的时...【详细内容】
2022-12-09  Spring全家桶实战案例  今日头条  Tags:SpringBoot   点击:(6)  评论:(0)  加入收藏
日常开发中,我们有时会使用SpringEvent对业务解耦,使我们的代码更加高内聚低耦合,不过如果对其运行原理不清楚,那么在使用的过程中,一不留神就会出现一些bug。今天我们回顾一下Sp...【详细内容】
2022-12-08  程序员拾山  今日头条  Tags:SpringEvent   点击:(7)  评论:(0)  加入收藏
环境:Spring5.3.23概述通过Spring定义请求接口非常容器,通过几个注解就可以完成,如下:@RestController@RequestMapping("/demos")public class DemoController { @GetMapping("...【详细内容】
2022-12-05  Spring全家桶实战案例  今日头条  Tags:SpringMVC   点击:(15)  评论:(0)  加入收藏
GraalVM 版本:graalvm-ce-java17-22.3.0SpringBoot3.0 中最重要的特性就是对 GraalVM 的支持,从而达到更快的启动速度,有两种使用方式。利用 GraalVM 构建可执行文件因为需要...【详细内容】
2022-12-03  区块软件开发  今日头条  Tags:SpringBoot3.0   点击:(22)  评论:(0)  加入收藏
前端开发人员负责创建用户在其显示器上看到的材料,他们正在尝试使用最可接受的前端框架来提供最佳的用户体验。现在,终端客户比以往任何时候都更重要,维护长期客户取决于提供非...【详细内容】
2022-12-01  程序员星仔  搜狐号  Tags:前端框架   点击:(29)  评论:(0)  加入收藏
众所周知,经历了计算机科学过去几十年没有突破的瓶颈期之后,人工智能技术这些年由于算法和算力(并行计算)革命,迈入了一个高速发展的时期。不仅如此,在编程语言和开发者环境不断演...【详细内容】
2022-12-01  水哥  搜狐号  Tags:TensorFlow   点击:(15)  评论:(0)  加入收藏
开篇Feign 是声明式、模板化的 HTTP 客户端, 可以帮助我们更快捷、优雅地调用 HTTP API;Spring Cloud 为 Feign 添加了 Spring MVC 的注解支持,并整合了 Ribbon 和 Eureka 来为...【详细内容】
2022-11-27  程序猿不相信眼泪  稀土掘金  Tags:SpringBoot   点击:(33)  评论:(0)  加入收藏
前置【上一篇】完成了使用 Next.js 构建 blog。注意主题切换基于chakra-ui、tailwindcss(可选),chakra-ui 和 tailwind.css 都内置支持颜色模式chakra-ui 将颜色模式变量值...【详细内容】
2022-11-25  Manon  今日头条  Tags:Next.js   点击:(33)  评论:(0)  加入收藏
Next.js 已经成为 React 应用程序最重要的框架之一。它可以帮助开发人员在没有模板的情况下构建更好的服务器端渲染 React 应用程序。Next.js 之所以能成为目前最好的 React...【详细内容】
2022-11-25  Manon    Tags:Next.js   点击:(16)  评论:(0)  加入收藏
站内最新
站内热门
站内头条