淺談導出Execl的報表數據解決方案

項目中免不了要作一些數據導出功能,好比導出前一天的訂單記錄。涉及導出功能可大可小,根據系統具體的用戶量、一天的訂單量等狀況。今天就討論一下怎麼設計一個合理的導出功能。數據庫

0x01:同步導出

這個方案最簡單,就只需一個導出接口。這個接口只需實現根據用戶條件到數據庫查詢相關數據,而後在應用程序中生成Execl電子表格,最後經過Response把生成的Execl電子表格回寫到客戶端便可瀏覽器

image.png

該方案簡單,由於是同步導出,因此不適用大量數據導出。若是使用該方案進行大量數據導出的話,存在客戶端(瀏覽器)超時的狀況,致使導出失敗;由於瀏覽器與Nginx之間有超時設置。服務器

0x02:異步導出

異步導出通常須要設計三個接口。異步

第一個接口:開啓一個線程對進行數據查詢,並對查詢到的數據進行Execl電子表格讀寫操做,同步返回導出狀態標識;
第二個接口:查詢第一個接口的完成狀態,若是完成Execl電子表格操做,則返回true;不然返回false;
第三個接口:根據第二個接口返回的狀態,若是返回true,就調用下載Execl電子表格;不然返回false的話繼續輪詢調用第二個接口,直到返回true;ide

image.png

這種方案比較耗服務器性能,由於須要第二個接口輪詢應用服務器的導出狀態,設置一個比較合理的輪詢週期顯得很是必要。另外,第一種方案和第二種方案都沒有對導出的結果進行存庫記錄,若是要下載一樣的數據,要整個流程從新走一遍。這樣的話就引出第三種方案。性能

0x03:導出服務

該方案須要一張表和兩個接口。線程

表的做用是用來存儲誰進行了數據導出,導出的電子表格Execl存放的硬盤目錄
第一個接口:開啓一個線程對進行數據查詢,並對查詢到的數據進行Execl電子表格讀寫操做,最後把電子表格的目錄存儲到數據庫;同步返回成功;
第二個接口:在導出列表中找出導出的記錄,而後調用該接口進行Execl電子表格下載;設計

image.png

該方案須要額外作一個管理下載記錄的界面,進行下載管理;這個方案的最大好處就是對下載操做進行了記錄。若是須要對相同的數據導出,只需導出一遍便可。不過增長了存儲的空間,不管數據庫仍是硬盤,都增長了。blog

在實際項目中使用哪一種方案,根據具體業務場景,具體選擇便可。其餘文件類型的導出方案也能夠參考該文章的方案進行操做。接口

相關文章
相關標籤/搜索