oskardudycz/EventSourcing.JVM:JVM語言中事件溯源的示例和教程
事件溯源是一種設計模式,其中業務操作的結果儲存為一系列事件。
這是持久化資料的另一種方式。與僅保留最新版本的實體狀態的面向狀態的永續性相比,事件溯源將每個狀態更改儲存為單獨的事件。
謝謝你,沒有業務資料丟失。每個操作都會產生儲存在資料庫中的事件。這可以實現擴充套件的審計和診斷功能(技術和業務方面)。此外,由於事件包含業務上下文,它允許進行廣泛的業務分析和報告。
在這個儲存庫中(點選標題),我展示了圍繞事件溯源的不同方面和模式。從基礎到高階實踐。
事件(活動):
代表過去的事實。它們攜帶有關已完成某事的資訊。
- 是不可變的:“已經看到的,不可能是看不見的”。
- 可以忽略但不能收回(因為你不能改變過去)。
- 可以有不同的解釋。籃球比賽的結果是事實。獲勝的球隊球迷會積極解讀。
事件表現:訊息
它們可以用例如JSON、二進位制、XML 格式來表示。除了資料,它們通常包含:
- id:唯一的事件識別符號。
- type:事件的名稱,例如“發票開具”。
- 流 id:為其註冊事件的物件 id(例如發票 id)。
- 流位置(也稱為版本、發生順序等):用於決定特定物件(流)的事件發生順序的數字。
- 時間戳:表示事件發生的時間。
- 其他後設資料,如correlation id,causation id等。
從事件中檢索當前狀態
要獲取實體的當前狀態,我們需要執行流聚合過程。我們正在將一組事件轉換為一個實體。這可以透過以下步驟完成:
- 讀取特定流的所有事件。
- 按出現順序(按事件的流位置)升序排列它們。
- 構造實體型別的空物件(例如使用預設建構函式)。
- 將每個事件應用於實體。
此過程也稱為流聚合或狀態再水化。
活動儲存
事件溯源與任何型別的儲存實現無關。只要它滿足假設,就可以使用任何支援資料庫(關係、文件等)來實現。狀態必須由僅附加的事件日誌表示。事件按時間順序儲存,新事件附加到前一個事件。事件儲存是專門為此目的設計的資料庫類別。
在進一步的示例中,我將使用EventStoreDB。它是由 Event Sourcing 當局建立和維護的久經考驗的 OSS 資料庫。它透過 gRPC 客戶端支援許多開發環境,包括 JVM。
詳細點選標題
相關文章
- Occcurrent:JVM事件溯源工具庫包JVM事件
- C語言中的#和##C語言
- 事件協作和事件溯源事件
- 事件流與事件溯源事件
- PHP 事件溯源PHP事件
- Spring Boot和EventStoreDB事件溯源案例Spring Boot事件
- C語言中的*和&符號C語言符號
- JVM 調優示例和配置JVM
- Rust中的事件溯源 - ariseyhunRust事件
- 剖玄析微聚合 - 事件溯源事件
- c語言中的getchar()和EOFC語言
- C語言中 * 和 &的實際理解C語言
- Chronicle事件溯源的最佳實踐事件
- 如何遷移到微服務和事件溯源EventSourcing微服務事件
- 事件溯源全指南 - Arkwrite事件
- 事件溯源不是什麼?事件
- C語言中,&和&&都是做什麼的?C語言
- 事件消費者之 Projector - 事件溯源事件Project
- 事件消費者之 Reactor - 事件溯源事件React
- Python學習教程_Python語言中=和==有什麼區別?Python
- 事件溯源中的時間和時間建模 - Tomasz Jaskula事件
- Python的事件溯源開源庫Python事件
- .NET的事件溯源構建庫:Eventuous事件
- C語言中const和#define的區別C語言
- C語言中的getchar和putchar詳解C語言
- C語言中的Const常量和優化C語言優化
- C語言中的置0和置1操作C語言
- 事件消費者之 Saga - 事件溯源事件
- 使用Kafka實現事件溯源Kafka事件
- 事件溯源模式:分離事件的發生和捕獲兩種不同時間 - verraes事件模式
- C語言中“陣列名”和“&陣列名”C語言陣列
- C語言中編譯和連結C語言編譯
- Go 語言中的方法Go
- Go語言中的InterfaceGo
- 最全面的CQRS和事件溯源介紹 - Software House ASC事件
- c語言中的&的用法C語言
- 事件溯源與流水賬的結賬模式事件模式
- Go語言中的互斥鎖和讀寫鎖(Mutex和RWMutex)GoMutex