2017-05-24 17 views
-1

在微服务中,当多个微服务受到影响时,如何确保所有服务都得到更新?

在线结算:

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

  1. 订单通过OrderMicroservice创建
  2. 一)令与“完成”状态通过OrderMicroservice

    二)更新付款是通过信用卡处理,并通过PaymentMicroservice

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

对于s由于发票微服务失败,数据库存储已满或电子邮件未能发送,或付款失败,但订单已被标记为“完成”,我们是否需要回滚数据库?或者我们在这里做什么来确保整个工作流程都已正确执行?

回答

1

看起来您需要更改订单的状态流程。请参阅,不仅发票微服务可能失败 - 任何步骤可能(付款可能会被拒绝为例)。相反,接下来的流程:

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 

结果,你将有不同的状态订单和将能够在失败的情况不同处理它们。


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

+0

这看起来像ESB和佐贺的事情发生。理想情况下,OrderItem命令启动Ordering Saga,然后等待来自其他服务的事件,然后在所有其他相关服务完成后更新Order Status。 – Fran