【问题标题】:In microservice, how do you make sure that all services get updated when more than one micro service is affected?在微服务中,当多个微服务受到影响时,如何确保所有服务都得到更新?
【发布时间】:2017-10-24 23:24:36
【问题描述】:

例子

在线结账:

用户将商品添加到购物车,点击结帐并通过信用卡支付订单。

  1. 订单是通过 OrderMicroservice 创建的
  2. a) 订单通过 OrderMicroservice 更新为“完成”状态

    b) 付款通过信用卡处理并通过 PaymentMicroservice 记录

    c) 通过 InvoiceMicroservice 创建发票并通过电子邮件发送给用户

由于某种原因发票微服务失败,数据库存储已满或电子邮件发送失败,或者支付失败但订单已经标记为“完成”,我们需要回滚数据库吗?或者我们在这里做些什么来确保整个工作流程得到正确执行?

【问题讨论】:

    标签: c# docker architecture microservices software-design


    【解决方案1】:

    您似乎需要更改订单的状态流。看,不仅 Invoice 微服务可能会失败 - 任何步骤都可能失败(例如,付款可能会被拒绝)。而不是下一个流程:

    create order --> mark as completed --> do payment --> create invoice 
    

    考虑这样的事情

    create order -->  mark as "waiting for payment" --> do payment -->
    --> mark as "ready for invoice" --> create invoice --> mark as completed
    

    因此,您将拥有不同状态的订单,并且在失败的情况下将能够以不同的方式处理它们。


    此外,您需要考虑如果每个步骤失败,是否可以稍后重试。作为一个粗略的例子,您可能有一些预定的工作,它为所有状态为“准备发票”的订单生成发票邮件。因此,如果作业订单失败,它将在下一轮重新尝试再次生成邮件。

    【讨论】:

    • 这看起来像是 ESB 和 Saga 要做的事情。理想情况下,OrderItem 命令会启动一个 Ordering Saga,然后等待来自其他服务的事件,然后在所有其他相关服务完成后更新订单状态。
    猜你喜欢
    • 1970-01-01
    • 2014-01-08
    • 2020-12-19
    • 2017-07-23
    • 2017-08-31
    • 2020-06-16
    • 2018-02-20
    • 2018-06-09
    • 2020-10-14
    相关资源
    最近更新 更多