昨天,我從朋友那里聽到了一個詞——Event Sourcing,據說是一種很有趣的架構模式,但目前在國內卻沒有一個成熟的應用。那該死的好奇心就控制了我,晚上便立刻去知乎上搜了一篇介紹Event Sourcing的文章,但掃了一眼之后,并沒有那種被深深吸引住的感覺。
我感到十分疑惑和不甘心,于是又去了B站,找了一段10分鐘的介紹視頻來看,這次算是對Event Sourcing有了一些初步的概念,但還是覺得不夠深入和令人滿意。
終于,我決定打開ChatGPT,并開始了一系列關于Event Sourcing的靈魂提問。以下是整個探究過程的記錄:
我:你知道event sourcing么?
-
ChatGPT:
是的,Event Sourcing 是一種由 Martin Fowler 和 Greg Young 等人提出的架構模式,主要用于構建事務性業務應用系統。
Event Sourcing 中,所有的操作都被視為系統中發生的事件,系統狀態的變化是通過一系列事件的順序而得到的,這些事件會被保存下來,用于重建系統狀態。通過這種方式,我們可以將狀態存儲到一個不可變的事件日志中,實現了事件的溯源,可以輕易地回溯系統的歷史狀態,支持多版本狀態的管理和并行處理多個操作等。
Event Sourcing 通過使用事件來描述系統狀態的變化,實現了對時間的敏感度,而不僅僅是基于當前狀態。這使得它能夠處理很多傳統架構難以支持的復雜應用場景,例如多版本控制、日志審計、系統歷史狀態回溯等。但是,它也對數據的處理和實現方式提出了更高的要求,需要在系統設計之初就將事件溯源機制考慮進去,需要設計并實現將事件入庫、事件存儲、事件檢索等多個方面的系統組成部分。
我:它和DDD有什么關系?
-
ChatGPT:
Event Sourcing 和領域驅動設計 (DDD) 有很強的關聯關系,兩者可以一起使用來構建高度穩健、可擴展和可維護的業務應用程序。
在 DDD 中,我們將系統看作由多個領域模型組成的,每個領域模型具有自己的生命周期和狀態轉換規則。而在 Event Sourcing 中,我們更強調系統狀態的演進過程,它會將每一個狀態改變都視為一個事件,這些事件組成了系統的事件流,根據這些事件可以逐步重建出系統當前狀態。
在使用 Event Sourcing 架構模式時,我們需要使用 DDD 的思想來對領域模型進行劃分,并利用事件流來保持模型的狀態。使用 DDD 模型可以讓我們更清晰地了解模型的狀態合理性,以及如何采取措施來防止狀態的非法轉換。
此外,DDD 和 Event Sourcing 的核心思想都是圍繞著領域模型進行的,它們通過共同關注領域知識和業務需求,可以幫助我們在開發過程中更好地把握系統概念、架構和實現。在實際開發中,DDD 和 Event Sourcing 應該結合起來使用,通過事件流和領域模型的雙重保障來實現可維護、可擴展、高性能的業務應用系統。
我:這方面,你知道有哪些成熟的應用?
-
ChatGPT:
vent Sourcing 的應用相對較新,尚未有太多的成熟應用。不過這種架構模式逐漸被越來越多的企業和組織所接受,也已經在某些領域得到了廣泛的應用。
下面列舉一些比較知名的使用 Event Sourcing 的應用:
- 車輛物聯網系統
車輛物聯網系統是一個由多臺設備組成的系統,包括車載終端、路邊設備和云服務器等。在這個系統中,使用 Event Sourcing 可以保證每個車輛的狀態變化、路況數據收集和行駛軌跡等信息都被記錄下來,對車輛監視、駕駛數據分析和行駛路線優化等有很大的幫助。
- 電子商務應用
電子商務應用中,使用 Event Sourcing 可以實現訂單管理、庫存管理、支付處理等核心業務功能。由于訂單狀態的變化非常頻繁,傳統的關系型數據庫存儲方式不太適合用來處理這種高寫入頻率的信息。使用 Event Sourcing 可以更好地處理這些信息,保證每個訂單狀態的變化都被記錄下來,從而實現更好的訂單管理和跟蹤。
- 區塊鏈應用
區塊鏈應用的核心是去中心化的分布式賬本系統,其記錄了所有交易發生的時間和內容,所有的賬戶、交易都是不可變的。Event Sourcing 提供了可溯源性和可信性,是區塊鏈應用設計中不可或缺的一環。
還有一些業界較著名的 Event Sourcing 實際應用框架和工具,如 Axon Framework、Lagom、EventStore、Apache Kafka 等。這些工具和框架都提供了一定程度上的支持來幫助我們更容易地實現 Event Sourcing 架構模式,可以更快速地開發出可靠、高效的業務應用程序。
我:是否可以說Event Sourcing在應用上就是DDD?
-
ChatGPT:
Event Sourcing 和 DDD 是兩種不同的架構設計思想,它們在應用上有很多相似之處,但并不是完全相同的。
Event Sourcing 是指將系統狀態的演進過程,劃分為一系列的事件,并將這些事件組成一個事件流來維護系統狀態。這種設計思想強調每個狀態改變都是可追溯的,可以通過查看事件流來重建系統的狀態。
而 DDD 則是一種面向業務領域的軟件設計思想,它強調通過針對業務領域的領域模型(Domain Model)來實現功能和降低耦合度。DDD 不關注具體的實現方式,而是關注如何劃分、組織和管理領域模型。
從應用上來看,Event Sourcing 和 DDD 常常一起使用,因為 Event Sourcing 維護的事件流可以作為 DDD 中領域模型的持久化存儲。通過將 DDD 中領域模型的狀態記錄到事件流中,可以幫助我們更好地處理狀態變化和重建問題。同時,DDD 在事件流的設計上也可以提供一些幫助,比如通過將事件分類、命名、組織來幫助我們更好地理解領域模型中不同狀態的變化。
因此,可以說 Event Sourcing 經常與 DDD 一起使用,但并不能簡單地將它們歸為一類。它們在軟件設計中各自發揮不同的作用,但都可以幫助我們構建高質量、可擴展、穩健的業務系統。
我:那和“事件驅動開發”的關系是什么?
-
ChatGPT:
事件驅動開發是指通過響應事件來驅動應用程序的開發模式。它與 Event Sourcing 和 DDD 有一定的關聯,但這三者并不是完全相同的概念。
事件驅動開發可以與 Event Sourcing 配合使用,以實現在應用程序中記錄和處理事件的功能。在 Event Sourcing 中,應用程序中的每個變化都可以視為一個事件,這些事件被按順序記錄到一個不可變的事件流中。相比之下,事件驅動開發中的事件則是由外部的事件源或系統組件發出的,應用程序需要根據這些事件來執行相應的操作。因此,在使用 Event Sourcing 的同時,事件驅動開發可以為應用程序提供更多的事件來源和響應機制,從而提高應用程序的可伸縮性和靈活性。
另一方面,DDD 中的領域事件也可以被視為一種事件驅動的方法,用于描述系統中的業務過程和狀態變化。在使用 Event Sourcing 時,可以利用領域事件來幫助設計事件模型和重建系統狀態。因此,DDD 和 Event Sourcing 的配合可以幫助我們更好地構建具備業務價值的應用程序。
綜上所述,雖然事件驅動開發、Event Sourcing 和 DDD 都與事件處理相關,但它們是針對不同方面的技術和概念。它們可以在一些場景下相互結合和補充,以提高應用程序的可維護性、可擴展性和可靠性。
我:我可以把Event Sourcing理解成一種log么?
-
ChatGPT:
是的,你可以把 Event Sourcing 理解為一種事件日志(event log)的實現方式之一。在 Event Sourcing 中,應用程序中的各種狀態變化和操作都被視為事件,被順序記錄到一個基于時間的不可變數據結構中(通常是一個事件流或事件存儲)。這個過程類似于一個事件日志,而事件存儲中的每個事件就相當于事件日志中的每個時間戳條目。
與傳統的日志系統不同,Event Sourcing 的事件記錄不僅記錄了應用程序狀態的變化,還可以用于重建應用程序狀態和執行業務邏輯。通過回放事件流,應用程序可以在任意時間點恢復它的狀態,甚至可以在不同的部署環境中復制應用程序狀態。因此,Event Sourcing 讓應用程序的狀態變得不可變和可重現,并且能夠提高應用程序的可伸縮性和可維護性。
當然,Event Sourcing 和傳統的日志系統也有所不同。Event Sourcing 記錄的事件應該是領域事件,和特定的應用程序業務邏輯相關。而傳統的日志系統則更多地關注系統級別的事件,比如網絡連接、錯誤日志等等。此外,Event Sourcing 記錄的事件也更加詳細和有意義,記錄了事件發生的時刻、事件來源、事件內容等方面的信息。
我:Event Sourcing模式下,會不會發生數據上的錯誤?
-
ChatGPT:
在 Event Sourcing 模式下,雖然不會出現丟失數據的情況(因為所有的狀態變化都被記錄下來了),但仍然可能發生數據上的錯誤。以下是一些可能出現的錯誤情況:
事件版本沖突:當兩個或多個并發的操作產生相同的事件,且這些事件都要對同一個聚合根進行狀態變更時,這些事件就會產生版本沖突。這種情況下,需要使用樂觀鎖等機制來解決版本沖突,否則可能會導致數據錯誤。
數據同步問題:在多個服務之間交換消息時,可能會出現數據同步問題。例如,一個服務發布了一個事件,但由于網絡延遲等原因,另一個服務沒有及時接收到該事件,而導致數據不一致。
事件溢出:如果事件數量太多,可能會導致事件存儲器空間不足。此時,需要對事件進行歸檔或刪除,否則可能會對系統性能和穩定性造成影響。
數據錯誤:在記錄事件的過程中,如果出現了錯誤或者非法操作,可能會導致事件本身的錯誤,從而影響應用程序狀態的正確性。
為了解決這些問題,需要使用合適的設計模式、技術和工具。例如,使用基于時間戳的并發控制機制,通過異步消息傳遞實現數據同步,使用高可靠的事件存儲器來防止事件丟失等。同時,也需要進行定期的事件清理和備份,以確保數據的完整性和可靠性。
我:有沒有一種可能,git的版本管理方式,就是一種Event Sourcing?
-
ChatGPT:
是的,可以將 Git 的版本管理方式視為一種基于事件溯源(Event Sourcing)的實現方式之一。
在 Git 中,每次提交操作都會被記錄為一個新的版本,在版本控制樹上形成分支和合并的歷史記錄。這些提交操作都是修改某些文件內容的事件,這些事件以時間戳的方式記錄在 Git 的對象庫中。類似于 Event Sourcing,這些事件是不可變的,可以被追溯和回溯,可以重現歷史狀態。
不同的是,Git 中的事件并沒有像 Event Sourcing 中的事件那樣完整記錄應用程序狀態的變化。而是只記錄了對特定文件或代碼庫的操作。因此 Git 可以被歸類為一種更為特化的事件存儲,特別用于版本控制。而在 Event Sourcing 中,事件通常涵蓋更多方面的領域事件,而不僅僅是針對代碼庫的版本控制。
但是,Git 的版本控制方式仍然具有許多與 Event Sourcing 相似的特點和優點,如可追溯性、可重放性、冪等性、可恢復性等。因此可以說,基于 Git 的版本管理,可以借鑒 Event Sourcing 的一些優秀設計思想和實踐。
它之前提到的應用中,包括了區塊鏈,我就順勢把區塊鏈拎出來問問:區塊鏈的技術有哪些?
-
ChatGPT:
區塊鏈技術有以下幾個主要方面:
分布式賬本技術:區塊鏈的核心技術之一,將所有參與者之間的交易信息記錄在一個共享的賬本中。這個賬本是分布式存儲的,只要存在網絡中的一個節點,就可以獲取到完整的賬本信息。其中最著名的實現方式是比特幣區塊鏈。
共識算法:由于區塊鏈的去中心化特性,在進行交易時必須要保證賬本信息的一致性。為此,區塊鏈需要一種共識算法,以確保節點之間對交易的確認達成一致。常見的共識算法有工作量證明(PoW)、權益證明(PoS)、拜占庭容錯(BFT)等。
密碼學技術:區塊鏈基于密碼學實現了去中心化的安全性,如公私鑰加密、哈希算法和數字簽名等技術,確保只有合法的使用者才能讀寫區塊鏈上的記錄,保證交易的安全性和隱私性。
智能合約:智能合約是構建在區塊鏈技術之上的一種編程模型,可以封裝和自動執行協議。智能合約能夠對交易進行自動化執行和驗證,以確保交易順利完成。以太坊是智能合約應用最廣泛的區塊鏈項目之一。
跨鏈技術:由于不同的區塊鏈之間無法直接通信,因此需要一種跨鏈技術來實現不同區塊鏈之間的交互。常見的跨鏈技術有側鏈、原子交換和跨鏈協議等。
元數據標準化:在許多區塊鏈應用中,需要對大量的數據進行存儲和交換。元數據標準化是將這些數據進行統一格式和設定的技術,確保區塊鏈上的數據格式一致,從而方便數據交換和分析。例如,Hyperledger Indy 就提供了統一的身份元數據標準。
這些技術在不同的區塊鏈項目中可能會有所不同,不同的區塊鏈應用場景需要使用不同的技術組合,以適應各自的需求。
我:這些哪個用到Event Sourcing了?
-
ChatGPT:
Event Sourcing 是一種在應用程序中記錄和存儲事件的架構模式,它允許構建一個可靠的事件日志,可以記錄系統中所有的變化。以下是一些使用 Event Sourcing 技術的區塊鏈項目:
Corda:Corda 是一個分布式賬本平臺,可以用于在機構之間傳輸價值和協議數據。Corda 使用 Event Sourcing 技術來記錄和存儲所有的狀態變化,以便在需要時進行審計和重放交易。
Hyperledger Fabric:Hyperledger Fabric 是一個企業級區塊鏈框架,它支持各種不同的共識算法和身份驗證機制。Hyperledger Fabric 使用 Event Sourcing 技術來記錄事務歷史,以便可以追溯和審計所有的交易。
Ethereum:Ethereum 是一個智能合約平臺,它允許使用 Solidity 編寫智能合約,這些智能合約可以在區塊鏈上運行。Ethereum 使用 Event Sourcing 技術來記錄所有的交易事件和狀態變化,以便可以驗證所有的交易和狀態更改。
Bitcoin:Bitcoin 是一種用于價值傳輸的加密貨幣,它使用了區塊鏈技術。Bitcoin 使用 Event Sourcing 技術來記錄所有的交易歷史,以便在需要時進行追溯和審計。
這些項目都使用了 Event Sourcing 技術來記錄和存儲事件,以便可以在需要時進行審計和追溯。
至此,我形成了對Event Sourcing的一個非常初步的印象: 跟DDD和TDD都有點像又有點不一樣,感覺更像個git,區塊鏈是它的一種應用。
在問答的過程中,我會用google之類的其他工具來交叉印證ChatGPT的回答。即使這樣做,在ChatGPT上用時不到半小時。
這是一次非常高效的探究體驗。
ps:本篇主體文字用ChatGPT潤色過。
image.png
本作品由 IvyWooo 采用知識共享署名-非商業性使用-相同方式共享 4.0 國際許可協議 進行許可,轉載請注明出處。