java - SNAPSHOT + 事件溯源
问题描述
细节决定成败。我正在研究在现有的餐饮应用程序上实施事件溯源。我有一张发票,可以与公司、公司部门或公司员工相关联。
设置
用例:
- 该公司正在赞助一项活动并已支付食物费用。
- 有客户进来参观公司部门,他们已经订购了食物。
- 有自助餐厅,员工点菜。公司向我们付款,但仍需要向员工收费。
领域模型
Invoice
-> invoice Id
-> Status
-> CompanyId
-> DeptId
-> EmployeeId
-> Balance
- 仅填充 companyId(账单公司)
- companyId + deptId(账单部门)
- companyUd + deptId + employeeId(账单人)
关系表
| 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 对吗?如果我错了,请纠正我
解决方案
我想看看事件存储是否有一种方法来处理不需要查询关系表来检索发票/发票然后对其应用事件的情况。
事件存储不应查询除自己的表之外的任何其他表。而且,事件存储不应该负责加载聚合并将事件应用到它(重新水合聚合)。这将是使用事件存储的存储库的责任。
Event store 处于较低级别,它应该有这两个方法:
interface EventStore
{
EventStream loadEvents(aggregateId);
void appendEvents(aggregateId, previousEventStream, eventsToBeAppended);
}
它可能有其他方法,但与上面的抽象级别相同。
另一方面,事件溯源感知 Invoice 存储库将具有以下接口:
interface InvoiceRepository {
Invoice loadInvoice(invoiceId);
void persistInvoice(invoiceId, invoiceNewEvents);
}
这是这样一个(虽然是通用的)存储库的示例。
推荐阅读
- ios - 如何/从哪里填充 AVAsset 的属性“preferredVolume”的值?
- excel - 将数据附加到现有工作表的最佳方式
- postgresql - 使用 jsonb 对象将 varchar 数组转换为数组
- winforms - 如何使用 Winforms 对 SourceCache 进行排序、绑定到 BindingList 以及手动处理 IChangeSet?
- swift - 如何在 Swift 中杀死并重启 UnityGLView
- javascript - 无法在代码中使用从 js 文件导入的 var
- python - 如何检查一个数字是否只出现在一个列中?
- java - Vaadin Grid Table:如何为空单元格绘制边框?
- excel - 从多个日历中删除会议
- python - 在 Windows 上运行 docker-py 时出现客户端错误