IRONSOFTWAREHOME

事件源核心概念

Event Sourcing Core Concepts

Derek Comartin

11m 31s

事件溯源是一個強大但複雜的模式,常用於現代軟體架構中,特別是使用C#和.NET Core應用程式。 為了完全掌握如何實施事件溯源,我們將通過Derek Comartin在他的影片中解釋的關鍵原則進行講解,影片來自CodeOpinion.com,名為*"事件溯源核心概念"*。

如果您想更好理解事件儲存概念、領域驅動設計或如何構建事件溯源系統,那麼您來對地方了。 讓我們開始吧!

事件溯源介紹

在開始時(0:00),Derek討論了關於事件溯源及其相關核心概念的混淆。他將事件溯源定義為不僅是"捕捉當前狀態",而是儲存事件——記錄您的領域模型中發生的每個變更於僅追加日誌中。

這樣,您就能維持您的系統狀態變更的完整歷史。 與其僅持久化最終狀態,您應持久化反映業務邏輯的事件。

事件:捕捉業務事實

在0:33時,Derek解釋了事件的本質。 一個事件代表了系統內已經發生的事情——一個業務事實。 例如,"產品接收"事件將包含接收的數量和日期。

Derek強調,當您儲存事件時,它們必須使用反映過去時態的命名規則命名,例如"產品已運送"或"庫存已調整"。 在事件模式中,您可能會有諸如public Guid Id、public string Name和時間戳之類的欄位。

每個事件也應有一個唯一的識別碼,這對於僅追加儲存系統很重要,在這裡您是將事件追加到事件流中的。

事件流:組織事件

在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<Event> events)這樣的方法來重建必要的狀態。

像public int Version這樣的欄位有助於跟蹤流水的發展,確保最終一致性。

這種實際實施有助於在處理新事件時執行業務邏輯,確保您的系統僅在有效狀態轉換時進行操作。

訂閱:對新事件的反應

在8:01時,Derek討論了訂閱。 訂閱允許事件消費者監聽新事件並作出響應。

例如,一個投影器可能會訂閱一個事件流,並在看到"產品已運送"事件時更新讀模型。 或者,一個發布者可能會監聽事件並將它們發布到外部系統如RabbitMQ或Kafka,與其他服務進行整合。

Derek描述了訂閱不僅用於更新內部模型,還用於在獨立事件系統中進行資料分發,保持最終一致性。

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

核心概念回顧

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

  • 事件捕捉事實。

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

  • 投影將流轉換為可查詢的讀模型或可操作的寫模型。

  • 訂閱允許服務作出響應並相應更新。

他強調您在僅追加日誌中持久化事件,保持審計跟踪,並在必要時重播事件。

快照和優化

在9:39時,Derek談到了快照。 雖然經常與事件溯源一起討論,但他澄清快照是一種性能優化,而不是核心要求。

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

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

在10:00時,Derek警告一個常見的誤解:事件溯源和事件驅動架構是不同的! 像Kafka這樣的工具幫助資料分發,但真正的事件溯源專注於作為不可變審計跟踪記錄領域事件。

瞭解這一區別在將事件溯源整合到您的複雜系統中時至關重要。

結論

透過觀看 Derek Comartin 的影片,很清楚事件溯源是關於記錄每次變更作為事件,而不僅僅是最終狀態。 通過在僅追加儲存系統中儲存事件,您構建了一個豐富的事件模式,提供審計跟踪、彈性的事件查詢以及強大的命令查詢責任分離支援。

無論您是在.NET Core中處理C#事件溯源或其他任何平台,Derek關於核心概念、事件處理器、私有集、保護集及在模型中應用像private void Apply()的結構化解釋極具價值。

如果您正在致力於構建一個有彈性的領域模型、改進您的儲存系統,或者建立具有如最終一致性等多種優勢的複雜模式,研究Derek的方法是必須的。一定要看看他YouTube頻道上的更多有見地的影片。

Earn More by Sharing What You Love

Do you create content for developers working with .NET, C#, Java, Python, or Node.js? Turn your expertise into extra income!

Let's Stay in Touch!

Join our newsletter, you’ll get exclusive access on article updates. We value your privacy

Key in blue circle

立即免費取得 30 天試用金鑰

Your trial license will be sent to your email address

無任何限制。100% 解鎖。無需信用卡。

OR
bullet_checked無需信用卡或建立帳號無任何限制。100% 解鎖。無需信用卡。
  • Logo Aetna
  • Logo NASA
  • Logo GE
  • Logo Porsche
  • Logo USDA
  • Logo Qatar
Join Millions of Engineers who’ve tried Iron Suite
獲取您的無義務諮詢
填寫以下表格或發送電子郵件至sales@ironsoftware.com
您的詳細資訊將始終保密。
被全球數百萬工程師信任
Iron Software的客戶標誌
立即獲取您的30天試用金鑰
無需信用卡或帳戶建立