跳過到頁腳內容
Iron Academy Logo
學習 C#
學習 C#

其他分類

事件溯源核心概念

Derek Comartin
11m 31s

事件溯源是一種強大且複雜的模式,常用於現代軟體架構中,尤其是C#和.NET Core應用程式。 為了充分掌握如何實現事件溯源,我們將與Derek Comartin在其影片"Event Sourcing Core Concepts"中所解釋的重要原則一起進行探討,從CodeOpinion.com

如果您想更好地了解事件存儲概念、領域驅動設計或如何構建基於事件的系統,您來對地方了。 讓我們深入了解!

事件溯源簡介

在開始時(0:00),Derek討論了有關事件溯源和相關核心概念的困惑。他將事件溯源定義為不僅僅是"捕捉當前狀態",而是存儲事件——以追加模式記錄您的領域模型中發生的每一次變更。

這種方法可讓您維護系統狀態變更的完整歷史記錄。 與僅持久化最終狀態相比,您將持久化反映業務邏輯發生的事件。

事件:捕捉業務事實

在0:33,Derek解釋了事件究竟是什麼。 事件代表在系統內已經發生的事情——一個業務事實。 例如,"ProductReceived"事件將包含接收的數量和日期。

Derek強調,當您存儲事件時,它們必須使用反映過去式的命名約定命名,如"Product Shipped"或"Inventory Adjusted"。 在事件模式中,您可能有如public Guid Id、public string Name和時間戳這樣的欄位。

Understanding Csharp Event Sourcing 1 related to 事件:捕捉業務事實

每個事件也應具有唯一的標識符,這對於僅追加的存儲系統來說至關重要,您將事件追加到事件流中。

事件流:組織事件

在2:02,Derek轉而討論事件流。 他將其與關聯數據庫表進行了比較,但解釋說在事件溯源中,所有與領域對象(如庫存項目)相關的事件都屬於同一事件流。

每個事件流與特定實體關聯——通常由public Guid Id和string Name定義。 例如,SKU為ABC123的產品將有自己的事件流,包含接收或運送等持久化事件。

Derek建議,當您建模這些時,應考慮使用聚合根和領域對象的概念,借鑒領域驅動設計概念。

無論是短期還是長期,建模生命周期有助於優化流的數量和大小。 這對於改善複雜系統的性能至關重要。

投影和讀模型

在4:12,Derek介紹了投影和讀取模型。 由於您的事件溯源系統捕捉的是事件而非當前狀態,您必須重播事件以回答例如"當前庫存數量是多少?"這樣的問題。

要構建讀取模型,您需要處理來自事件流的事件。 例如,使用private void Apply(Event e)或類似方法,根據每個事件類型的事件處理器增量或減少庫存。

Derek展示了如何在文件數據庫或關聯數據庫中構建讀取模型——可能一個投影僅顯示手上庫存量,另一個則顯示發貨歷史。

這反映了命令查詢職責分離(CQRS):將寫入操作(命令)與讀取操作(查詢)分開。

寫入模型的投影

在6:48,Derek展示了如何在寫入端應用投影。 這對於在允許發生之前驗證操作至關重要。

在命令處理器中,發貨產品之前,您需要驗證是否有足夠的數量。 Derek使用private void Apply(List events)這樣的方法來重建必要的狀態。

如public int Version等字段有助於跟踪流的演變,確保最終一致性。

Understanding Csharp Event Sourcing 2 related to 寫入模型的投影

這一實用實現有助於在處理新事件時強化業務邏輯,確保您的系統僅在有效的狀態轉換上運行。

訂閱:對新事件做出反應

在8:01,Derek談到了訂閱。 訂閱允許事件消費者監聽新事件並做出反應。

例如,投影儀可能會訂閱事件流,並在看到"Product Shipped"事件時更新讀取模型。 或者,發布者可能會監聽事件,然後將它們發布到RabbitMQ或Kafka等外部系統中,與其他服務整合。

Understanding Csharp Event Sourcing 3 related to 訂閱:對新事件做出反應

Derek描述了訂閱不僅適用於更新內部模型,還用於在獨立的事件系統間分配數據,保持最終一致性。

這顯示了事件驅動架構的另一個主要優點:您的服務保持最終一致性,但可獨立擴展。

核心概念回顧

在9:21,Derek總結了核心概念:

  • 事件捕捉事實。

  • 事件流按實體組織事件。

  • 投影將流轉化為可查詢的讀取模型或可執行的寫入模型。

  • 訂閱允許服務做出反應並相應更新。

他強調您將事件持久化在僅追加的日誌中,維護審計追蹤,並在必要時重播事件。

快照和優化

在9:39,Derek討論了快照。 儘管經常與事件溯源一起探討,他澄清說快照只是性能優化而非核心要求。

快照通過定期保存部分狀態來減少重播所有事件的開銷,但完整歷史仍然存在於僅追加的日誌中。

關鍵區別:事件溯源與事件驅動架構

在10:00,Derek警告一個常見的誤解:事件溯源和事件驅動架構是不同的! 像Kafka這樣的工具有助於數據分配,但真正的事件溯源重點在於將領域事件記錄為不可變的審計追蹤。

理解這個區別在您將事件溯源整合到復雜系統中時至關重要。

結論

跟隨Derek Comartin的影片,很明顯事件溯源在於將每個變更作為事件記錄,而不僅僅是最終狀態。 通過在僅追加的存儲系統中存儲事件,您構建了一個豐富的事件模式,提供了審計追蹤、事件查詢的靈活性,以及對命令查詢責任分離的強大支持。

無論您是在.NET Core中使用C#事件溯源還是其他平台,Derek系統地解釋了核心概念、事件處理器、私人集、受保護集以及如何在模型中應用例如private void Apply()的事件,非常有價值。

如果您正在建立一個強大的領域模型,改進您的存儲系統,或者創建包含許多優勢如最終一致性的複雜模式,學習Derek的方法是必須的。請查看他的YouTube頻道,以獲取更多有見地的影片。

Hero Worlddot related to 事件溯源核心概念
Hero Affiliate related to 事件溯源核心概念

通過分享您所愛的東西賺得更多

您是否在為使用.NET、C#、Java、Python或Node.js的開發者創建內容?將您的專業知識轉化為額外收入!

鋼鐵支援團隊

我們每週 5 天,每天 24 小時在線上。
聊天
電子郵件
打電話給我