当前位置: 首页 > 科技观察

复杂并发场景下并发调度模型的演化

时间:2023-03-15 21:55:49 科技观察

1.问题背景假设,打开一个APP,我们会看到什么?答案是:内容信息。比如我们打开转转APP,映入眼帘的首页、商品列表页、商品详情页……我们简称为信息聚合场景。在电商APP中,这种信息聚合场景往往需要聚合多个数据源来完成最终的渲染,这也意味着在微服务架构中,服务端需要聚合N个内部RPC请求响应的数据来响应一个用户要求。完成最后的回复。为了尽快响应用户请求,往往需要通过某种方式异步发起多个RPC请求,获取结果数据。我们称这样的过程为并发场景。2.复杂并发场景解读2.1简单并发场景对于比较简单的信息聚合场景,一个信息聚合过程只需要N个相互独立的RPC结果。如下图所示:2.2Complexconcurrentscenario复杂但又常见的重要信息聚合场景。通常表示响应一个用户请求的过程:1、需要聚合多个RPC响应结果;2、多个内部RPC请求之间存在相互依赖关系,如下图:D的请求依赖于A和B的响应;E的请求依赖于C和D的响应;...3.组并发调度模型的演进3.1简单的异步并发调度为了尽可能的提高服务器的请求响应速度,我们可以有一些简单的方法,比如:基于Future等基础能力,在用户请求处理过程中,异步执行无前后端依赖的RPC流程。这种方式通常比较适合简单的并发场景,但是复杂的并发场景呢?自然,我们很容易想到一个办法:分组并发调度。3.2分组并发调度分组并发调度主要适用于一个用户请求处理过程中需要聚合多个RPC查询结果的复杂并发场景。通常我们采用如下方案:1.分组:将所有RPC查询过程按照Dependency分组。例如:没有前置依赖的RPC进程被认为是第一组;依赖于第一组的RPC进程被认为是第二组;组启动在组内并发执行RPC过程。即:组间同步,组内异步。为了提高开发效率,我们可以基于Future等基础能力重新封装自己的组并发调度工具,甚至可以集成并发治理能力,如:细粒度的超时控制,断路器降级机制,大大降低成本的治理工作。4.自驱动并发调度模型的演化4.1小耗时优化目标及其实现2020年Q2,转转基础生态有这样一个OKR:实现核心接口的稳定平均耗时减少整个平台不到90ms。不可忽视的背景是,当时接口耗时在120ms左右,受下游服务器影响,呈每周10ms的上升趋势。为了完成这个不太可能的目标,我们做了以下几件事:1.分析接口单元贡献值:主要基于接口QPS,分析单个响应时间每减少10ms对全局响应的贡献值界面,确定优化方向。2、了解每一毫秒的耗时:假设我们从监控平台可以看到某个接口耗时200ms,但不清楚具体耗时在哪里。为此,我们执行每个接口内部的逻辑,从代码行的维度监控耗时,力求全面了解每一毫秒。3、并发调度调整:基于以上准备,优化耗时接口。这期间,我们发现严格的组并发调度模型无法实现最优调度。因此,我们破坏了原有的分组模型,提取了一些没有来回依赖的长周期RPC进程进行全局异步调度。Q2末,全平台核心接口平均耗时降至85ms,超额完成目标。4.2对下一步的疑惑随着耗时的优化目标的完成,我们有一些疑惑:1.开发和维护工作依然繁琐:在复杂的并发场景下,业务迭代,代码损坏严重。一个小需求的迭代可能需要太多的时间去熟悉代码。2、接口耗时优化反复工作:回顾过去,每隔一定时间(比如一两周,一两个月),调整并发模型和优化组织分组逻辑都需要时间尽可能消除业务迭代。影响。3.基于组的并发调度模型的权衡:结合上述目标的完成过程,我们将基于组的并发调度模型用于性能,并破坏已建立的性能模型。信息聚合场景接口优化耗时,下一步怎么办?4.3反思问题和自驱动并发调度模型的诞生4.3.1反思回顾过去,我们做了什么?无非是:编织一幅画。上图展示了一次用户请求(如商品列表页搜索)内部RPC聚合过程,最简单的聚合节点相当于一个RPC请求过程。回顾我们的开发工作,会发现其实我们在做的是:1.划点:比如业务栏目需要显示事件信息,此时会增加一个用于查询事件信息的RPC聚合节点.2.连接:我们把可以并发查询的节点按照依赖关系放在同一个组中。3.绘图:组织并发调度,各组数据同步,并行驱动下一组。整个过程可以概括为:点击形成一条线,线形成一个平面。或许这是对复杂并发场景下一系列表面问题的更深层次的描述。4.3.2自驱动并发调度模型基于以上考虑,可以发现在业务开发中:1.与业务逻辑强相关的增量逻辑在于“点”。2、弱关联业务逻辑的重复工作成本在于“图的连接”和“编织”。那么,有没有一种可能:开发者只关心“点”,而额外的框架能力处理“线”和“图”?也就是说,“移入线,移入面”中的“动”工作,是框架能力自动支持的。因此,自驱动的并发调度模型就是基于这样的愿景而诞生的,总体设计方向如下:1.聚焦开发模式:实现面向节点行为的开发模式2.聚焦框架能力:框架聚焦任意两点Thread能力上的自动连接,从而实现整幅画面的自动编织。五、结论本文的叙述着重于并发调度模型演进的思考过程,描述了基于对问题的理解和再理解,寻找当前最佳解决方案的探索过程。组件的来源。