oskardudycz/EventSourcing.JVM:JVM语言中事件溯源的示例和教程


事件溯源是一种设计模式,其中业务操作的结果存储为一系列事件。
这是持久化数据的另一种方式。与仅保留最新版本的实体状态的面向状态的持久性相比,事件溯源将每个状态更改存储为单独的事件。
谢谢你,没有业务数据丢失。每个操作都会产生存储在数据库中的事件。这可以实现扩展的审计和诊断功能(技术和业务方面)。此外,由于事件包含业务上下文,它允许进行广泛的业务分析和报告。
在这个存储库中(点击标题),我展示了围绕事件溯源的不同方面和模式。从基础到高级实践。

事件(活动)
代表过去的事实。它们携带有关已完成某事的信息。

  • 是不可变的:“已经看到的,不可能是看不见的”。
  • 可以忽略但不能收回(因为你不能改变过去)。
  • 可以有不同的解释。篮球比赛的结果是事实。获胜的球队球迷会积极解读。

事件表现:消息
它们可以用例如JSON、二进制、XML 格式来表示。除了数据,它们通常包含:

  • id:唯一的事件标识符。
  • type:事件的名称,例如“发票开具”。
  • 流 id:为其注册事件的对象 id(例如发票 id)。
  • 流位置(也称为版本、发生顺序等):用于决定特定对象(流)的事件发生顺序的数字。
  • 时间戳:表示事件发生的时间。
  • 其他元数据,如correlation id,causation id等。

从事件中检索当前状态
要获取实体的当前状态,我们需要执行流聚合过程。我们正在将一组事件转换为一个实体。这可以通过以下步骤完成:
  1. 读取特定流的所有事件。
  2. 按出现顺序(按事件的流位置)升序排列它们。
  3. 构造实体类型的空对象(例如使用默认构造函数)。
  4. 将每个事件应用于实体。

此过程也称为流聚合或状态再水化。

活动存储
事件溯源与任何类型的存储实现无关。只要它满足假设,就可以使用任何支持数据库(关系、文档等)来实现。状态必须由仅附加的事件日志表示。事件按时间顺序存储,新事件附加到前一个事件。事件存储是专门为此目的设计的数据库类别。
在进一步的示例中,我将使用EventStoreDB。它是由 Event Sourcing 当局创建和维护的久经考验的 OSS 数据库。它通过 gRPC 客户端支持许多开发环境,包括 JVM。

详细点击标题