背景
做过2B类系统的同学都知道,2B系统最恶心的操作就是什么都喜欢批量,这不,我最近就遇到了一个恶心的需求——50个用户同时每人导入1万条单据,每个单据七八十个字段,请给我优化。

Excel导入技术选型
说起Excel导入的需求,很多同学都做过,也很熟悉,这里面用到的技术就是POI系列了。
但是,原生的POI很难用,需要自己去调用POI的API解析Excel,每换一个模板,你都要写一堆重复而又无意义的代码。
所以,后面出现了EasyPOI,它基于原生POI做了一层封装,使用注解即可帮助你自动解析Excel到你的Java对象。
EasyPOI虽然好用,但是数据量特别大之后呢,会时不时地来个内存溢出,甚是烦恼。
所以,后面某里又做了一些封装,搞出来个EasyExcel,它可以配置成不会内存溢出,但是解析速度会有所下降。
如果要扣技术细节的话,就是DOM解析和SAX解析的区别,DOM解析是把整个Excel加载到内存一次性解析出所有数据,针对大Excel内存不够用就OOM了,而SAX解析可以支持逐行解析,所以SAX解析操作得当的话是不会出现内存溢出的。
因此,经过评估,我们系统的目标是每天500万单量,这里面导入的需求非常大,为了稳定性考虑,我们最后选择使用EasyExcel来作为Excel导入的技术选型。
导入设计
我们以前也做过一些系统,它们都是把导入的需求跟正常的业务需求耦合在一起的,这样就会出现一个非常严重的问题:一损俱损,当大导入来临的时候,往往系统特别卡。
导入请求同其它的请求一样只能打到一台机器上处理,这个导入请求打到哪台机器哪台机器倒霉,其它同样打到这台机器的请求就会受到影响,因为导入占用了大量的资源,不管是CPU还是内存,通常是内存。
还有一个很操蛋的问题,一旦业务受到影响,

本文讲述了面对50个用户同时导入1万条包含七八十个字段的Excel数据需求时,如何进行性能优化。选择了EasyExcel作为导入技术,通过设计异步导入流程,引入Kafka削峰,优化ES和MySQL的连接池配置,以及调整Kafka参数,最终将处理时间从10分钟降低到4分半。此外,文章讨论了后续可能的优化方向,如分库分表和批量操作。
最低0.47元/天 解锁文章
300

被折叠的 条评论
为什么被折叠?



