定制化开发事故案例——大批量文件下载原创
金蝶云社区-技术支持与赋能部_ZH
技术支持与赋能部_ZH
4人赞赏了该文章 430次浏览 未经作者许可,禁止转载编辑于2023年12月19日 14:19:39

一、关键词

大批量、文件下载、硬盘存储、PdfReader、URL

二、项目背景

某定制化项目有一需求会定期大批量下载苍穹文件服务器中的PDF文件,下载到本地硬盘服务器中。该项目的文件服务器部署在某云上。

项目上线后,客户发现系统一些重要文件被外网大量下载,且硬盘容量骤降!被迫暂停服务运行,来排查问题!排查后发现竟是内部调用?!

三、反面真实代码案例(错误示范,不要模仿!!!!!

1、循环遍历执行文件下载的操作,且代码中取文件服务器文件地址获取的是外网URL

错误点

(1)大批量遍历执行文件下载,不仅影响服务整体性能还给本地硬盘存储增加很大压力!

(2)苍穹文件服务器上的附件通过外网URL下载,客户误以为机密文件从外网泄露!从外网下载也有可能产生不必要的流量费用!

image.png

2、PdfReader接收到了外网URL,执行了下载的操作

image.png

四、影响范围

1、大批量执行下载操作,使客户硬盘服务器容量骤降,接近系统崩溃。被迫停止服务运行接近1天,来排查问题。

2、大量重要文件从外网被下载,有泄露风险

3、大量文件从外网被下载,还涉及到流量收费,文件服务器是部署在某云上的


五、优化思路

做大批量文件下载定制化开发,应能提前想到可能引发的问题,及时做出应对策略。包括性能、存储、流量等方面。


六、改正方案(重要!!!!!!)

1、循环遍历下载附件,可以优化为先批量打包成压缩包再执行下载。可以有效的降低资源损耗。

2、在不影响业务前提下,尽量降低文件下载请求频次和数量和优化可执行时间,批量文件下载操作对系统资源都是有损耗的,不能无限制无条件的执行。

3、下载文件服务器中的附件,不应该用外网URL,外网URL下载可能产生流量费用

错误示范

PdfReader reader= new PdfReader( String fullURL);

正确示范,path是文件的相对路径不是全路径

InputStream in=FileServiceFactory.getAttachmentFileService.getInputStream(String path);
PdfReader reader= new PdfReader(in);

4、硬盘存储应采取定期垃圾文件清理机制,否则长期以往硬盘服务器还是有宕机风险。


赞 4