消息驅(qū)動
- 事件不要求持久化保存
- 消息只是為了更新業(yè)務(wù)數(shù)據(jù)的狀態(tài),數(shù)據(jù)庫才是一等數(shù)據(jù)
- 不要求所有的數(shù)據(jù)操作都通過消息驅(qū)動
事件溯源
- 事件作為一等數(shù)據(jù)保存
- 統(tǒng)一的事件管理器和接口,數(shù)據(jù)更新都由事件產(chǎn)生
- 數(shù)據(jù)庫中數(shù)據(jù)的當(dāng)前狀態(tài)根據(jù)事件的聚合產(chǎn)生
- 聚合數(shù)據(jù)可以保存在數(shù)據(jù)庫中,可以根據(jù)事件重新生成
事件溯源的優(yōu)點
- 歷史重現(xiàn):從事件中重新生成視圖數(shù)據(jù)庫
- 方便的數(shù)據(jù)流處理于報告生成
- 性能
- 服務(wù)的松耦合
事件溯源的缺點
- 只能保證事務(wù)的最終一致性
- 設(shè)計和開發(fā)思維的轉(zhuǎn)變,學(xué)習(xí)成本
- 事件結(jié)果的改變
- 擴展性:Event Store的分布式實現(xiàn),事件的分布式處理
消息驅(qū)動 vs事件溯源
- 一等數(shù)據(jù):事件vs業(yè)務(wù)數(shù)據(jù)
- 事件永久保存、歷史重現(xiàn)
- 所有數(shù)據(jù)更新都必須通過事件來產(chǎn)生
- Event Store服務(wù)承擔(dān)更多的功能
事件溯源的數(shù)據(jù)一致性
- 一個事件只處理一個服務(wù)的數(shù)據(jù)
- 保證事件的至少一次處理、冪等性
- 業(yè)務(wù)請求的錯誤處理:多次重試失敗、網(wǎng)絡(luò)異常、服務(wù)不可用
事件溯源和CQRS
- CQRS:命令查詢職責(zé)分離
- C端執(zhí)行命令,Q端執(zhí)行查詢
事件溯源與Axon框架
Axon框架介紹
- 實現(xiàn)Event Sourcing和CQRS模式的框架
- 實現(xiàn)了命令、事件的分發(fā)、處理、聚合、查詢、存儲
- 提供標簽式開發(fā),易維護,并提供了Spring boot的集成
- 提供Command和Event
- 可擴展,可用于分布式環(huán)境,如Spring Cloud
Axon框架的構(gòu)成
- 聚合:Aggregate
- 聚合的資源庫:Repository
- Command:Command Bus 和 Command handler
- Event :Event Bus 、Event Handler 和Event Store
- Sage: 基于事件的流程管理模式
- Query: 執(zhí)行數(shù)據(jù)查詢操作的特殊Command
Axon框架的構(gòu)成- 可擴展性
- 分布式Command分發(fā)
- 通過AMQP實現(xiàn)分布式Event分發(fā)和處理

事件溯源與Axon框架圖.png