最近提交了一个专利,是基于去年作的一个异步数据导出的项目,平稳支撑了16/17年的双十一,抽时间把其中的细节分享出来数据库
数据导出excel的传统方法通常都是先将数据生成到内存中,而后利用excel的一些工具类生成excel文件经过http请求或者ftp返回给用户。可是在数据量很大或者并发量很高的场景中,每每会致使内存飙高或者频繁的FullGC,严重时会致使宕机。若是分批进行导出则导出数据量的大小与用户等待时间成正比,用户体验较差。缓存
咱们的初衷就是要解决数据导出形成的内存溢出。本文将介绍一种分布式的分片数据导出方法,解决了系统的内存压力,能支撑大数据量及高并发的数据导出,具备较高的效率及扩展性。多线程
方案分析架构
第一种方案中,虽然使用了多线程进行导出,可是数据最终仍是须要在内存中转换生成excel文件,这样不能真正解决内存压力问题。并发
第二种方案中,虽然解决了大数据量的内存问题,可是数据是分批输送给用户的,体验较差,同时不能解决高并发的问题,具备局限性。异步
同时,现有的方案中,通常都是在一台机器上进行分批导出,本质上都用增长导出时间的方式来缓解内存压力,是一种用时间换空间的方式。用户须要等待较长的时间,体验较差。分布式
咱们一样也是基于分治的思想,可是采用了分布式的解决方案,将一个大数据的导出分片并分红多个子任务在不一样的机器上进行导出,而且数据存储为csv格式文件,能够以追加的方式进行存储 高并发
但愿达到的技术效果:工具
方案实现大数据
一方面,数据量很大的状况下,不能将数据所有缓存在内存中,须要分片进行导出;另外一方面并发量很大时,一台机器也不能知足需求,须要在分布式环境下分散每台机器的压力,这样就拥有了良好的扩展性。
这种分片及分布式的数据导出方法,用于解决大数据量或高并发场景下数据导出问题,可以减轻系统内存压力,同时具备良好的扩展性。
整体流程以下:
分布式分片导出方法:
说明
这种数据导出架构的核心思想有4个: