京东零售:正在使用的高并发工具开源了!快速接入...

科技   2024-09-24 13:01   山西  

简介

该框架目前正在 京东App后台 接受苛刻、高并发、海量用户等复杂场景业务的检验测试,随时会根据实际情况发布更新和bugFix。

有对高并发场景下,被热key打爆存储层,秒杀等场景中热数据本地缓存、热数据(刷子用户)限流等需要热key探测的,可关注京东热key探测缓存框架https://gitee.com/jd-platform-opensource/hotkey 。热key框架正在京东内部多个部门线上使用,各项指标优异,单机可为1000台业务服务器提供热key计算服务,毫秒级探测及热key推送。

有需要存储海量日志的场景,秒级GB级或数十GB级,可关注我的另一个开源项目JLog,较ELK系列套件在处理日志方面提升10倍性能,且存储降低70%以上。

常见的场景

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

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

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

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

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

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

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

4 单机工作流任务编排

5 其他有顺序编排的需求

并行场景之核心——任意编排

1 多个执行单元的串行请求

2 多个执行单元的并行请求

3 阻塞等待,串行的后面跟多个并行

4 阻塞等待,多个并行的执行完毕后才执行某个

5 串并行相互依赖

6 复杂场景

asyncTool特点

解决任意的多线程并行、串行、阻塞、依赖、回调的并发框架,可以任意组合各线程的执行顺序,带全链路回调和超时控制。

其中的A、B、C分别是一个最小执行单元(worker),可以是一段耗时代码、一次Rpc调用等,不局限于你做什么。

该框架可以将这些worker,按照你想要的各种执行顺序,加以组合编排。最终得到结果。

并且,该框架 为每一个worker都提供了执行结果的回调和执行失败后自定义默认值 。譬如A执行完毕后,A的监听器会收到回调,带着A的执行结果(成功、超时、异常)。

根据你的需求,将各个执行单元组合完毕后,开始在主线程执行并阻塞,直到最后一个执行完毕。并且 可以设置全组的超时时间 。

该框架支持后面的执行单元以前面的执行单元的结果为自己的入参 。譬如你的执行单元B的入参是ResultA,ResultA就是A的执行结果,那也可以支持。在编排时,就可以预先设定B或C的入参为A的result,即便此时A尚未开始执行。当A执行完毕后,自然会把结果传递到B的入参去。

快速接入

说明:https://gitee.com/jd-platform-opensource/asyncTool/blob/master/QuickStart.md

源码地址

https://gitee.com/JD-opensource/asyncTool

老炮说Java
十年老炮程序员带你玩技术
 最新文章