文章連結:
目前想法已初步實現,見博文:
資料訂正帶來的動態任務執行框架的想法
I. 背景
對於後端而言,資料訂正可算是非常非常頻繁且常見的事情了,常見的有DB、快取、記憶體等資料來源中的資料訂正,對於非應用記憶體而言,其他有實體或者可以直接通過官方的提供的控制檯連線進行修改的資料訂正,相對比較簡單,而對於應用記憶體,如果沒有應用內通知並處理相關邏輯,多半就只能重啟應用來實現重新整理記憶體快取了
當然我這裡說的也不是記憶體資料更新,最近遇到的一個問題就是redis快取中的資料有問題,需要訂正,而並不是簡單的把資料刪了就行,需要根據某些資料,做一些計算,然後得出新的資料,並寫回到快取
這樣看來好像也不太麻煩,如果沒有第三方依賴,大不了寫個python指令碼或者php指令碼,重新算一下,也沒什麼毛病
然而實際情況卻並不是這樣,問題有以下幾點:
- 資料經過ProtoBuf進行編碼存入redis,反序列化是個問題
- 資料計算有依賴外部服務,如只能通過rpc呼叫第三方介面,而rpc框架沒有提供php或python的sdk
基於此,就想也米有辦法,可以直接搞一個專案,可以執行Groovy指令碼,在Groovy指令碼中實現資料訂正邏輯?需求如下
- 支援Groovy指令碼的動態更新(支援動態新增,刪除和修改指令碼)
- Groovy指令碼可友好的訪問我們需要的外部資源
II. 設計
根據上面的想法,一個簡單的設計思路就新鮮出爐了,我們的框架核心只需要支援兩點即可:
- 實時載入指令碼
- 執行指令碼
當然為了擴充套件,以及提供更優雅的使用環境,則需要支援:
- 豐富的外掛支援
- json序列化外掛
- http外掛
- rpc外掛
- redis快取外掛
- 自定義各種外掛
- 外掛可動態載入就更棒了
- 避免蛋疼的jar包衝突
1. 專案結構
專案結構圖大致如下
2. 流程說明
a. Task Watcher
主要用來監聽所有的Task變動,包括新增,刪除or修改指令碼,然後將最新的指令碼撈出來,扔給框架
b. execute
主體的執行邏輯,主要是解析task(即groovy指令碼),並根據task的變更事件,來決定是新增,刪除還是更新任務,然後從任務池中停掉舊的任務,執行新的任務
c. plugin
這裡提供豐富的第三方外掛,供task呼叫
2. 實現
對於實現,未完待續,下一篇再說
II. 其他
1. 一灰灰Blog: https://liuyueyi.github.io/hexblog
一灰灰的個人部落格,記錄所有學習和工作中的博文,歡迎大家前去逛逛
2. 宣告
盡信書則不如,已上內容,純屬一家之言,因個人能力有限,難免有疏漏和錯誤之處,如發現bug或者有更好的建議,歡迎批評指正,不吝感激
- 微博地址: 小灰灰Blog
- QQ: 一灰灰/3302797840