最近提交了一个专利,是基于去年做的一个异步数据导出的项目,抽时间把其中的细节分享出来
数据导出 excel 的传统方法一般都是先将数据生成到内存中,然后利用 excel 的一些工具类生成 excel 文件通过 http 请求或者 ftp 返回给用户。但是在数据量很大或者并发量很高的场景中,往往会导致内存飙高或者频繁的 FullGC,严重时会导致宕机。如果分批进行导出则导出数据量的大小与用户等待时间成正比,用户体验较差。
我们的初衷就是要解决数据导出造成的内存溢出。本文将介绍一种分布式的分片数据导出方法,解决了系统的内存压力,能支撑大数据量及高并发的数据导出,具有较高的效率及扩展性。
方案分析
第一种方案中,虽然使用了多线程进行导出,但是数据最终还是需要在内存中转换生成 excel 文件,这样不能真正解决内存压力问题。
第二种方案中,虽然解决了大数据量的内存问题,但是数据是分批输送给用户的,体验较差,同时不能解决高并发的问题,具有局限性。
同时,现有的方案中,一般都是在一台机器上进行分批导出,本质上都用增加导出时间的方式来缓解内存压力,是一种用时间换空间的方式。用户需要等待较长的时间,体验较差。
我们同样也是基于分治的思想,但是采用了分布式的解决方案,将一个大数据的导出分片并分成多个子任务在不同的机器上进行导出,并且数据存储为 csv 格式文件,可以以追加的方式进行存储
希望达到的技术效果:
方案实现
一方面,数据量很大的情况下,不能将数据全部缓存在内存中,需要分片进行导出;另一方面并发量很大时,一台机器也不能满足需求,需要在分布式环境下分散每台机器的压力,这样就拥有了良好的扩展性。
这种分片及分布式的数据导出方法,用于解决大数据量或高并发场景下数据导出问题,能够减轻系统内存压力,同时具有良好的扩展性。
总体流程如下:
p.p1 {margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px"Helvetica Neue"; color: #454545; min-height: 14.0px} p.p2 {margin: 0.0px 0.0px 0.0px 0.0px; text-align: justify; font: 12.0px".PingFang SC"; color: #454545} span.s1 {font: 12.0px"Helvetica Neue"} span.Apple-tab-span {white-space: pre}
说明
这种数据导出架构的核心思想有 4 个:
来源: https://www.cnblogs.com/cishengchongyan/p/8125127.html