千万级海量数据导出中间件的思考

导出主要考虑生成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
.........

转载于:https://my.oschina.net/u/1404949/blog/3039458

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值