1.節點結構
前面的Baikal介紹中提到用節點將業務拆解,並使用關係節點將業務連接起來並控制業務流轉。
結構解釋:
1.BaseNode 所有節點的基類,存放着節點的共性
2.BaseRelation 所有關係節點的基類,children是關係節點下的所有子節點,具體的有介紹中所說的AndRelation,AnyRelation,AllRelation ,NoneRelation ,TrueRelation
3.BaseLeafFlow 葉子節點,所有過濾性條件的基類,供具體業務繼承並實現其doFlow方法,返回true和false代表是否滿足/是否通過
4.BaseLeafResult 葉子節點,所有結果性質的類的基類,供具體業務繼承並實現其doResult方法,返回true和false代表結果是否被髮放,如發放獎勵等
5.BaseLeafNone 葉子節點,所有僅數據組裝/數據加載等不干預流程的類的基類,供具體業務繼承並實現其doNone方法,無返回值,數據的組裝和加載後放入上下文中,供後續流程使用
2.基礎流程
上圖爲一個以往版本的解釋,現已大部分優化,但原理一致
1.業務通過BaikalPack數據包進入Baikal執行,需指定要執行的baikalId/scene(場景)
2.BaikalPack組裝成BaikalContext在Baikal中流轉
3.依託觀察者模式,將數據庫/其他地方配置的完整的baikal樹形結構,經過組裝形成對應執行的handler,在特定scene/baikalId下觸發並執行handle方法
3.Client設計
1.各自app在項目啓動時通過Mq拉取最新配置,並組裝到本地緩存
2.當server發現某app下有更新,便推送更新到具體業務並更新Baikal緩存
3.server端實現可視化配置,操作樹與更新樹形結構配置等
4.待實現
1.監控與報警與落盤
當某個葉子節點報錯後,可根據配置選擇是否落盤異常,並記錄當時baikal快照與執行到的節點信息,當錯誤修復/恢復後,可選擇重新執行/從錯誤節點恢復
2.同scene多handler處理優先級
當同scene多handler情況發生時根據各個handler的優先級指定執行順序,確保高優先級請求優先處理
3.節點根據複雜度調整與併發執行
調整:如A過濾比B過濾耗時多,且是A&&B的情況,則應調整爲B&&A
併發:如A&&B&&C 是不是ABC併發執行,當有一個返回false時結束執行並返回false會不會對一些特殊場景有性能提升?
4.持續性優化,等等等等,還有很多業務場景待發掘
有更好方案/簡易的小夥伴歡迎交流~~