一、Event(事件)
Event是Actor產生的記錄狀態變化的日志,由StateId(狀態Id),UID(冪等性控制),TypeCode(事件類型),Data(事件數據),Version(事件版本),Timestamp(時間戳)組成。
持久化:Ray提供Mongodb、Postgresql、Sqlserver、Mysql的拓展支持,可以單獨使用其中一個,也可以混合使用。
EventBus:當Event持久化之后進行分發以驅動后續業務流程、同步到讀庫以及自定義消費者,目前支持RabbitMQ和Kafka的拓展。
訂閱:基於Ray提供的ObserverGrain、ShadowGrain的訂閱者不依賴於EventBus的可靠性和有序性,框架會對Event的順序進行校驗,對丟失的Event進行恢復,自定義訂閱者只能用來執行對Event可靠性要求不高的任務。
ObserverGrain:訂閱Event執行后續流程和同步到讀庫。
ShadowGrain:訂閱Event執行后續流程,但流程需要用到實時狀態。
二、State(狀態)
State是一個聚合對象(等價DDD概念中的聚合根),業務的最新數據,駐留於Actor中,框架會定期保持快照。
生命周期:State的生命周期等同於Actor的生命周期,可以通過配置進行控制。
持久化:State的持久化不是實時的,通過VersionInterval(間隔版本)、MinVersionInterval(最小間隔版本,失活時持久化條件)來對每種Actor進行控制。持久化過程可以通過重寫OnStartSaveSnapshot方法來進行自定義處理(例如無法序列化數據的自定義存儲)。
恢復:使用Snapshot(快照)+后續的Event進行恢復,恢復過程可以通過重寫ReadSnapshotAsync方法來進行自定義控制(例如無法序列化數據的自定義恢復)。
訪問:State保存於Actor中,Actor內部可以直接訪問,外部需要通過API進行訪問。
集群:集群依賴於Orleans的集群管理,State分布於集群中的某一個節點,只會存在一份,系統會根據節點負載情況進行自動調度。
三、Grain(Actor)
Grain是State的載體,提供外部訪問State的API和控制Event產生。Grain也可以在內部訪問訪問其它Grain.
RayGrain:最基本的Grain,每次只能提交一個Event,支持開啟並發讀,但不支持開啟並發寫。
TxGrain:提供基本事務功能的Grain,可以在方法內部同時提交多個Event,支持開啟並發讀,但不支持開啟並發寫。
ConcurrentTxGrain:繼承自TxGrain,但提供額外的方法以支持並發寫,提高單個Grain的吞吐。
DTxGrain:繼承自ConcurrentTxGrain,但提供分布式事務支持,可以以事務方式對多個Grain提交事件。
ObserverGrain:事件訂閱Grain,訂閱上面幾個Grain的Event執行后續流程和同步到讀庫。
ShadowGrain:事件訂閱Grain,訂閱上面幾個Grain的Event執行需要依賴事件生產者實時狀態的業務流程。
DTxObserverGrain:功能同ObserverGrain,生產者為DTxGrain的時候需要使用該Grain.
DTxShadowGrain:功能同ShadowGrain,生產者為ShadowGrain的時候需要使用該Grain.
四、歸檔
由於EventSourcing會產生大量的事件日志,會占用大量的存儲空間,但手動清理會導致狀態異常和冪等性丟失,所以由框架對事件進行歸檔以減少事件庫的事件量同時保證可靠性。
歸檔條件:歸檔的條件可以通過ArchiveOptions對每種Actor進行配置。
歸檔方式:歸檔方式有清理和轉移兩種方式。
清理:直接刪除需要歸檔的事件。
轉移:把需要歸檔的事件從時間表轉移到歸檔表,由管理員后續處理。