微服务设计模式 - Saga


问题陈述

微服务架构将应用程序构建为一组松散耦合的微服务,每个服务都可以以敏捷的方式独立开发,以实现持续交付/部署,如果我们使用每个服务一个数据库设计模式,那么如何实现跨多个服务的事务。

解决方案

我们可以使用Saga模式。saga 是一系列本地事务。在此模式中,每个事务都会更新数据库并触发事件或为 saga 中的下一个事务发布消息。如果任何本地事务失败,saga 将触发一系列事务来撤消本地事务迄今为止所做的更改。

考虑订单服务和客户服务的示例。订单服务可以下订单,然后询问客服是否超出信用额度。如果信用被交叉,客服会向订单服务发起事件,取消订单,否则下单成功。

传奇模式

为了实现这种模式,我们经常需要基于 Choreography 的 saga 或基于 Orchestrator 的 saga。

在基于编排的传奇中,服务在本地事务期间处理域事件,并完成事务或撤消相同的事务,而在基于编排器的传奇中,编排器对象在本地事务期间处理事件,然后告诉协调器要执行哪个本地事务。