事件采购中的乐观锁定机制" UNDO"流

时间:2018-04-25 15:16:41

标签: java domain-driven-design microservices event-sourcing optimistic-locking

我一直在询问有关事件采购的很多问题,所以对此表示歉意,但我想从一开始就指出这一点。

SETUP

| p_key | invoice_id | EmployeeId | Event type        | Version | Data |
|-------|------------|------------|-------------------|---------|------|
| 1     | 12345      | E456       | Invoice_Generated | 1       | JSON |
| 2     | 12345      | E567       | Invoice_Reviewed  | 2       | JSON |
| 3     | 12345      | E456       | Invoice_Paid      | 3       | JSON |
| 4     | 12345      | E142       | Invoice_Comment   | 4       | JSON |
| 5     | 12345      | E412       | Invoice_Comment   | 5       | JSON |
| 6     | 12346      | E999       | Invoice_Paid      | 7       | JSON |
| 7     | 12345      | E456       | Invoice_Refunded  | 8       | JSON |

我假设invoiceId是聚合。由于每次对发票所做的更改都会增加版本号。

使用案例

事件存储包含发票上应用的所有事件,还包含有关员工应用它的信息。在当前方案中,生成,审核和支付发票。有人注意到一些问题发表了一些评论,然后我们决定在我们退还旧的付款之前发布新的付款[正在撤消的事件在历史早期]。

API CALL:

退款/发票/ {invoiceid} / {雇员}

事情的流程

选项1

  • 检索给定发票的所有事件
  • 保存事件流中的所有事件并保存最新版本。
  • 遍历所有事件以查找所需的事件实例。
  • 申请" UNDO"对该事件采取行动并给予其版本号(最新+ 1)
  • 调用数据库以检查事件存储中的最新版本。验证它与事件流中保存的内容相同。
  • 确保新事件大于流中的上一版本。我们假设它也是一个更高的版本" DO ACTION"。

问题

  • 每次检索并保存应用程序中的所有事件都会变得昂贵。
  • 似乎只是为了" UNDO"动作。

选项2:

  • 我对数据库进行2次调用
    1. 根据发票ID和employeeId
    2. 致电获取活动
    3. 致电以获取发票上应用的最新版本的最新版本。
  • 根据事件中的数据撤消更改
  • 创建" UNDO"版本号1大于最新版本的事件。
  • 再次调用数据库以再次获取最新版本。
  • 确保" UNDO"版本比最新版本
  • 正好1

问题

不确定这是否正确。我们是否应该多次将事物添加到事件流中。

也可以只使用发票ID和发票ID和员工ID一次查询事件数据库两次

如果我遗失了某些内容,或者我的版本样式错误或者我的汇总假设是错误的,请告诉我。

1 个答案:

答案 0 :(得分:1)

我建议你在脑海中清楚几点。

无论您对域模型做出哪些更改,您可能都希望使用相同的管道;无论是处理新命令还是撤消先前的命令,都应该以相同的方式对待实际的机制。

如果"撤消"是你需要的东西,那么你的领域模型应该知道如何做,你保留在内存中的数据的形状应该支持这些功能。因此,如果您正在设计一个发票模型,允许您查询其历史记录中的特定事件,那么您的内存表示应该可以让您访问这些事件。

性能优化的第一条规则是“不要”,但如果您担心从数据库中读取数据的成本,则可以缓存模型的热表示。

如果你想在关系数据库中找出乐观的写法,Jonathan Oliver是一个很好的起点。