使用FutureTask来提高接口的并发性能优化经验以及踩坑记录

背景:

批量数据采集接口,随着时间的推移,设备一次性上传的数据包越来越大,大到一次性需要处理64条数据,而每条数据需要花费大量的时间去处理,那么如果串行对任务进行处理的话,那么总时间就是N * 64

神操作来了:

使用FutureTask来进行并发操作

1、需要先定义一个并发处理线程池

1)注意注意,需要注意核心线程参数设置,否则会暴雷

  1. 注意注意,需要注意队列和最大线程数设置,否则会暴雷
复制代码
// 定义一个任务列表,方便后面阻塞获取线程执行的结果
List<FutureTask<SaveCollectDataReq>> taskList = new ArrayList<>(); 
for (SaveCollectDataReq saveCollectDataReq : saveCollectDatas) {
    FutureTask<SaveCollectDataReq> futureTask = new FutureTask(new BatchProduceTask(saveCollectDataReq, processOrderProduceService));
    taskList.add(futureTask);
    // 这里是将任务快速提交到线程池,并发处理
    taskAsyncExecutor.submit(futureTask);

}
for (FutureTask<SaveCollectDataReq> saveCollectDataReqFutureTask : taskList) {
    SaveCollectDataReq saveCollectDataReq = null;
    try {
        // 这里是获取并发处理的结果,方便后续的操作
        saveCollectDataReq = saveCollectDataReqFutureTask.get();
        if (Objects.isNull(saveCollectDataReq)) {
            continue;
        }
    } catch (InterruptedException | ExecutionException e) {
        log.error("数据批处理过程异常:",e);
        throw new AiipcBizException(e.getMessage());
    }
}

上面的代码上没什么坑,主要的坑在于线程池,线程的核心数、最大数、队列数以及拒绝策略,这几个参数都会影响接口的执行效率,了解一下

复制代码
CallerRunsPolicy拒绝策略,这个策略是干什么的呢,他不会像其他策略那样抛弃任务或直接报异常,他会退化成由调用者执行这个任务,坑爹的地方自己想吧。
相关推荐
Lazy_zheng33 分钟前
前端页面更新检测实战:一次关于「用户不刷新」的需求拉扯战
前端·vue.js·性能优化
wadesir2 小时前
提升系统效率的关键(Linux文件系统性能优化入门教程)
linux·网络·性能优化
小毅&Nora3 小时前
【向量数据库】Milvus向量数据库 ③ 深度解析与性能优化实战
数据库·性能优化·milvus
yiyeguzhou10013 小时前
论文解读:CortenMM- Efficient Memory Management with Strong Correctness Guarantees
性能优化·云计算
闲人编程13 小时前
Django中间件开发:从请求到响应的完整处理链
python·中间件·性能优化·django·配置·codecapsule
❆VE❆13 小时前
【技术分享】前端跨窗口/标签页面通信:掌握以下几种方法,提升用户体验(附带常用场景以及典例)
前端·javascript·性能优化·vue·跨标签通信
年小个大20 小时前
优化App启动时间?startup-coroutine是什么?
性能优化·架构·kotlin
ZouZou老师1 天前
FFmpeg性能优化经典案例
性能优化·ffmpeg
七夜zippoe1 天前
使用Ollama在消费级硬件上运行大模型:从环境配置到企业级实战
性能优化·大模型·模型量化·ollama
2401_861277551 天前
Web应用程序、服务器、数据库性能测试工具Jemeter使用方法与举例说明
性能优化·压力测试