代码之家  ›  专栏  ›  技术社区  ›  Praveen

以均衡寻源模式处理状态更新

  •  2
  • Praveen  · 技术社区  · 6 年前

    我正在研究一种审计模式来保存实体的历史记录,我遇到了事件源模式。这是一个有趣的模式,其中大部分对我来说是有意义的,但我有一个问题,关于如何实现特定的用例场景?

    用例:

    1. 生成的发票金额为100美元,状态为“正在审阅”。
    2. 然后,发票状态更新为“已开票”
    3. 然后支付50美元,调整20美元,状态更新为已支付
    4. 后来我们意识到金额不正确。因此,我们希望回滚以前的事务,并将账单状态恢复为“再次计费”
    5. 然后,我们支付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包含有关付款、调整和状态更改的信息

    下面是我的问题

    1. 我知道平衡是如何逆转的,但我不知道我们如何才能对地位实现同样的效果
    2. 此外,如果上述事件的api调用(命令)出现错误,我将如何处理。i、 e类
      • 步骤3呼叫服务
      • 然后是步骤5
      • 然后执行步骤4。

    据我所知,余额将正常,但发票状态将不正确。

    请告诉我如何最好地处理这种活动外包模式。

    1 回复  |  直到 6 年前
        1
  •  1
  •   VoiceOfUnreason    6 年前

    我知道平衡是如何逆转的,但我不知道我们如何才能对地位实现同样的效果

    因此,首先要做的是与您的领域专家核实,以了解这种无处不在的语言是否具有发票状态在冲销和还款之间的概念。

    根据我在这里看到的情况,我希望逆转本身会再次将状态置于账单上。我们认为它已支付,但该条目是一个错误,因此我们会将对象恢复到其以前的状态。

    如果这是正确的,那么我们的状态为 Billed 那里

    但它可能不是--这不是撤销,而是您域内的行为。这可能会将域移动到状态机以前未发现的部分。

    如果上述事件的api调用(命令)出现错误,我将如何处理。

    这里可能隐藏着两个不同的问题——我将对每个问题进行总结。

    如果您担心下游消费者对 事件 ,设计您的消费者时,如果他们需要了解整个历史,那么他们就要从历史中阅读,这一点很重要。对历史记录中的更改作出反应的使用者将从事件存储中读取有序的历史记录,而不是对消息传输中出现的消息作出反应。换句话说,发布的事件就像通知一样,告诉消费者刷新其历史记录副本。

    如果你担心如果命令出现错误,你会得到“错误”的历史记录,那么你需要回顾和整合Udi Dahan的文章 Race Conditions Don't Exist

    时间上的微秒差异不应该对核心业务行为产生影响。