記錄 對供貨商財務報表的導出的優化


場景: 每個月跑完結算數據,生成各個供貨商的結算報表數據
前置條件:一份離線報表的生成 受供貨商訂單的數量影響 ,時間在  5秒~30秒,尤其在購物節或者有推廣活動時,時間還會增加
          一份報表的生成 需要包括 訂單信息,結算數據,商品信息,發貨信息。
 第一版:查詢所有供貨商 。循環生成報表,(無疑是有問題的)
 第二版:
       1.經過分析發現,其實每份報表的獨立性是很高的,天生就適合多線程併發運行,我們把數據收集 和 報表生成分拆成兩個步驟,我們採用了生產者消費者模式,首先將所有供應商生成報表任務放入一個隊列有一組線程去處理,當完成收據收集後,加入到另外一個生成報表的隊列 因爲每個供貨商報表數據收集完成的時間並一致,採用CompletionService作爲線程池,先執行完的先返回,並不受加入順序影響
       2.對於爆款商品 在供貨商之間重複很高,爲了避免重複性查詢。肯定要使用緩存機制,無意Map是最適合的根據商品id拿到商品詳情,考慮併發安全使用ConcurrentHashap,首先從緩存取,取不到再去查一次,
       3.由於一個訂單包含多個商品,一個用戶可以重複購買,最後使用三個個MAP,一個緩存商品,一個緩存訂單,一個緩存用戶
第三版:
       1.考慮到Map類型對內存的使用率低,一般只有20%-40%,ConcurrentHashap會更低,每次動輒幾千商品信息放在map 要佔用幾百M的內存。爲了限制Map的大小改用了ConcurrentLinkedHashMap,他本身是對ConcurrentHashap的封裝,可以設定最大長度,並實現了基於LRU最少使用算法策略進行數據更新的緩存,對於冷門的商品在容量滿了以後可以從緩存中去掉,提高內存利用率
       2.對線程池參數的調整

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章