Saga模式是每个服务一个数据库模式的直接结果。在每一数据库对应一个服务的模式中,每个服务都有自己的数据库。换句话说,每个服务只对自己的数据负责。
这是一个棘手的问题。
一些业务场景是需要来自多个服务的数据。这样的事务可能还需要跨服务更新或处理数据。因此,需要一种机制来保证跨多个服务的数据一致性。
这种情况导致形成了Saga模式的基础。
在这个系列文章中,我们将使用Axon框架和springboot实现Saga模式。
Axon框架是一个微服务框架,它使构建分布式系统变得容易。它为Spring Boot提供了强大的支持,我们将使用它来构建一个应用程序例子。
在第1部分(本文)中,我们将讲解Saga模式到底是什么。我们还将研究不同类型的Saga实现。最后,我们还将实现一个应用程序例子。
在第2部分中,我们将开始使用Saga模式构建应用程序例子。
第3部分我们将继续实现我们的应用程序。
最后,在第4部分中,我们将测试我们的应用程序,并看看它是如何运行的。
Saga模式的定义
基本上有两种类型的传奇。换句话说,有两种方法可以实现Saga模式
Saga模式的目的是以Saga的形式实现分布式事务。
Saga只不过是一系列本地事务。这些本地事务发生在各个服务内部。每当本地事务发生时,它都会发布消息或事件。此类事件会触发这个Saga中的下一步操作。
此时,您可能会问,当Saga序列中的单个事务失败时会发生什么情况?
在这种情况下,Saga将执行一系列的补偿事务。这些事务基本上会撤销前面事务所做的变更。
Saga的类型
基本上有两种类型的Saga。换句话说,有两种方法可以实现Saga模式。
基于Choreography(协调)的 Saga
在这种Saga实现中,每个服务发布一个或多个域事件。这些域事件触发其他微服务中的本地事务。
我们来讲解一下上面的图片内容吧:
- 订单服务负责创建订单及发送订单创建完成事件(OrderCreatedEvent)。
- 支付服务收到该事件然后创建帐单(Invoice)。
- 当帐单(Invoice)创建完成后,运输服务将创建货货运输信息。
- 当货物发货成功时会发出已发货事件,然后订单服务会监听该事件并更新订单的状态。
这是一个非常简单的例子。在真实的生活中,执行这样的分布式事务将涉及许多业务规则和步骤。然而,此示例仅用于演示Saga模式的工作原理。
这里需要注意的重要一点是,每个服务都在编排中扮演自己的角色。每个服务基本上都依赖于来自其他服务的事件。
基于Orchestration(编排)的saga
在基于编排的Saga中,有一个编排者(比如乐队指挥者)。协调器也可以看作是一个管理器,它指导参与者服务执行本地事务。
下面是基于Orchestration实现的前面例子:
我们来讲一下这种方式的逻辑:
- Order服务创建订单。然后,它还创建订单管理Saga
- Order Management Saga向支付服务发送一个创建发票命令(Create Invoice Command)
- 支付服务收到该命令并创建发票然后并响应订单管理Saga(该saga会收到Invoice Created Event)。请注意,这些响应也可以是完全异步的和消息驱动的
- 在下一个步骤中,Order Management Saga将发送命令Create Shipping Command给Shipping服务
- 运输服务执行必要的操作并创建Shipping(运输信息)。它还会发送订单管Saga
- Order Management Saga 更新订单状态然后结束该saga生命周期
Saga模式 -优缺点
Saga模式最大的好处是它可以让数据在多个服务中流转并且最终维护数据一致性。从微服务体系结构的角度来看,这一点非常重要,因为它允许我们在不紧耦合的情况下编写单独的服务。如果遇到分布式事务,我们可以使用Saga模式。
然而,这种方法也有缺点。反对Saga模式的主要观点是,这种模式使编程模型更加复杂。一个简单的例子是开发补偿事务,以防出现问题。此外,开发人员通常不完全适应这种编程模型。至少,现在还没有。
另外一个难点是原子操作:聚合状态更新和发布领域事件的原子性。
通常,Saga模式会与其他一些模式(如事件来源和CQRS)一起配合使用。这些模式专门尝试处理围绕原子更新聚合状态和发布事件的场景。
实现Saga模式
现在我们已经了解了什么是Saga模式,我们将探讨如何实现它。
我们将着眼于基于编排(Orchestration-Based)的实现。我们将使用与上面描述的Order服务相同的情况。
我们将使用的一些工具和框架如下:
Axon框架——这是一个基于java的微服务框架,它可以帮助你使用领域驱动设计技术构建应用程序。使用Axon框架构建可扩展的微服务 里有更详细地描述。
Axon服务器——从第4版开始,Axon越来越像一个平台。Axon平台包括核心的Axon框架和Axon服务器。Axon服务器增强了微服务之间的通信。
Spring Boot——Spring Boot可能是构建企业应用程序的最流行的基于java的框架。它易于使用,并与其他框架广泛集成,这使得它成为构建微服务的理想选择。
原文:http://progressivecoder.com/saga-pattern-implementation-with-axon-and-spring-boot-part-1/