1、背景介绍:最近一直被OOM问题缠绕,原因是表单下载功能访问量比较大,数据量相当多,表单数据存储在mongodb,数据总量2亿多,每个实例总内存限制1.5G左右,线上部署了5个实例,但是最大承受时间也不过3天,于是决定逐步优化解决此问题
2、环境介绍:
2.1、vm: openjdk:8-jre-alpine
2.2、docker 部署,k8s管理
3、问题呈现:
3.1、导出大批量Excel时,nginx 504
3.2、访问量高 && 导出大批量Excel,出现OOM
4、问题分析:
4.1、nginx 504 问题,服务器长时间无响应,根本原因是同步操作,mongodb查询慢
4.2、数据保存在mongodb,mongodb分页是深分页,会全表扫描
5、解决办法:
5.1、导出采用异步操作,多线程异步处理
5.2、大批量的Excel采用下载到磁盘,统一压缩为zip文件上传到腾讯云,
5.3、能尽量用基本类型的不使用引用类型异步操作如图示

具体代码如下:
设置线程池,核心线程数不是越大越好,具体文章请参考
https://blog.csdn.net/wang123459/article/details/82079250
线程池资料参考
https://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/scheduling/concurrent/ThreadPoolTaskExecutor.