使用spring boot和axon实现saga模式-- 上

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实现中,每个服务发布一个或多个域事件。这些域事件触发其他微服务中的本地事务。


图片.png

我们来讲解一下上面的图片内容吧:

  • 订单服务负责创建订单及发送订单创建完成事件(OrderCreatedEvent)。
  • 支付服务收到该事件然后创建帐单(Invoice)。
  • 当帐单(Invoice)创建完成后,运输服务将创建货货运输信息。
  • 当货物发货成功时会发出已发货事件,然后订单服务会监听该事件并更新订单的状态。

这是一个非常简单的例子。在真实的生活中,执行这样的分布式事务将涉及许多业务规则和步骤。然而,此示例仅用于演示Saga模式的工作原理。

这里需要注意的重要一点是,每个服务都在编排中扮演自己的角色。每个服务基本上都依赖于来自其他服务的事件。

基于Orchestration(编排)的saga

在基于编排的Saga中,有一个编排者(比如乐队指挥者)。协调器也可以看作是一个管理器,它指导参与者服务执行本地事务。

下面是基于Orchestration实现的前面例子:


图片.png

我们来讲一下这种方式的逻辑:

  • 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/

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,547评论 6 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,399评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,428评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,599评论 1 274
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,612评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,577评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,941评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,603评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,852评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,605评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,693评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,375评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,955评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,936评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,172评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,970评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,414评论 2 342

推荐阅读更多精彩内容