复杂并发场景下的并发调度模型在转转的演进之路

news2024/11/20 15:28:05

文章目录

    • 一、问题背景
    • 二、复杂并发场景释义
      • 2.1 简单并发场景
      • 2.2 复杂并发场景
    • 三、分组并发调度模型演进
      • 3.1 简单异步并发调度
      • 3.2 分组并发调度
    • 四、自驱动并发调度模型演进
      • 4.1 一个优化耗时的小目标及其实现
      • 4.2 下一步的疑惑
      • 4.3 对问题的重新思考以及自驱动并发调度模型的诞生
          • 4.3.1 重新思考
        • 4.3.2 自驱动并发调度模型
    • 五、结语

一、问题背景

设想,打开一个 APP,我们会看到什么?答案是:内容信息

例如当我们打开转转 APP 时,目光所及的首页、商品列表页、商品详情页…以上我们简称为信息聚合场景。在电商 APP 中,此类信息聚合场景往往需要聚合多种数据源才能完成最终渲染,这也意味着在微服务架构中,服务端响应一次用户请求需要聚合 N 个内部 RPC 请求响应的数据才能完成最终响应。

而为了尽快响应用户请求,往往需要通过某些方式异步发起多个 RPC 请求来获取结果数据,我们把这样的过程称为并发场景

二、复杂并发场景释义

2.1 简单并发场景

较为简单的信息聚合场景,一次信息聚合过程只需要 N 个相互独立的 RPC 结果即可。如下图所示:

2.2 复杂并发场景

较为复杂,但却常见的重要信息聚合场景。通常意味着响应一次用户请求的过程:1,需要聚合多个 RPC 响应结果;2,内部多个 RPC 请求之间存在相互依赖关系,如下图所示:D 的 request 依赖 A、B 的 response;E 的 request 依赖 C、D 的 response;…

三、分组并发调度模型演进

3.1 简单异步并发调度

为了尽量提升服务端的请求响应速度,我们可以有一些简单的方式,如:
基于 Future 等基础能力,在一次用户请求的处理过程中,异步执行没有前后依赖关系的 RPC 过程。
这种方式通常更适用于简单并发场景,而复杂并发场景下怎么办呢?
自然而然,我们很容易想到一个方式:分组并发调度。

3.2 分组并发调度

分组并发调度主要适用于一次用户请求处理过程需要聚合多个存在前后依赖关系的 RPC 查询结果的复杂并发场景中,通常我们会使用如下方案:


1,分组:将所有 RPC 查询过程按照依赖关系分组。如:没有前置依赖的 RPC 过程认为是第一组;依赖第一组的 RPC 过程认为是第二组;依此类推…

2,调度:基于 CompleteFuture、Future 等基础能力,依次从第一组开始并发执行组内的 RPC 过程。即:组间同步、组内异步。


为了提升开发效率,我们可以基于 Future 等基础能力重新封装自己的分组并发调度工具,甚至集成并发治理等方面的能力,如:细粒度的超时调控、熔断降级机制,以大幅度降低治理工作成本。

四、自驱动并发调度模型演进

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,框架能力的聚焦:框架聚焦于任意两点之间的连线能力,从而实现全图的自动编织。

五、结语

本文的讲述侧重于并发调度模型演进的思考过程,讲述了基于对问题的理解再理解的探索过程去寻找当前最佳解决方案的思路,也是转转公司复仇者联盟技术生态系列之奥创组件的由来。


关于作者

陈奇恩,转转 B2C 业务供应链后端负责人。


转转研发中心及业界小伙伴们的技术学习交流平台,定期分享一线的实战经验及业界前沿的技术话题。
关注公众号「转转技术」(综合性)、「大转转FE」(专注于FE)、「转转QA」(专注于QA),更多干货实践,欢迎交流分享~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/127721.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

蓝桥集训(附加面试题)第八天

本文来源于算法面试题特训专栏,这里有大量专业性的算法题比如(动态规划21天,大厂特训28天等等) 欢迎大家一起学习。 链接:传送门 目录标题导读Java蓝桥集训面试题点击直接资料领取导读 在刚刚结束的 每日算法&面…

【pandas】教程:3-取DataFrame子集

pandas 取 DataFrame 的子集 pandas 选择列 注: 引用库的导入和数据的导入只做一次,所有代码是在 jupyter notebook 里完成的。 import pandas as pd titanic pd.read_csv("data/titanic.csv")只要年龄数据 ages titanic["Age"…

速度杠杠的,部署机器学习模型的这7个要点要谨记

在模型部署时,模型的性能和耗时都非常重要。但是我们在构建模型时,往往没有考虑模型的预测速度。虽然性能优化会损害预测准确性,但更简单的模型通常运行得更快,也不容易过拟合。 预测延迟被测量为进行预测所需的经过时间。延迟通常被视为一个…

降维和特征选择的对比介绍

在machine learning中,特征降维和特征选择是两个常见的概念,在应用machine learning来解决问题的论文中经常会出现。特征降维和特征选择的目的都是使数据的维数降低,使数据维度降小。但实际上两者的区别是很大,他们的本质是完全不…

Java整合RocketMQ实现生产消费

文章目录参考文档环境搭建生产者普通消息同步发送异步发送单向传输顺序消息延迟消息批量消息事务消息消费者Push消费Pull 消费代码仓库参考文档 RocketMQ作为阿里系开源项目,有非常成熟的中文文档可以快速了解并上手。 环境部署控制台安装RocketMQ常见问题 环境搭…

【现代机器人学】学习笔记八:轨迹生成

这节课的内容主要讲述如何通过插值等方式生成一条满足运动学约束的运动轨迹。这节的内容在全书中较少,相比前一章开链动力学而言,可以说内容少了许多。但是这节的内容却是目前在机械臂应用方面使用最广泛的一节。 闲话休提,马上开始&#xf…

ThreeJS:创建第一个三维场景

场景效果 ThreeJS与WebGL WebGL使得开发者可以直接使用显卡的计算资源,创建高性能的二维和三维计算机图形效果,然后在JavaScript脚本中进行WebGL编程,创建三维场景并生成动画。但是,原生的WebGL编程是十分复杂的,且容易出错。然而,Three.JS库可以简化WebGL的开发过程。 基…

十、Java 17 新特性

十、Java 17 新特性 JDK 17 在 2021 年 9 月 14 号正式发布了!根据发布的规划,这次发布的 JDK 17 是一个长期维护的版本(LTS)。Java 17 提供了数千个性能、稳定性和安全性更新,以及 14 个 JEP(JDK 增强提案&#xff09…

示波器应用(二)

前篇我们对场景六基色色相和白平衡还有明度进行了验证,对黑白场做了微调。后面我们还需要对场景调光。 本篇主要涉及一些画面美术知识,不感兴趣可以跳过。 我们需要先了解一个摄影知识 曝光 下面要说到一种颜色模式HSB,HSB分别表示&#…

Redhat-ansible-合集

1.安装 2.部署ANSIBLE 2.1INVENTORY 2.2ANSIBLE配置文件 2.3AD HOC命令 3.PLAYBOOK 4.变量 5.ansible vault加密变量 6.ansible_facts 7.loop 8.条件判断 9.handler处理 10.错误处理 11.tags标签 12.管理文件 13.template模板 14.host-pattern 15.动态Inventory 16.ro…

玻纤效应对skew的影响(一)

在高速SerDes传输系统中,随着信号速率的提高,UI会越来越小,传输线的对内skew会越来越大。以PCIe信号来说,PCIe4.0速率的一个UI是62.5ps,当速率提高到PCIe5.0时,每个UI就只有31.25ps,更进一步&am…

SparkSQL源码分析系列01-Catalyst作用

SparkSQL 是如何将SQL语句转化为Spark任务的呢? 详细过程如下图 通过拉去 github 的 Spark 源码,查看 SparkSQL 模块的 readme.txt 文件可以看出,SparkSQL 包含4个方面的内容 SparkSQL源码主要包含4大模块 Catalyst (sql/catalyst)&…

Solidity之为什么 ++i 比 i++ 省gas

文章目录为什么 i 比 i 省gas测试验证demo1demo2为什么 i 比 i 省gas为什么 i 比 i 省gas i通常更昂贵,因为它必须增加一个值并“返回”旧值,因此可能需要在内存中保存两个数字我在记忆中只使用过一个数字。在许多情况下,在编译器优化之后&a…

【SVM】简单介绍(四)

1、Soft Margin SVM 对偶求解 构造拉格朗日函数 L12∥w∥2C∑i1nξi−∑i1nαi(yi(wTxib)−1ξi)−∑i1nγiξiαi≥0γi≥0\begin{aligned} & L\frac{1}{2}\|w\|^2C \sum_{i1}^n \xi_i-\sum_{i1}^n \alpha_i\left(y_i\left(w^T x_ib\right)-1\xi_i\right)-\sum_{i1}^n \ga…

dagum基尼系数分析全流程

Dagum系数分析 Dagum基尼系数是传统基尼gini系数的升级,其可分解为组内系数、组间系数和超变密度系数,即Dagum 组内Gw 组间Gb 超变密度Gt。 组内Gw分别反映各地区内部水平的差距、组间Gb反映各地区之间水平的差距,以及超变密度Gt反映各地区…

Strtus2漏洞 - Struts2-052 Struts2-057 Struts2-059

文章目录S2-052(CVE-2017-9805)环境搭建漏洞复现S2-057(CVE-2018-11776)环境搭建漏洞复现S2-059(CVE-2019-0230)环境搭建漏洞复现S2-052(CVE-2017-9805) 原理:Struts2 REST插件的XStream组件存在反序列化漏洞,使用XStream组件对XML格式的数据包进行反序…

为什么说DeFi隐私协议Unijoin.io具备趋势性

区块链技术以点对点、去中心化、公开透明、不可逆等作为其主要特点,而基于区块链的加密货币原生的具备了区块链技术的种种特性,这意味着通常每一笔链上交易都是透明可查的。虽然加密账户以“伪匿名”作为主要特点,但我们也同样看到&#xff0…

强大的ANTLR4(1)

以前对于《编译原理》这门课有一种恐惧,现在强大的工具越来越多,有些原理并不一定要非常清楚,也是可以设计一种编程语言的,那就是ANTLR4。 Antlr4(全名:ANother Tool for Language Recognition&#xff09…

Redis集群系列六 —— 分片集群搭建

Redis 常用集群中,常用的几种集群方案有:主从集群、哨兵集群、分片集群,不同的集群对应着不同的场景,并且各种集群也都有不同的优劣,本篇将以 redis 分片集群为切入点。 主从和哨兵虽然解决了高可用、高并发读的问题&…

spring之IoC注解(二)

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录前言一、Spring注解的使用1、加入aop的依赖2、在配置文件中添加context命名空间3、在配置文件中指定扫描的包4、在Bean类上使用注解二、Bean的选择性实例化1、需求2、…