登录 |  注册
首页 >  架构·案例 >  京东技术 >  京东asyncTool解决任意的多线程编排框架

京东asyncTool解决任意的多线程编排框架

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

有对区块链感兴趣的,可以参考项目作者另一个 GVP 项目,java 区块链底层入门。

如果只是需要用这个框架,请往下看即可。如果需要深入了解这个框架是如何一步一步实现的,从接到需求,到每一步的思考,每个类为什么这么设计,为什么有这些方法,也就是如何从 0 到 1 开发出这个框架,作者在 csdn 开了专栏专门讲中间件如何从 0 开发,包括并不限于这个小框架。京东内部同事可在 cf 上搜索 erp 也能看到。

并行常见的场景

1 客户端请求服务端接口,该接口需要调用其他 N 个微服务的接口

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

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

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

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

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

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

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

4 单机工作流任务编排

5 其他有顺序编排的需求

并行场景之核心任意编排

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

bianpai.jpg

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

bianpai-2.jpg

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

bianpai-3.jpg

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

bianpai-4.jpg

5 串并行相互依赖

6 复杂场景


并行场景之每个执行结果的回调

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

此时,CompleteableFuture 就无能为力了。

我的框架提供了这样的回调功能。并且,如果执行异常、超时,可以在定义这个执行单元时就设定默认值。

并行场景之执行顺序的强依赖和弱依赖

如上图的 3,A 和 B 并发执行,最后是 C。

有些场景下,我们希望 A 和 B 都执行完毕后,才能执行 C,CompletableFuture 里有个 allOf(futures...).then()方法可以做到。

有些场景下,我们希望 A 或者 B 任何一个执行完毕,就执行 C,CompletableFuture 里有个 anyOf(futures...).then()方法可以做到。

我的框架同样提供了类似的功能,通过设定 wrapper 里的 addDepend 依赖时,可以指定依赖的任务是否 must 执行完毕。如果依赖的是 must 要执行的,那么就一定会等待所有的 must 依赖项全执行完毕,才执行自己。

如果依赖的都不是 must,那么就可以任意一个依赖项执行完毕,就可以执行自己了。

注意:这个依赖关系是有必须和非必须之分的,还有一个重要的东西是执行单元不能重复执行。譬如图 4,如果 B 执行完毕,然后执行了 A,此时 C 终于执行完了,然后也到了 A,此时就会发现 A 已经在执行,或者已经完毕(失败),那么就不应该再重复执行 A。

还有一种场景,如下图,A 和 D 并行开始,D 先执行完了,开始执行 Result 任务,此时 B 和 C 都还没开始,然后 Result 执行完了,虽然 B 和 C 都还没执行,但是已经没必要执行了。B 和 C 这些任务是可以被跳过的,跳过的原则是他们的 NextWrapper 已经有结果了或者已经在执行了。我提供了 checkNextWrapperResult 方法来控制,当后面的任务已经执行了,自己还要不要执行的逻辑控制。当然,这个控制仅限于 nextWrapper 只有一个时才有成立。

bianpai7.jpg

并发场景之依赖上游的执行结果作为入参

譬如 A-B-C 三个执行单元,A 的入参是 String,出参是 int,B 呢它需要用 A 的结果作为自己的入参。也就是说 A、B 并不是独立的,而是有结果依赖关系的。

在 A 执行完毕之前,B 是取不到结果的,只是知道 A 的结果类型。

那么,我的框架也支持这样的场景。可以在编排时,就取 A 的结果包装类,作为 B 的入参。虽然此时尚未执行,必然是空,但可以保证 A 执行完毕后,B 的入参会被赋值。

并发场景之全组任务的超时

一组任务,虽然内部的各个执行单元的时间不可控,但是我可以控制全组的执行时间不超过某个值。通过设置 timeOut,来控制全组的执行阈值。

并发场景之高性能、低线程数

该框架全程无锁,没有一个加锁的地方。

创建线程量少。

bianpai8.jpg

asyncTool 解决任意的多线程并行、串行、阻塞、依赖、回调的框架 如这样的,A 会运行在 B、C 执行更慢的那个单元的线程上,而不会额外创建线程。

asyncTool 特点

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

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

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

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

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

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

上一篇: 京东618大促毫秒级热key探测框架设计与实践
推荐文章
  • 架构师在进行系统设计时,遵循一套复杂且综合的方法论,主要包括以下核心步骤:需求分析:理解并明确业务需求是架构设计的第一步。架构师需要与各利益相关者深入沟通,收集和分析业务需求、性能需求、安全性需求、扩展性需求等。领域建模:基于需求分析,构建抽象的业务模型或数据模型,明确系统的边界、核心实体及其关系。
  • 根据阿里交易型业务的特点,以及在双十一这样业内罕有的需求推动下,我们在官方的MySQL基础上增加了非常多实用的功能、性能补丁。而在使用MySQL的过程中,数据一致性是绕不开的话题之一。本文主要从阿里巴巴“去IOE”的后时代讲起,向大家简单介绍下我们过去几年在MySQL数据一致性上的努力和实践,以及目
  • 随着深度学习在图像、语言、广告点击率预估等各个领域不断发展,很多团队开始探索深度学习技术在业务层面的实践与应用。而在广告CTR预估方面,新模型也是层出不穷:WideandDeep、DeepCrossNetwork、DeepFM、xDeepFM,美团很多篇深度学习博客也做了详细的介绍。但是,当
  • 1.背景搜索优化问题,是个典型的AI应用问题,而AI应用问题首先是个系统问题。经历近10年的技术积累和沉淀,美团搜索系统架构从传统检索引擎升级转变为AI搜索引擎。当前,美团搜索整体架构主要由搜索数据平台、在线检索框架及云搜平台、在线AI服务及实验平台三大体系构成。在AI服务及实验平台中,模型训练平台
  • 行业算法版简介OpenSearch-行业算法版是基于阿里巴巴自主研发的大规模分布式搜索引擎搭建的一站式智能搜索业务开发平台,目前为包括淘宝、天猫在内的阿里集团核心业务提供搜索服务支持。通过内置各行业的查询语义理解、机器学习排序算法等能力,提供充分开放的引擎能力,助力开发者快速搭建智能搜索服务。Ope
  • 一.概述我们在考虑MySQL数据库的高可用的架构时,主要要考虑如下几方面:如果数据库发生了宕机或者意外中断等故障,能尽快恢复数据库的可用性,尽可能的减少停机时间,保证业务不会因为数据库的故障而中断。用作备份、只读副本等功能的非主节点的数据应该和主节点的数据实时或者最终保持一致。当业务发生数据库切换时
学习大纲
 京东618大促毫秒级热key探测框架设计与实践
京东asyncTool解决任意的多线程编排框架