架构模式: Saga

上下文

您已应用每服务数据库模式。每个服务都有自己的数据库。但是,某些业务事务跨越多个服务,因此您需要一种机制来确保服务之间的数据一致性。例如,假设您正在建立一个客户有信用额度的电子商务商店。申请必须确保新订单不会超过客户的信用额度。由于订单和客户位于不同的数据库中,因此应用程序不能简单地使用本地ACID事务。

问题

如何跨服务维护数据一致性?

要点

  • 可以不选择2PC

结论

实现跨越多个服务的每个业务事务作为传奇。传奇是一系列本地交易。每个本地事务都更新数据库并发布消息或事件以触发saga中的下一个本地事务。如果本地事务因违反业务规则而失败,则saga会执行一系列补偿事务,以撤消先前本地事务所做的更改。

协调sage有两种方式:

  • Choreography - 每个本地事务发布触发其他服务中的本地事务的域事件
  • Orchestration - 一个orchestrator(上帝对象)告诉参与者要执行的本地事务

例子: Choreography-based saga


使用此方法的电子商务应用程序将使用基于 Choreography-based saga创建订单,包含以下步骤:

  1. Order Service创建处于挂起状态的订单并发布OrderCreated事件
  2. Customer Service收到事件尝试为该订单保留信用。它发布Credit Reserved事件或CreditLimitExceeded事件。
  3. Order Service接收事件并将订单状态更改为已批准或已取消

例子: Orchestration-based saga


使用此方法的电子商务应用程序将使用基于Choreography-based saga创建订单,包含以下步骤:

  1. Order Service创建处于暂挂状态的订单并创建CreateOrderSaga
  2. CreateOrderSaga向Customer Service 发送ReserveCredit命令
  3. Customer Service尝试为该订单保留信用额并发回回复
  4. CreateOrderSaga接收回复并向Order Service发送ApproveOrder或RejectOrder命令
  5. Order Service将订单状态更改为已批准或已取消

结论上下文

这种模式具有以下好处:

  • 它使应用程序能够跨多个服务维护数据一致性,而无需使用分布式事务

该解决方案具有以下缺点:

  • 编程模型更复杂。例如,开发人员必须设计补偿事务,以明确撤消先前在saga中所做的更改。

还有以下问题需要解决:

  • 为了可靠,服务必须以原子方式更新其数据库并发布消息/事件。它不能使用跨越数据库和消息代理的分布式事务的传统机制。相反,它必须使用下面列出的模式之一。

关联模式

    • 每个服务独立数据库模式创建了对此模式的需求
    • 以下模式是以原子方式更新状态和发布消息/事件的方法:
      • 事件溯源
      • 交易发件箱
    • 基于Choreography可以使用聚合和域事件发布事件

架构模式: Saga的更多相关文章

  1. Microservice架构模式简介

    在2014年,Sam Newman,Martin Fowler在ThoughtWorks的一位同事,出版了一本新书<Building Microservices>.该书描述了如何按照Mic ...

  2. Hibernate(1)——数据访问层的架构模式

    俗话说,自己写的代码,6个月后也是别人的代码……复习!复习!复习!涉及到的知识点总结如下: 数据库的概念.逻辑.数据模型概念 应用程序的分层体系结构发展 MVC设计模式与四层结构的对应关系 持久层的设 ...

  3. Android 四大组件 与 MVC 架构模式

    作为一个刚从JAVA转过来的Android程序员总会思考android MVC是什么样的? 首先,我们必须得说Android追寻着MVC架构,那就得先说一下MVC是个啥东西! 总体而来说MVC不能说是 ...

  4. iOS 架构模式--解密 MVC,MVP,MVVM以及VIPER架构

    本文由CocoaChina译者lynulzy(社区ID)翻译 作者:Bohdan Orlov 原文:iOS Architecture Patterns 在 iOS 中使用 MVC 架构感觉很奇怪? 迁 ...

  5. 《企业应用架构模式》(POEAA)读书笔记

    原文地址:<企业应用架构模式>(POEAA)读书笔记作者:邹齐龙(技术-5013 什么是架构 Rolph Johnson认为:架构是一种主观上的东西,是专家级的项目开发人员对系统设计的一些 ...

  6. 面向对象架构模式之:领域模型(Domain Model)

    一:面向对象设计中最简单的部分与最难的部分 如果说事务脚本是 面向过程 的,那么领域模型就是 面向对象 的.面向对象的一个很重要的点就是:“把事情交给最适合的类去做”,即:“你得在一个个领域类之间跳转 ...

  7. iOS 架构模式-MVVM

    iOS 架构模式-MVVM MVVM Model-View-ViewModelMVVM 其实是MVC的进化版,他将业务逻辑从VC中解耦到ViewModel,实现VC的瘦身. 做一个简单的登录判断: 创 ...

  8. iOS - MVP 架构模式

    1.MVP 从字面意思来理解,MVP 即 Modal View Presenter(模型 视图 协调器),MVP 实现了 Cocoa 的 MVC 的愿景.MVP 的协调器 Presenter 并没有对 ...

  9. Android IOS WebRTC 音视频开发总结(二二)-- 多人视频架构模式

    本文主要介绍多人视频会议服务端架构方式,文章来自博客园RTC.Blacker,转载必须说明出处,欢迎关注个人微信公众号blacker,更多详见www.rtc.help 随着移动互联网的迅速发展,很多公 ...

随机推荐

  1. LINUX查看内存使用情况 free

    # free 显示结果如下: Mem:表示物理内存统计 total 内存总数 8057964KB used 已使用的内存 7852484KB free 空闲的内存数 205480KB shared 当 ...

  2. linear 工作流

    最近把 最后一张画ui的rt 从float换成srgb 并没有引起我预计会有的 alpha混合结果发生变化的事情 我想是因为 1.artists在ps里的工作流是线性空间 2.onchip memor ...

  3. fiddler save files

    使用fiddler 保存访问到的文件 使用jscript Fiddler Script 是用JScript.NET语言写的 JScript.NET 此语言可以调用C# api 参考地址:http:// ...

  4. Java笔记(基础第一篇)

    一.初识java 1.Java是一种可以编写跨平台的.面向对象的程序设计语言. Java开发分成以下3个方向: (1). java SE:主要用于桌面程序的开发.是java EE和java ME的基础 ...

  5. 在cubemx中使用freertos中的注意事项

    就是使用信号量等rtos自带特性的时候,务必先初始化然后在发生信号量或接收. 而且在中断中发送信号量或队列的时候,务必把使能中断的语句放在初始化freertos之后,尤其是cubemx生成的代码,默认 ...

  6. bzoj1497: [NOI2006]最大获利(最小割)

    传送门 第一眼看去:好难 第二眼:不就是个裸的最大权闭合子图么…… 我们从源点向所有用户连边,容量为收益,用户向自己的中转站连边,容量为INF,中转站向汇点连边,容量为费用 那么总收益-最小割就是答案 ...

  7. Java数据库小项目02--管家婆项目

    目录 项目要求 开发环境搭建 工具类JDBCUtils 创建管家婆数据表 项目分层 MainApp层 MainView层 ZhangWuController层 ZhangWuService层 Zhan ...

  8. Hdu 4333 Revolving Digits(Exkmp)

    Revolving Digits Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) To ...

  9. Linux网络命令——ifconfig、ifup、ifdown

    这三个命令的用途都是启动网络接口,不过,ifup 与 ifdown 仅就 /etc/sysconfig/network- scripts 内的 ifcfg-ethx(x为数字)进行启动或关闭的操作,并 ...

  10. pycharm同一目录下无法import其他文件

    如图:会出现带有红色波浪线,但是确实有random_walk文件 解决方法: 在当前文件下,右键找到mark  Directory as 然后选择source root,完工ok 再如图: 版权声明: ...