高并发场景下的接口调用优化

2023-09-22 11:12:14

AI绘画关于SD,MJ,GPT,SDXL百科全书

面试题分享点我直达

2023Python面试题

2023最新面试合集链接

2023大厂面试题PDF

面试题PDF版本

java、python面试题

项目实战:AI文本 OCR识别最佳实践

AI Gamma一键生成PPT工具直达链接

玩转cloud Studio 在线编码神器

玩转 GPU AI绘画、AI讲话、翻译,GPU点亮AI想象空间

史上最全文档AI绘画stablediffusion资料分享

AI绘画 stable diffusion Midjourney 官方GPT文档 AIGC百科全书资料收集

AIGC资料包

最近在项目中遇到一个性能瓶颈,就是一个接口需要调用多个下游接口获取数据并合并后返回。由于下游接口数量较多,下载的数据量也不小,导致接口响应时间过长,严重影响了系统的性能。经过分析,这个接口天然适合用并发编程进行优化。今天就来聊聊我是如何用Java中的并发工具类来优化这个接口的。
首先,这个接口的调用流程其实很简单:

  1. 接收请求
  2. 同时调用5个下游接口,获取返回的数据
  3. 合并下游接口返回的数据
  4. 返回合并后的数据很明显,这里的性能瓶颈在于同时调用下游接口。为了提高并发程度,我们可以使用Java并发包中的ExecutorService来实现线程池,然后提交多个任务到线程池中执行。
    java
    // 创建一个固定大小的线程池
    ExecutorService executor = Executors.newFixedThreadPool(5);

// 提交任务到线程池执行
for (int i = 0; i < 5; i++) {
executor.submit(() -> {
// 调用下游接口
});
}

// 关闭线程池
executor.shutdown();
这样我们就可以最大程度地发挥多线程的优势,5个下游接口调用任务可以同时进行,效率会提高很多。但是,这样还不够。接口的请求量可能变化很大,固定大小的线程池可能会导致资源浪费或者无法处理请求。所以我们可以使用缓存线程池:
java
ExecutorService executor = Executors.newCachedThreadPool();
缓存线程池会根据请求量动态调整线程数,可以提高资源利用率。另外,我们还需要处理线程池中任务的返回结果。可以通过Future来实现:
java
List<Future> futures = new ArrayList<>();

for (int i = 0; i < 5; i++) {
Future future = executor.submit(() -> {
// 调用下游接口并返回结果
});

futures.add(future);
}

// 遍历futures获取结果
for (Future future : futures) {
Result result = future.get();
// 处理结果
}
这样就可以很方便地获取线程池中任务的返回结果进行后续处理了。最后,我们可能还要合并下游接口返回的数据。可以使用Stream API来实现数据的聚合:
java
List results = futures.stream()
.map(future -> future.get())
.collect(Collectors.toList());

Result mergedResult = merge(results);
Stream可以很好地利用多核 CPU,进一步优化性能。到此,经过并发编程的优化,这个接口的瓶颈就基本上解决了。调用下游接口的时间大大缩短,系统的吞吐量也得到了提升。并发编程是一个非常重要且强大的工具,在 Java 中有很多现成的并发工具类供我们使用,例如线程池、Future等,合理利用可以大大优化我们系统的性能。

更多推荐

地球系统模式(CESM)技术应用

近年升级的CESM2.0在大气、陆地、海洋、海冰、陆冰、径流等几大模块以及一个中央耦合器(CIME)中都有较大更新,可以在不同的硬件平台上移植使用,尤其可以用于CMIP6的研究。CESM中CIME(CommonInfrastructureforModelingtheEarth)为模式配置、编译和运行提供个例控制器。CA

web浏览器公网远程访问jupyter notebook【内网穿透】

文章目录前言1.Python环境安装2.Jupyter安装3.启动JupyterNotebook4.远程访问4.1安装配置cpolar内网穿透4.2创建隧道映射本地端口5.固定公网地址前言JupyterNotebook,它是一个交互式的数据科学和计算环境,支持多种编程语言,如Python、R、Julia等。它在数据科学

数据不平衡GPT调研

数据不平衡判别式和生成式的区别是什么判别式模型(DiscriminativeModels)生成式模型(GenerativeModels)对比对于AE或者VAE这种生成式模型,其实更关注数据本身,那这种有什么好处?那对于判别式模型,它更关注什么呢?它存在什么样的弊端?比如可能落入局部最优,无法进行优化啥的展开讲讲这个判别

android 存储新特性

分区存储本页内容应用访问限制将分区存储与FUSE搭配使用FUSE和SDCardFSFUSE性能微调减轻与FUSE相关的性能影响隐私优势远超性能劣势MediaProvider和FUSE更新分区存储会限制应用访问外部存储空间。在Android11或更高版本中,以API30或更高版本为目标平台的应用必须使用分区存储。之前,在

性能测试监控指标及分析调优 | 京东云技术团队一、哪些因素会成为系统的瓶颈?

1.什么是MAF和MEF?MEF和MEF微软官方介绍:ManagedExtensibilityFramework(MEF)-.NETFramework|MicrosoftLearnMEF是轻量化的插件框架,MAF是复杂的插件框架。因为MAF有进程隔离和程序域隔离可选。我需要插件进程隔离同时快速传递数据,最后选择了MAF

【FAQ】安防视频监控平台EasyNVR无法控制云台,该如何解决?

TSINGSEE青犀视频安防监控平台EasyNVR可支持设备通过RTSP/Onvif协议接入,并能对接入的视频流进行处理与多端分发,包括RTSP、RTMP、HTTP-FLV、WS-FLV、HLS、WebRTC等多种格式。在智慧安防等视频监控场景中,EasyNVR可提供视频实时监控直播、云端录像、云存储、录像检索与回看、

vue3如何导入使用自定义yaml配置文件

要在Vue3中导入和使用自定义的YAML配置文件,你可以按照以下步骤进行操作:安装所需的依赖:首先,确保你的项目中已经安装了vue和vue-router。你还需要使用js-yaml库来解析YAML文件,可以使用以下命令进行安装:npminstalljs-yaml创建YAML文件:在你的项目中创建一个YAML文件,用于存

Linux 软件包管理器-yum使用

文章目录前言一、yum使用1、什么是软件包2、yum源3、yumlist指令4、yuminstall指令5、yumremove指令二、git的使用1、gitee中仓库的创建2、仓库的克隆3、提交代码到远程仓库4、提交时可能遇到的问题5、.gitignore文件6、删除文件前言一、yum使用1、什么是软件包在Linux下

SLAM从入门到精通(消息传递)

【声明:版权所有,欢迎转载,请勿用于商业用途。联系信箱:feixiaoxing@163.com】前面我们只是编写了一个publisher节点,以及一个subscribe节点。有了这两个节点,它们之间就可以通信了。在实际生产中,我们除了简单的通信之外,要传递的数据可能还有很多。这个时候,我们就要构建一个消息体。这个消息体

C# 流Stream详解(3)——FileStream源码

【FileStream】构造函数如果创建一个FileStream,常见的参数例如路径Path、操作方式FileMode、权限FileAccess。这里说下FileShare和SafeFileHandle。我们知道在读取文件时,通常会有两个诉求:一是如何更快的读取文件内容;二是如何减少读取文件的消耗。常见的加快读取文件的

在ubuntu20.04中创建虚拟机:Oracle VirtualBox - 7中安装Windows-10(64bit)

问题描述之前一直在用ubuntu20.04,但是今天遇到一个需求:需要判定.exe文件是否可以正常运行,这样一来可能就需要一个虚拟机来佐助了,当然也搜了一些其他的处理办法,但是我大概看了一下,并不能满足我的需求。如果有需要请看:linux下如何完美运行exe文件?https://www.zhihu.com/questi

热文推荐