最近提交了一個專利,是基於去年作的一個異步數據導出的項目,平穩支撐了16/17年的雙十一,抽時間把其中的細節分享出來數據庫
數據導出excel的傳統方法通常都是先將數據生成到內存中,而後利用excel的一些工具類生成excel文件經過http請求或者ftp返回給用戶。可是在數據量很大或者併發量很高的場景中,每每會致使內存飆高或者頻繁的FullGC,嚴重時會致使宕機。若是分批進行導出則導出數據量的大小與用戶等待時間成正比,用戶體驗較差。緩存
咱們的初衷就是要解決數據導出形成的內存溢出。本文將介紹一種分佈式的分片數據導出方法,解決了系統的內存壓力,能支撐大數據量及高併發的數據導出,具備較高的效率及擴展性。多線程
方案分析架構
第一種方案中,雖然使用了多線程進行導出,可是數據最終仍是須要在內存中轉換生成excel文件,這樣不能真正解決內存壓力問題。併發
第二種方案中,雖然解決了大數據量的內存問題,可是數據是分批輸送給用戶的,體驗較差,同時不能解決高併發的問題,具備侷限性。異步
同時,現有的方案中,通常都是在一臺機器上進行分批導出,本質上都用增長導出時間的方式來緩解內存壓力,是一種用時間換空間的方式。用戶須要等待較長的時間,體驗較差。分佈式
咱們一樣也是基於分治的思想,可是採用了分佈式的解決方案,將一個大數據的導出分片並分紅多個子任務在不一樣的機器上進行導出,而且數據存儲爲csv格式文件,能夠以追加的方式進行存儲 高併發
但願達到的技術效果:工具
方案實現大數據
一方面,數據量很大的狀況下,不能將數據所有緩存在內存中,須要分片進行導出;另外一方面併發量很大時,一臺機器也不能知足需求,須要在分佈式環境下分散每臺機器的壓力,這樣就擁有了良好的擴展性。
這種分片及分佈式的數據導出方法,用於解決大數據量或高併發場景下數據導出問題,可以減輕系統內存壓力,同時具備良好的擴展性。
整體流程以下:
分佈式分片導出方法:
說明
這種數據導出架構的核心思想有4個: