客戶端將計費信息(扣的條數、費用…..)提交到計費子系統,計費子系統收到請求,將數據緩存到本地Cache(可以是內存、或者其他Cache,本地緩存數據結構是Key-Quue, key為用戶標識,Queue用於存放用戶計費信息),並且通知任務分配服務為其分配一個線程處理扣費信息(只分配一次,以後這個線程就出來這個用戶),一條處理扣費線程可處理多個用戶,但一個用戶不能分配到多個處理扣費線程中。通知完後立即返回響應。(由於只有分配一次,所以只有第一次稍後會慢個零點幾毫米,後面幾乎響應耗時為0)。
處理扣費服務啟動後,將根據自己持有處理用戶Key,去從本地緩存中獲取到該用戶Key引用的隊列實例,直接從實例中讀取該用戶的計費信息進行扣費即可,為了處理速度快,可以從隊列中批量讀取,合計後一次性從數據庫中扣除。扣除完成後,更新本地余額緩存。
接口設計:1.提供一個計費接口
2.提供一個獲取余額接口
協議類型:通信協議建議采用Socket。
客戶校驗余額:直接獲取內存中的余額,避免對庫開銷太大。
分布式集群:對本地緩存和任務分配服務設計成共享,即可分布式和集群。
Queue:建議所使用實現“無等待 (wait-free)”算法算法的隊列。
處理扣費服務:對處理的用戶數量可配,在用戶扣費信息量非常非常大時,可設置成一個線程一個用戶,用戶量少時可以一個線程處理多個用戶,以節省資源。(也可以寫一個簡單的算法去只能判斷一下當前的用戶計費信息量)
下面看下架構的草圖