Ⅰ 通過Redis消息隊列實現大文件處理
一、故事背景
1、讀取離線文件數據,再通過【離線數據】作為條件,查詢第三方介面,返回最終的結果,再入庫。
2、 業務邏輯是很簡單, 讀取文件、查詢介面、返回數據集、入庫 四步。
3、業務特性:第三方介面調用400毫秒(ms) 。
如果用普通單線程去跑算500毫秒一個請求,一天也就跑8W多數據量,20多億的數據不知道跑到猴年馬月了。
二、處理方案
A) 初步方案採用ganymed-ssh2(文件都存儲在Linux伺服器上) 來讀文件,Redis來存儲消息、多線程來提升處理能力。
B) 流程圖:
三、呈現問題
四、優化問題
最終流程圖:
1、 通過Redis做一個計數器 每讀取一行記錄數值,即使服務終止後,先從Redis讀取這個數值
再通過cat指定行數開始讀數據即可。
2、 通過取模拆Key 分片到不同小Key存儲 ,降低單個節點存儲壓力,也充分利用了存儲資源。
3、Redis Push 提供了批量方式(leftPushAll) ,可以指定讀取行數再批量入庫,而pop並沒有提供批量 只能一個一個pop。
4、消費者通過多線程pop、再分發到線程去處理。
五、總結問題