当前位置: 首页 > news >正文

【Java核心能力】京东并行框架asyncTool如何针对高并发场景进行优化?

欢迎关注公众号(通过文章导读关注:【11来了】),及时收到 AI 前沿项目工具及新技术的推送!

在我后台回复 「资料」 可领取编程高频电子书
在我后台回复「面试」可领取硬核面试笔记

文章导读地址:点击查看文章导读!

感谢你的关注!

京东并行框架asyncTool如何针对高并发场景进行优化?

image-20240306205501996

由于最近在整理并发相关的内容,整理了 CompletableFuture、CAS、线程池这些方面的内容,但是通过理论知识我们只是学会了:怎么去用?应该怎么去用?

但是并没有学习别人如何去用,没有实际场景的示范,恰巧看到了 tianyaleixiaowu 作者开源出来的 asyncTool 并行框架 ,并且已经在 京东App后台接受苛刻、高并发、海量用户等复杂场景业务的检验测试

所以这篇文章就以这个并行框架为例,来说一下如何在高并发场景中保证比较好的性能,即如何通过 CompletableFuture、CAS、线程池去提升性能表现!

asyncTool 介绍及使用

首先介绍一下这个框架的作用,主要是用来进行一些并行任务的编排的,以及任务执行时的一些监控和回调

那么你可能会想了,不是有 CompletableFuture 来做任务编排呢?为什么还需要这个框架?

这个作者也说了,CompletableFuture 虽然提供了任务编排的能力,但是尚有不足,比如我们有多个任务,并对他们编排,但是我们想要 了解每个任务在开始执行以及执行结束的情况 ,对这些情况进行监控,那么在这种情况下 CompletableFuture 就无能为力了!

这里我们举一个简单的使用例子,有 3 个任务,需要执行完 task1 之后再执行 task2,执行完 task2 之后再执行 task3,流程如下:

image-20240306193924568

接下来定义任务,需要实现 IWorker、ICallback 两个接口,主要是定义其中的回调以及任务执行方法,这里可以不用具体了解,毕竟我们主要是看它是如何使用线程池的,只需要知道这个 MyTask1 是我们需要执行的任务即可

image-20240306194144787

接下来我们定义测试类,这里使用了 3 个任务,只需要将上边定义的 MyTask1 再复制两份即可

image-20240306194458355

在这个测试类中,创建了 3 个任务实例,并且定义了 3 个 WorkerWrapper 包装类,这个 Wrapper 主要对要执行的任务进行 包装、编排 ,比如我们定义了 workerWrapper1 并通过 next 方法指定下一个执行的任务是 workerWrapper2 ,通过 next 进行任务的编排

最后通过 Async.beginWork() 来提交任务即可,接下来核心就看 asyncTool 是如何执行任务的

CompletableFuture 和线程池配合使用

上边说如何使用,主要是为了找到任务开始执行的入口,从 入口 开始,看框架对于任务的处理:

image-20240306200130488

从入口进入,最后走到下边这个 核心方法 中:

image-20240306195936251

在这个方法中,可以看到是定义了一个 CompletableFuture 数组 ,来存储任务的异步执行结果

之后将我们定义的任务都扔到 线程池 中来执行,来将任务进行异步执行,提升任务执行速度,最后通过通过 CompletableFuture.allOf().get() 来阻塞等待所有任务执行完毕,最后返回即可

可以看到,在执行一些耗时操作中,异步化基本上都是必备的操作,也就是通过 CompletableFuture线程池 来搭配使用,将任务的耗时操作异步化出去,尽量不影响主干流程

线程池的定义

上边说到了 asyncTool 中将 CompletableFuture线程池 搭配使用,线程池具体如何定义的呢,这里其实使用了 newCachedThreadPool 线程池,具体的参数定义如下:

image-20240306201338457

可以发现该线程池中并没有设置 核心线程 ,并且 线程的存活时间设置为 60s ,任务队列使用了 SynchronousQueue 任务队列,为什么要使用这个线程池呢?

先从场景来看,这个 asyncTool 框架主要是对提交的并行任务进行编排执行的,但是该框架其实并不知道任务什么时候会去提交,以及任务的数量大小的

所以在 asyncTool 中对于默认线程池的线程数量的设置就没有一个合适的值,如果设置的少了,可能任务提交多了之后, 导致任务堆积 OOM如果设置的多了,很多线程就会一直空闲,比较浪费线程资源

因此呢,就不设置核心线程,将最大线程数设置为 Integer.MAX_VALUE ,并且要与任务队列 SynchronousQueue 搭配使用

因为线程池的工作流程其实是先来判断有没有核心线程,没有核心线程的话,会将任务提到任务队列中阻塞等待,而 SynchronousQueue 这个任务队列是没有容量的,只做任务传递的作用,因此任务不会阻塞在队列中,直接会创建非核心线程执行任务(如果使用了 有容量的任务队列 ,就会出现问题了,当任务提交到任务队列之后,此时没有核心线程,任务会一直在任务队列中阻塞,得不到执行)

  • 线程池参数这样设置的好处

当没有任务的时候,线程池中不需要再维护核心线程的存活,可以节约线程资源

当有任务提交的时候,线程池会根据任务的数量来创建对应的线程数量执行任务,这样就不会因为线程数设置过多或者过少而出现一些问题了

CAS 的使用

asyncTool 框架的目的就是编排并行任务的执行,那么既然是并行任务肯定要保证多线程环境下任务不会重复执行这些情况出现

在 asyncTool 中并没有使用 synchronized 以及 ReentrantLock 这些比较重量级的锁,而是使用 CAS 来保证任务不会重复执行

这里看一下在这个框架中,任务真正被执行时的代码,如何来保证任务不被重复执行的(为了重点代码清晰,省略了一部分非核心代码):

image-20240306205102997

可以看到,在真正执行任务之前,会先通过 CAS 来判断任务的状态是否是 INIT ,是的话,表示任务还没有被执行;如果不是的话,说明已经被执行过了,或者任务出现了异常,这里直接返回结果就好了

如果 CAS 操作失败,说明任务的状态并不是 INIT ,任务已经开始执行了,所以这里就不要重复执行了

并且在执行完任务之后,再次通过 CAS 操作判断任务状态,如果已经不是 WORKING ,说明其他线程已经执行完该任务了或者其他线程在执行时发现任务出现异常,因此这里就直接返回了,避免在后边重复的进行任务回调操作

为什么说 CAS 操作比较轻量呢?

这个如果了解 synchronized 的锁升级流程的话,应该就知道为什么

在 synchronized 锁升级的过程中,轻量级锁就是通过 CAS 来获取锁的,而重量级锁是通过 线程的阻塞、唤醒 进行线程之间的获取锁操作

那么 CAS 操作性能就高在了它只需要去内存中进行值的比对,发现内存的值和期望值不同,就直接返回操作失败就可以了

如果在 asyncTool 中使用 synchronized 来保证线程之间的同步的话,这还需要进行线程之间的阻塞、唤醒操作,因此会出现线程之间的上下文切换以及用户态和内核态之间的转换,导致性能开销比较大

所以在 asyncTool 不去对线程同步进行控制,而是通过 CAS 来避免一些因为重复操作可能会带来的问题,这样性能就比较高了

asyncTool 开源框架项目地址: https://gitee.com/jd-platform-opensource/asyncTool

如果需要测试代码的话,可以从我 fork 的仓库中拉取:https://gitee.com/qylaile/asyncTool

相关文章:

【Java核心能力】京东并行框架asyncTool如何针对高并发场景进行优化?

欢迎关注公众号(通过文章导读关注:【11来了】),及时收到 AI 前沿项目工具及新技术的推送! 在我后台回复 「资料」 可领取编程高频电子书! 在我后台回复「面试」可领取硬核面试笔记! 文章导读地址…...

如何在Mapbox GL中处理大的GEOJSON文件

Mapbox GL可以将 GeoJSON 数据由客户端(Web 浏览器或移动设备)即时转换为 Mapbox 矢量切片进行显示和处理。本文的目的是教大家如何有效加载和渲染大型 GeoJSON 源,并优化渲染显示速度,增强用户体验,减少客户端卡顿问题。本文以Mapbox 为例,至于其它框架原理大致相同,可…...

Vue.js过滤器:让数据展示更灵活

🤍 前端开发工程师、技术日更博主、已过CET6 🍨 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 🕠 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 🍚 蓝桥云课签约作者、上架课程《Vue.js 和 E…...

【深度学习笔记】计算机视觉——FCN(全卷积网络

全卷积网络 sec_fcn 如 :numref:sec_semantic_segmentation中所介绍的那样,语义分割是对图像中的每个像素分类。 全卷积网络(fully convolutional network,FCN)采用卷积神经网络实现了从图像像素到像素类别的变换 :cite:Long.Sh…...

物联网行业如何发展新质生产力

物联网行业作为当今科技发展的前沿领域,其在新质生产力的提升中扮演着举足轻重的角色。为了推动物联网行业的快速发展,我们需要从技术创新、产业融合、人才培养和政策支持等多个方面入手,共同构建一个有利于物联网行业发展的生态环境。 首先…...

manjaro 安装 wps 教程

内核: Linux 6.6.16.2 wps-office版本: 11.10.11719-1 本文仅作为参考使用, 如果以上版本差别较大不建议参考 安装wps主体 yay -S wps-office 安装wps字体 (如果下载未成功看下面的方法) yay -S ttf-waps-fonts 安装wps中文语言 yay …...

Spring AOP基于注解方式实现

1. 场景介绍 目前假设我们有一个计算器类,并要为其中的方法添加日志功能。 计算器类如代码所示: public interface Calculator {int add(int i, int j);int sub(int i, int j);int mul(int i, int j);int div(int i, int j);}public class Calculator…...

MySQL中常用的操作语句已汇总

目录 一、库语句 1.查询现有数据库 2.创建数据库 3.选中数据库 ​编辑 4.删除数据库 二、初阶表操作 1.查看数据库现有表 2.查看表结构 3.创建表 4.删除表 5.全列查询 6.删除表2 7.修改操作 三、插入操作 1.全列插入 2.指定列插入 3.一次插入多组数据 4.插入…...

linux设置nginx systemctl启动

生成nginx.pid文件 #验证nginx的配置,并生成nginx.pid文件 /usr/local/nginx/sbin/nginx -t #pid文件目录在 /usr/local/nginx/run/nginx.pid 设置systemctl启动nginx #添加之前需要先关闭启动状态的nginx,让nginx是未启动状态 #关闭nginx /usr/local…...

stable diffusion faceswaplab换脸插件报错解决

错误提示: ERROR - Failed to swap face in postprocess method : apply_overlay() takes 3 positional arguments but 4 were given 打开插件对应目录: \sd-webui-aki-v4.6.1\extensions\sd-webui-faceswaplab\scripts\faceswaplab_utils中 imgutil…...

Kap - macOS 开源录屏工具

文章目录 关于 Kap 关于 Kap Kap 是一个使用web技术的开源的屏幕录制工具 官网:https://getkap.cogithub : https://github.com/wulkano/Kap 目前只支持 macOS 12 以上,支持 Intel 和 Apple silicon 你可以前往官网,右上方下载 你也可以使…...

Linux/Ubuntu/Debian基本命令:光标移动命令

Linux系统真的超级好用,免费,有很多开源且功能强大的软件。尤其是Ubuntu,真的可以拯救十年前的老电脑。从今天开始我将做一个Linux的推广者,推广普及Linux基础。 光标移动命令对于在终端(Terminal)内有效导…...

nvm下载,nodejs下载

进入nvm中文网,按照它的教程来,很简单!!! 往下翻...

大数据开发(Hadoop面试真题-卷七)

大数据开发(Hadoop面试真题) 1、Map的分片有多大?2、MapReduce的map进程和reducer进程的ivm垃圾回收器怎么选择可以提高吞吐量?3、MapReduce作业执行的过程中,中间的数据会存在什么地方?不会存在内存中吗&a…...

计算机网络(基础篇)复习笔记——体系结构/协议基础(持续更新中......)

目录 1 计算机网络基础相关技术Rip 路由更新操作 2 体系结构(OSI 7层, TCP/IP4层)应用层运输层网络层IPv4无分类域间路由选择 CIDRIPV6 数据链路层循环冗余校验CRC协议设备 物理层传输媒体信道复用技术宽带接入技术数据通信 3 网络局域网(以太网Ethernet) 4 通信过程编码:信道极…...

怎么做加密文件二维码?分享文件更安全

怎么做一个加密文件二维码?在日常的工作和生活中,通过扫描二维码来查看或者下载文件的方式,被越来越多的人所使用,一方面是二维码的成本低,另一方面有利于提升便捷性和用户体验。 为了保证内容的隐私性和安全性&#…...

手机中常用的传感器

文章目录 重力传感器 Gravity sensor三维坐标 加速度传感器 Accelerometer三维坐标 陀螺仪 Gyroscope三维坐标 磁力传感器 Magnetometer三维坐标 光线传感器 Light Sensor接近传感器 Proximity Sensor其他传感器协同工作相机自动调整 传感器有唤醒和非唤醒属性 关于重力传感器和…...

电脑工作电压是多少你要看看光驱电源上面标的输入电压范围

要确定电脑的工作电压,必须查看电源上标注的输入电压范围。 国内法规规定民用220V电压范围为10%-15%,也就是说通信220V电压正常范围为187--242V,供电设备一般为180V。 --250V电压范围,即正常情况下电脑电源电压不低于187V即可工作…...

自动驾驶---Motion Planning之Speed Boundary

1 背景 在上篇博客《自动驾驶---Motion Planning之Path Boundary》中,笔者主要介绍了path boundary的一些内容,通过将道路中感兴趣区域的动静态障碍物投影到车道坐标系中,用于确定L或者S的边界,并利用道路信息再确定Speed的边界,最后结合粗糙的速度曲线和路径曲线,即可使…...

php文件操作

一、文件读取的5种方法 1,file_get_contents: 将整个文件读入一个字符串 file_get_contents( string $filename, bool $use_include_path false, ?resource $context null, int $offset 0, ?int $length null ): string|false 可以读取本地的文件也可以用来打…...

观成科技:隐蔽隧道工具Ligolo-ng加密流量分析

1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具,该工具基于TUN接口实现其功能,利用反向TCP/TLS连接建立一条隐蔽的通信信道,支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式,适应复杂网…...

AI-调查研究-01-正念冥想有用吗?对健康的影响及科学指南

点一下关注吧!!!非常感谢!!持续更新!!! 🚀 AI篇持续更新中!(长期更新) 目前2025年06月05日更新到: AI炼丹日志-28 - Aud…...

突破不可导策略的训练难题:零阶优化与强化学习的深度嵌合

强化学习(Reinforcement Learning, RL)是工业领域智能控制的重要方法。它的基本原理是将最优控制问题建模为马尔可夫决策过程,然后使用强化学习的Actor-Critic机制(中文译作“知行互动”机制),逐步迭代求解…...

三维GIS开发cesium智慧地铁教程(5)Cesium相机控制

一、环境搭建 <script src"../cesium1.99/Build/Cesium/Cesium.js"></script> <link rel"stylesheet" href"../cesium1.99/Build/Cesium/Widgets/widgets.css"> 关键配置点&#xff1a; 路径验证&#xff1a;确保相对路径.…...

大型活动交通拥堵治理的视觉算法应用

大型活动下智慧交通的视觉分析应用 一、背景与挑战 大型活动&#xff08;如演唱会、马拉松赛事、高考中考等&#xff09;期间&#xff0c;城市交通面临瞬时人流车流激增、传统摄像头模糊、交通拥堵识别滞后等问题。以演唱会为例&#xff0c;暖城商圈曾因观众集中离场导致周边…...

渗透实战PortSwigger靶场-XSS Lab 14:大多数标签和属性被阻止

<script>标签被拦截 我们需要把全部可用的 tag 和 event 进行暴力破解 XSS cheat sheet&#xff1a; https://portswigger.net/web-security/cross-site-scripting/cheat-sheet 通过爆破发现body可以用 再把全部 events 放进去爆破 这些 event 全部可用 <body onres…...

【android bluetooth 框架分析 04】【bt-framework 层详解 1】【BluetoothProperties介绍】

1. BluetoothProperties介绍 libsysprop/srcs/android/sysprop/BluetoothProperties.sysprop BluetoothProperties.sysprop 是 Android AOSP 中的一种 系统属性定义文件&#xff08;System Property Definition File&#xff09;&#xff0c;用于声明和管理 Bluetooth 模块相…...

BCS 2025|百度副总裁陈洋:智能体在安全领域的应用实践

6月5日&#xff0c;2025全球数字经济大会数字安全主论坛暨北京网络安全大会在国家会议中心隆重开幕。百度副总裁陈洋受邀出席&#xff0c;并作《智能体在安全领域的应用实践》主题演讲&#xff0c;分享了在智能体在安全领域的突破性实践。他指出&#xff0c;百度通过将安全能力…...

QT: `long long` 类型转换为 `QString` 2025.6.5

在 Qt 中&#xff0c;将 long long 类型转换为 QString 可以通过以下两种常用方法实现&#xff1a; 方法 1&#xff1a;使用 QString::number() 直接调用 QString 的静态方法 number()&#xff0c;将数值转换为字符串&#xff1a; long long value 1234567890123456789LL; …...

【碎碎念】宝可梦 Mesh GO : 基于MESH网络的口袋妖怪 宝可梦GO游戏自组网系统

目录 游戏说明《宝可梦 Mesh GO》 —— 局域宝可梦探索Pokmon GO 类游戏核心理念应用场景Mesh 特性 宝可梦玩法融合设计游戏构想要素1. 地图探索&#xff08;基于物理空间 广播范围&#xff09;2. 野生宝可梦生成与广播3. 对战系统4. 道具与通信5. 延伸玩法 安全性设计 技术选…...