一个微服务完成工作的一个业务单元。在大多数情况下,一个事务的范围就是工作的一个业务单元;因此,事务被自动包含在一个服务里。例如,一个“借记储蓄银行账户”操作可以被原子化,而且事务完整性可以确保这个操作在服务的范围内。

然而,也许有业务场景需要你运行跨多个服务的多个工作业务单元,这些工作单元是由不同管辖范围的不同的团队编写的。因为这样业务流程跨越多个服务的边界,确保事务完整性就变成了一个挑战。有多种策略可以应对这一挑战。

以我们都很熟悉的在线“信用卡还款”作为一个具体的例子, 还款需要两个操作的编排配合,“借记储蓄银行账户”和“信用卡账户”是由不同的管辖范围来处理的。在这种情况下,“信用卡还款”是一个跨两个服务的复合操作。储蓄借记和信用还贷操作应该同时发生或同时不发生。因此这给经典架构提出了一个挑战:我们要如何确保跨越了多个分布式服务执行的操作的事务完整性。

我们首先会想到采用通过复合服务“信用卡还款”协调的分布式事务作为一种策略。然而,分布式服务在扩展性和稳定性上存在问题,例如可能会导致死锁,因此不建议这样做。

补偿事务

一个更可行的策略是让“信用卡还款”的两个操作独立地执行。如果复合服务在储蓄借记操作完成后检测到信用还贷的操作失败,它会通过发送一个等价的贷方分录(credit entry)回滚储蓄账户的操作。这个贷方分录就是一个补偿事务。

但是也可能会有使用补偿策略反而影响事务完整性的场景。其中的一个场景就是在储蓄借记的操作执行完毕之后,信用还贷的操作执行开始之前,复合服务挂掉了。多种模式可以用来处理这种事务中间的失败。下面我们讨论一下这三种模式。

  • 状态仓库

  • 传送名单(Routing Slip)

  • 流程管理器

状态仓库

复合服务在一个状态仓库记录了所有的状态改变。如果复合服务挂了,状态仓库可以用来找到和恢复不完整的事务。

传送名单

另一个常用的有弹性的方法是使复合的“信用卡还款”异步操作。复合服务在传送名单中用两个请求命令(一个给储蓄账户的指令和一个给信用账户的指令)创建了一个信息。这个信息从传送名单被发送到借记储蓄服务。借记储蓄服务执行第一个命令,并在将信息交给完成信用还贷操作的信用服务之前丰富传送名单。如果中间发生了失败,这个信息会被传送到错误队列,复合服务可以在有需要时从错误队列查看状态、错误状态和补偿措施。

流程管理器

传送名单的可替代方法是流程管理器,流程管理器监听储蓄借记和信用还贷操作的产生的事件,决定补偿还是完成事务。

在相同的限定上下文内的折叠操作

举另一个例子, 两个储蓄账户间的金额转移可以通过调用两次“储蓄账户”微服务的传统方式完成,即一次操作针对起点的账户的借记,另一次操作针对终点的账户的贷入。这种方式在事务处理上的考虑和上面所述的是相似的。然而,在这种情况下,由于借记和贷入操作都在“储蓄账户”的相同管辖范围内,“账户金额转移”逻辑可以只在执行借记和贷入操作的同一的微服务里面执行。这简化了事务处理的边界。

我们讨论了处理微服务中的事务问题的各种模式。根据您的使用案例,可以从上述选项中采用最佳方法。

长按二维码 ▲

订阅「架构师小秘圈」公众号

如有启发,帮我点个在看,谢谢↓

来了!微服务中的事务处理相关推荐

  1. 快速了解Kubernetes微服务中的通信

    by Adam Henson 亚当·汉森(Adam Henson) 快速了解Kubernetes微服务中的通信 (A quick look at communication in Kubernetes ...

  2. 用户在电商网站中购买成功了,那么 TA 在微服务中经历了什么?

    题目:用户在电商网站中购买成功了,那么它在微服务中经历了什么? 当我傻啊,用户在电商网站购买成功,还在微服务中,那肯定就是有一套微服务架构的电商系统. 设计一套电商系统还不简单 简单想象一下,既然是一 ...

  3. iframe的src动态修改并刷新_微服务中配置中心Config+消息总线Bus,实现分布式自动刷新配置

    技术/杨33 一.分布式配置中心Config 一套集中的.动态的配置管理,实现统一配置微服务中的每个子服务. Spring Cloud Config为微服务架构提供了集中化的外部配置支持,配置服务器为 ...

  4. 谈谈微服务中的 API 网关(API Gateway)

    前言 又是很久没写博客了,最近一段时间换了新工作,比较忙,所以没有抽出来太多的时间写给关注我的粉丝写一些干货了,就有人问我怎么最近没有更新博客了,在这里给大家抱歉. 那么,在本篇文章中,我们就一起来探 ...

  5. api商品分享源码_谈谈微服务中的 API 网关(API Gateway)

    在本篇文章中,我们就一起来探讨一下 API 网关在整个微服务分布式架构中的一个作用. # 背景我们知道在微服务架构风格中,一个大应用被拆分成为了多个小的服务系统提供出来,这些小的系统他们可以自成体系, ...

  6. 微服务中的面向切面编程和更多模式

    目录 介绍 如何建立这篇文章? 在Java中使用代码(11 +,Spring boot 2.2 +,Spring Boot AOP,AspectJ) 在C#中使用代码(7,.NET MVC Core ...

  7. nginx工作笔记005---nginx配置负载均衡_在微服务中实现网关集群_实现TCP传输层协议__http协议的负载均衡

    技术交流QQ群[JAVA,C++,Python,.NET,BigData,AI]:170933152 我们在微服务中,由于网关的存在,后来,在nginx中都不需要在配置其他服务的地址了,只需要,配置一 ...

  8. 魔鬼面试官:用户在电商网站中购买成功了,那么它在微服务中经历了什么?...

    点击上方"朱小厮的博客",选择"设为星标" 做积极的人,而不是积极废人 面试的时候,面试官问:用户在电商网站中购买成功了,那么它在微服务中经历了什么?你该如何作 ...

  9. 微服务中的服务发现是什么?

    作者:罗泽轩 摘要:本文通过服务发现的相关背景和 APISIX 对于服务发现的应用与实践,来介绍微服务中的服务发现内容. 在互联网刚开始出现的年代,人们要想访问某个在线服务,需要输入一长串的 IP 地 ...

最新文章

  1. 这些常识一直在损害健康
  2. 使用Xcode和Instruments调试解决iOS内存泄露(转)
  3. 转载一遍Java规范
  4. 高级C语言教程-关键字和运算符
  5. java 与C++ 数据类型大小
  6. html文字添加波浪线,利用css渐变给文字下方加波浪线
  7. 栈应用_将算式转成按运算符优先级分布(代码、分析、汇编)
  8. 修改TFS2013服务账户或者密码
  9. 跟踪oracle中sql语句运行过程及相关知识拓展
  10. php 变量存活期,php 变量生命周期:PHP源码分析-PHP的生_php
  11. 6.业务架构·应用架构·数据架构实战 --- 双轮驱动的技术架构设计
  12. 《21天学通C语言》总结(2)
  13. java sort 字符串_java字符串怎么排序
  14. EDA365 Skill找不到Cadence安装路径的原因与解决办法
  15. 那些年,我们一起踩过的 “Android 坑”
  16. linux下创建桌面快捷方式,简单快捷(ubuntu)
  17. Unicode双向算法详解(bidi算法)(二)
  18. 路径规划学习之地图生成(二)
  19. php限定符实例,PHP正则表达式限定符说明
  20. 14_python笔记-正则表达式

热门文章

  1. 2018 ICPC 青岛 L. Sub-cycle Graph(生成函数)
  2. P3743 kotori的设备(二分答案,思维,线性)难度⭐⭐⭐
  3. 前端性能优化 —— 项目瘦身
  4. CI框架常用函数(AR数据库操作的常用函数)
  5. 以Java 8 为基准
  6. Jupyter Notebook 基本使用
  7. Linux下sh/bash/source/.命令的区别(转)
  8. 服务应该去版本化,不管是微服务还是SOA
  9. JAVA wait(), notify(),sleep具体解释
  10. 在android平板上取位置和天气的实现方式