【发布时间】:2018-04-20 15:13:08
【问题描述】:
我正在寻找一种审计模式来保存我的实体的历史记录,我遇到了事件溯源模式。这是一种有趣的模式,其中大部分对我来说很有意义,但我有一个关于如何实现某个用例场景的问题?
用例:
- 生成了一张发票,金额为 100 美元,状态为审核中。
- 然后发票状态更新为 billed
- 然后支付 50 美元,调整为 20 美元,状态更新为已付款
- 我们后来意识到金额不正确。所以我们想回滚之前的交易并将账单状态恢复为再次账单
- 然后我们过帐 70 美元的付款和 20 美元的调整并更新发票状态以完成。
根据我对事件存储的理解。它应该只包含应用于实体的操作。因此该事件始终具有更新的交易金额(付款和调整)和状态。
数据库:
发票:
| id | balance | payment | adjustment | status |
|-------|---------|---------|------------|----------|
| 12345 | 10 | 70 | 20 | Paid |
活动商店:
| 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 |
JSON 包含有关付款、调整和状态更改的信息
这是我的问题
- 我知道余额可以如何逆转,但我不明白我们如何才能实现相同的状态效果
- 此外,如果上述事件的 api 调用(命令)出现故障,我将如何处理。 IE
- 第 3 步调用服务
- 然后步骤 5
- 然后是第 4 步。
据我了解,余额可以,但发票状态不正确。
请告诉我如何最好地处理事件源模式。
【问题讨论】:
-
“如果事件以不同的顺序出现,我将如何处理” - 它们永远不会出现乱序,而不是在同一个 AggregateStream
-
您的 EventStore 不正常。它还应该包含事件的类型。事实上,它应该允许附加任何类型的事件。
-
@ConstantinGalbenu 事件出现故障我的意思是对服务的 api 调用出现故障,即 api 要求付款,然后是另一笔付款,然后撤销第一次付款。为了清楚起见,我将添加事件列
-
“事件”是指“命令”?
-
您的 EventStore 应该有仅这些列:
event_id, invoice_id, event_type, event_payload。您删除了payment、adjustment和status列。事件属性以适合您的格式(即 json)在event_payload列中序列化。因此,当命令到达您的 Invoice 时,您加载所有事件,反序列化它们并将它们应用到 Invoice 实体。 Invoice 建立其内部状态(total_amount和status),然后处理命令。因此,状态不是保存在 EventStore 中,而是保存在内存中。
标签: java microservices event-sourcing