2026/2/20 10:07:45
网站建设
项目流程
手机企业网站模板,如何看一个网站开发语言,官方网站下载拼多多app,科技公司名称大全背景物资系统”物资库存”导出功能#xff0c;导出的数据几千条上万条#xff0c;耗时非常长#xff0c;经分析#xff0c;导出前端主导#xff0c;前端一页一页地获取#xff0c;全部获取完成后#xff0c;前端生成xlsx文件。设计有两个问题#xff0c;1, 分页大小1…背景物资系统”物资库存”导出功能导出的数据几千条上万条耗时非常长经分析导出前端主导前端一页一页地获取全部获取完成后前端生成xlsx文件。设计有两个问题1, 分页大小100几千条数据前后端来回几十次2数据全部放在浏览器用户内存使用造成压力本文介绍大数据量处理性能优化方案引入进程内的并行执行组件多线程分片并行执行支持数据量少降级到单线程减少消耗支持进度反馈使用磁盘文件支持百万数据导出本组件是进程内的分片并行若分布式的并行执行支持几十上百节点大规模计算需引入zookeeper并行执行组件组件使用ExecutorService和CountDownLatch实现多线程并行支持平均分片策略支持进度实时反馈开发示例本节以物资系统的”物资库存”为例介绍并行组件开发和使用整个过程分3个阶段0 准备首先设置线程数量实际根据数据量和系统负载计算合适的线程数生成uuid返回给前端后续前端带上uuid查询进度下载文件执行状态缓存两种方式本地map分布式redis前者在集群环境要考虑session亲和uuid哈希但健壮性不好如节点下线或者增加节点都会出问题推荐使用redis更新进度closure需要原子操作可以使用lua或者getAndSet的原子操作保证进度在多线程下正确更新上图准备写入文档1 导出任务上图构建进度闭包类执行中任务的线程各自累加完成量计算出进度上图是分片执行体整个需要使用executor异步执行因为ShardingExecutor使用LatchCountDown阻塞等待所有执行线程。构建和初始化执行器安全上下文业务处理可能需要用到用户信息权限信息等手动传递上下文如果使用了inherited线程本地变量可自动传递业务逻辑实现为Consumer接收分片即total根据平均分片业务方法getPage自行解释可以是0~n也可以是a-c等等数据处理完毕进度inc更新进度方法需要线程安全可以使用AtomicLong之类的保证上图是进度闭包的简单实现2 定时获取进度前端打开任务后带上uuid定时调用获取进度3 下载客户端使用UUID下载文件X 定时清理任务服务端实现定时清理任务根据任务超时时间和进度清理这是全局的若不需支持进度反馈合并上面123为一个方法并在最后清理不需要全局的清理任务。Benchmark模拟服务端导出列表包括写入excel文件数据量使用过滤ISSUEUNIT字段控制数据1000线程数 1310数据数/线程数131012671.77/1.85/1.751.80/1.70/1.681.77/1.69*以上统计连续跑3次小数点后第三位不为0进一单位秒下同数据4000线程数 13510数据数/线程数1351040004.23/3.53/3.462.67/2.40/2.332.24/2.15/2.032.76/2.10/2.36数据20000线程数 51020数据数/线程数51020241685.70/5.46/5.474.45/4.63/4.534.88/4.21/4.41数据40000线程数 5102030数据数/线程数51020304271011.95/10.84/10.377.39/7.386.93/6.696.30/6.25以上测试在IDE执行jar包jdk服务模式运行性能会好些总结数据量越大线程数多性能好反之数据量少线程少性能好或者区别不大NEXT优化可重置可复用的线程池降低线程构建和销毁的消耗