导出主要考虑生成Excel文件存储数据。但是,Excel一般是有行列的最大限制的。因此,实现导出逻辑的时候需要把一个表存储多少行、多少列,创建多少表的方案考虑进去。
遇到海量数据,如超百万的导出,我们又该如何处理?
Excel的限制
Excel2003及以前版本支持65536行,256列;Excel2007及以后版本支持1048576行,16384列;Excel2003一个工作簿中最多有255个工作表,而在Excel2007及以上的版本没有限制。
所以,遇到海量数据,如超百万数据的导出,一般会很慢、超时或者卡死。
海量数据导出方案思考
导出思路概要导出单机版
导出单机版,通过服务端定时从数据库拉取任务队列,然后通过拆分查询的方式,远程获取导出客户端的数据,汇总成导出文件,最后存储到MongoDB中。
导出服务端处理逻辑前端则通过轮询的方式,异步获取后端结果。如果成功,则下载Excel汇总文件。从而,避免前端超时。
导出前端处理逻辑定时任务,可基于es-job分片处理,将不同导出拆分到不同的SERVER端执行。
分布式版本
导出的分布式实现,由导出单机版本抽取出来,同一个导出实现拆分为多个SERVER端执行,最终结果存储于MongoDB中,再汇总打包成一个zip包。有效提高单机版对单个海量数据导出的性能和提高可用性。
原则上SERVER端可以无限扩展,因此,能支持海量数据的导出处理。
流程参考:导出服务端处理逻辑
通用代码
曾经每一个导出功能的实现,都需要实现一段几乎一样的代码。因此,抽离通用的代码段,实现统一的入口、出口,以任务类型作为区分不同的代码实现。并引入脚本引擎,实时更新导出的逻辑实现。
提供QLExpress和Groovy脚本支持。
导出脚本编译逻辑提供预处理、查询、数据组装三块脚本逻辑处理。
导出脚本实现逻辑客户端集成
由于客户端需要跟提供查询功能的APP集成在一起。因此,提供导出的SDK集成,只要简单配置即可实现一个通用导出客户端。例如,使用dubbo的RPC处理。可以利用group区分不同的客户端。
导出多客户端支持异常处理与补偿
维护一个导出的状态队列,并设置超时时间。全部成功视为成功;存在失败,则重试失败,超时则跳过并给出相应提示。如下列表:
分片ID | 处理参数 | 处理结果 |
---|---|---|
1 | {startTime:2019-2-20;endTime:2019-2-21;index:1,limit:2000} | success |
2 | {startTime:2019-2-21;endTime:2019-2-22;index:1,limit:2000} | failed |
3 | {startTime:2019-2-22;endTime:2019-2-23;index:1,limit:2000} | success |
... | ... | ... |
网友评论