首页 > 解决方案 > SNAPSHOT + 事件溯源

问题描述

细节决定成败。我正在研究在现有的餐饮应用程序上实施事件溯源。我有一张发票,可以与公司、公司部门或公司员工相关联。

设置

用例:

领域模型

Invoice
  -> invoice Id
  -> Status
  -> CompanyId 
  -> DeptId  
  -> EmployeeId 
  -> Balance

关系表

| p_key | invoice_id | Reltn_Table | Reltn_id |
|-------|------------|-------------|----------|
| 1     | 12345      | Company     | 245242   |
| 2     | 67890      | Company     | 1241243  |
| 3     | 79166      | Dept        | 534214   |
| 4     | 792131     | Dept        | 412213   |
| 5     | 489965     | Employee    | 412323   |

假设 dept 和 employee 表与 company 表有某种关联。

我有另一个以域模型为INVOICE的事件源表。

事件存储表。

| event_id | invoice_id | Event            | Payload |
|----------|------------|------------------|---------|
| 1        | 12345      | Invoice_InReview | JSON    |
| 2        | 12345      | Invoice_Billed   | JSON    |
| 3        | 12345      | Invoice_Paid     | JSON    |
| 4        | 12345      | Invoice_Reversed | JSON    |
| 5        | 12345      | Invoice_Paid     | JSON    |

其余服务有时会传入员工、部门或员工 ID 以将更新应用于发票。

问题

我想看看事件存储是否有一种方法来处理不需要查询关系表来检索发票/发票然后对其应用事件的情况。

我最初倾向于拥有域模型的快照,但问题仍然存在,因为 dept 或 companyId 在 JSON 中,我无法基于此运行检索事件。

无论我以何种方式看到,我都会在申请事件或做任何事情之前打电话检索发票/发票。有什么我想念的东西可以帮助我摆脱关系表,或者这是傻瓜的梦想?

也是一个侧面问题

SNAPSHOTS 保存在与事件存储相同的表中,对吗?事件类型是 SNAPSHOT 对吗?如果我错了,请纠正我

标签: javamicroservicessnapshotevent-sourcing

解决方案


我想看看事件存储是否有一种方法来处理不需要查询关系表来检索发票/发票然后对其应用事件的情况。

事件存储不应查询除自己的表之外的任何其他表。而且,事件存储不应该负责加载聚合并将事件应用到它(重新水合聚合)。这将是使用事件存储的存储库的责任。

Event store 处于较低级别,它应该有这两个方法:

interface EventStore
{
    EventStream loadEvents(aggregateId);
    void appendEvents(aggregateId, previousEventStream, eventsToBeAppended);
}

可能有其他方法,但与上面的抽象级别相同。

另一方面,事件溯源感知 Invoice 存储库将具有以下接口:

interface InvoiceRepository {
   Invoice loadInvoice(invoiceId);
   void persistInvoice(invoiceId, invoiceNewEvents);
}

是这样一个(虽然是通用的)存储库的示例。


推荐阅读