微服务分布式事务处理

这篇具有很好参考价值的文章主要介绍了微服务分布式事务处理。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

当我们向微服务架构迁移时,如何处理好分布式事务是必须考虑的问题。这篇文章介绍了分布式事务处理的两种方案,可以结合实际采用合适的解决方案。原文:Handling Distributed Transactions in the Microservice world[1]

如今每个人(包括我)都在思考、构建微服务,分布式系统是微服务的核心原则和一切实现的上下文。

什么是分布式事务?

跨越网络上多个物理系统或计算机的事务被简单的称为分布式事务。在微服务世界中,事务被分割到多个服务中,需要按顺序调用这些服务以完成整个事务。

下面是一个单体电子商务系统使用事务的例子:

微服务分布式事务处理
图1: 单体中的事务

在上面的系统中,如果用户向平台发送Checkout请求,平台将创建一个本地数据库事务,该事务操作多个数据库表,以处理订单并从库存中保留商品。如果有任何步骤失败,事务(包括订单和保留的商品)可以回滚。这被称为ACID(原子性 Atomicity、一致性 Consistency、隔离性 Isolation、持久性 Durability),由数据库系统保证。

下面是电子商务系统分解为微服务的情况:

微服务分布式事务处理
图2: 微服务中的事务

当我们解耦这个系统时,创建了微服务OrderMicroserviceInventoryMicroservice,各自有独立的数据库。当用户发起Checkout请求时,这两个微服务都将被调用从而将更改应用到各自的数据库中。因为事务是通过多个系统跨多个数据库的,所以现在这是一个分布式事务

微服务中的分布式事务有什么问题?

随着微服务体系架构的出现,事务可以跨越多个微服务,从而跨越数据库,因此我们现在无法利用数据库的ACID特性,从而面临以下关键问题:

如何保持事务的原子性?

原子性意味着事务要么完成所有步骤,要么没有完成任何步骤。在上面的例子中,如果InventoryMicroservice方法中的“保留商品”失败,如何回滚OrderMicroservice应用的“处理订单”?

如何处理并发请求?

如果某个微服务的对象被持久化到数据库中,同时有另一个请求读取相同的对象。服务应该返回旧数据还是新数据?在上面的例子中,一旦OrderMicroservice已经完成,那么InventoryMicroservice在执行更新的过程时,客户下单的请求中应该包括当前的订单吗?

如今,系统应该为失败而设计,其中主要的问题就是处理分布式事务。下面引用Pat Helland的话:

一般来说,应用程序开发人员不会简单的就能实现支持分布式事务的大型可伸缩应用系统。—— Pat Helland

可能的解决方案

在设计和构建基于微服务的应用时,上述两个问题非常关键。为了解决这些问题,下面列举几种方法:

  • 两阶段提交(Two-Phase Commit)
  • 最终一致性和补偿(Eventual Consistency and Compensation )/ SAGA
1. 两阶段提交

顾名思义,这种处理事务的方式有两个阶段,准备阶段和提交阶段,其中起到重要作用的是事务协调器(Transaction Coordinator),负责维护事务的生命周期。

工作方式:

在准备阶段,所有涉及到的微服务都准备提交,并通知协调器已经准备好完成事务。然后在提交阶段,事务协调器向所有微服务发出提交或回滚命令。

以电子商务系统为例:

微服务分布式事务处理
图3: 在微服务上成功的两阶段提交

在上面的示例中(图3),当用户发送Checkout请求时,TransactionCoordinator将发起一个带有所有上下文信息的全局事务。首先,向OrderMicroservice发送prepare命令创建订单。然后,向InventoryMicroservice发送prepare命令保留商品。当两个服务都可以执行更改时,它们将锁定对象,不再接受其他更改,并通知TransactionCoordinator。一旦TransactionCoordinator确认所有微服务都已准备好应用更改,就会通过请求事务commit来要求这些微服务持久化所作的更改,然后所有对象才能被解锁。

微服务分布式事务处理
图4: 在微服务上失败的两阶段提交

在失败的场景中(图4)——如果在任何时候有某个微服务没有做好准备,TransactionCoordinator将中止事务并发起回滚流程。图中由于某种原因,OrderMicroservice未能创建订单,但是InventoryMicroservice已经回复说它准备创建订单。TransactionCoordinator将请求InventoryMicroservice中止创建订单,并回滚所做的任何更改、解锁数据库对象。

优点

  • 该方法保证事务是原子的。交易结束时,要么所有微服务都成功,要么所有微服务都没有改变。
  • 其次,允许读写分离,在事务协调器提交更改之前,对象上的更改是不可见的。
  • 这种方法通过同步调用通知客户端成功或失败。

缺点

  • 没什么事情是完美的,两阶段提交与单个微服务的处理时间比起来慢很多,并且高度依赖于事务协调器,在高负载期间,事务协调器确实会降低系统的速度。
  • 另一个主要缺点是数据库行锁定,该锁可能成为性能瓶颈,并且可能出现两个事务相互锁定造成的 死锁
2. 最终一致性和补偿/SAGA

最终一致性的最佳定义之一是microservices.io[2]描述的:每个服务在更新数据时发布一个事件。其他服务订阅事件,当接收到事件时,更新其数据。

在这种方法中,分布式事务由相关微服务上的异步本地事务来完成,微服务通过事件总线相互通信。

工作方式:

再以电子商务系统为例:

微服务分布式事务处理
图5: 最终的一致性/SAGA,成功的场景

在上面的例子中(图5),客户端请求系统处理订单。在处理过程中,Choreographer发出一个Create Order事件,表示开始一个事务。OrderMicroservice监听到这个事件并创建一个订单,如果成功,发出一个Order Created事件。Choreographer侦听此事件,并通过发出Reserve items事件继续保留商品。InventoryMicroservice侦听此事件并保留商品,如果成功,发出Items Reserved事件。在这个例子中,这意味着事务的结束。

微服务之间所有基于事件的通信都是通过事件总线进行的,并由另一个系统编排以解决复杂性问题。

微服务分布式事务处理
图6:最终的一致性/SAGA,失败场景

如果由于任何原因InventoryMicroservice未能保留商品(图6),它会发出Failed to Reserve Items事件。Choreographer侦听此事件,并通过发出Delete Order事件启动补偿事务OrderMicroservice侦听此事件并删除所创建的订单。

优点

这种方法的一大优点是每个微服务只关注自己的原子事务。如果某个服务花费了更长的时间,其他微服务不会被阻塞,这也意味着不需要数据库锁。由于其基于异步事件的解决方案,这种方法可以使系统在高负载下具有高度的可伸缩性。

缺点

该方法的主要缺点是没有读取隔离。这意味着在上面的示例中,客户端可以看到已创建的订单,但在下一秒中,由于补偿事务,订单会被删除。此外,当微服务的数量增加时,调试和维护就变得更加困难。

结论

首先尽量避免分布式事务,如果正在构建新应用,那么就从单体开始,如Martin Fowler在MonolithFirst[3]中所描述的那样:

更常见的方法是从单体开始,逐渐剥离边缘的微服务。这种方法可以在微服务体系架构的核心留下一个巨大的单体,大多数新的开发都发生在微服务中,而这个单体相对来说变化不大。— Martin Fowler

当一个事件需要在两个地方更新数据时,与两阶段提交相比,最终一致性/SAGA方案是处理分布式事务的更好的方式,主要原因是两阶段提交在分布式环境中不能伸缩。不过最终一致性方案引入了新问题,例如如何以原子方式更新数据库和发出事件,因此采用这种方案需要开发和测试团队改变思维方式。

References:
[1] Handling Distributed Transactions in the Microservice world: https://medium.com/swlh/handling-transactions-in-the-microservice-world-c77b275813e0
[2] Event Driven Architecture: https://microservices.io/patterns/data/event-driven-architecture.html
[3] MonolithFirst: https://martinfowler.com/bliki/MonolithFirst.html

你好,我是俞凡,在Motorola做过研发,现在在Mavenir做技术工作,对通信、网络、后端架构、云原生、DevOps、CICD、区块链、AI等技术始终保持着浓厚的兴趣,平时喜欢阅读、思考,相信持续学习、终身成长,欢迎一起交流学习。
微信公众号:DeepNoMind

- END -

本文由 mdnice 多平台发布文章来源地址https://www.toymoban.com/news/detail-442578.html

到了这里,关于微服务分布式事务处理的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • SpringCloud(17~21章):Alibaba入门简介、Nacos服务注册和配置中心、Sentinel实现熔断与限流、Seata处理分布式事务

    Spring Cloud Netflix项目进入维护模式 https://spring.io/blog/2018/12/12/spring-cloud-greenwich-rc1-available-now 说明 Spring Cloud Netflix Projects Entering Maintenance Mode 什么是维护模式 将模块置于维护模式,意味着 Spring Cloud 团队将不会再向模块添加新功能。我们将修复 block 级别的 bug 以及安全问题,我

    2024年01月19日
    浏览(48)
  • 分布式事务的安全与加密处理

    分布式事务是在多个独立的系统之间进行协同工作时,需要保证事务的原子性、一致性、隔离性和持久性的一种场景。随着分布式系统的普及和发展,分布式事务的应用也越来越广泛。然而,分布式事务的安全与加密处理是一个非常重要的问题,需要深入了解其核心概念、算

    2024年01月23日
    浏览(82)
  • springcloudSeata处理分布式事务之1.7.0

    1.5.0之后版本发生了很大改变 1.1官网地址 http://seata.io/zh-cn/ 1.2下载地址 https://github.com/seata/seata/releases 下载的是seata-server-1.7.0.zip 1.3seata相关配置的修改 seata-server-1.7.0seataconf下的application.yml进行修改 1.4 nacos中seata配置文件 参考地址https://githubfast.com/seata/seata/blob/master/script/co

    2024年02月09日
    浏览(51)
  • 微服务·数据一致-事务与分布式事务

    事务是计算机科学和数据库管理中的一个关键概念,用于确保数据的一致性和可靠想。事务管理是大多数应用程序和数据库系统中不可或缺的一部分。分布式事务扩展了事务的概念,用于多个分布式系统和服务的数据一致性管理。本调查报告将深入探讨事务和分布式事务的概

    2024年02月09日
    浏览(37)
  • 微服务--Seata(分布式事务)

    TCC模式在代码中实现:侵入性强,并且的自己实现事务控制逻辑 Try,Confirm() cancel() 第三方开源框架:BeyeTCCTCC-transactionHimly 异步实现:MQ可靠消息最终一致性 @GlobalTransacational---AT模式

    2024年02月10日
    浏览(39)
  • 微服务中间件--分布式事务

    1) CAP定理 分布式系统有三个指标: Consistency(一致性): 用户访问分布式系统中的任意节点,得到的数据必须一致 Availability(可用性): 用户访问集群中的任意健康节点,必须能得到响应,而不是超时或拒绝 Partition tolerance (分区容错性) Partition(分区): 因为网络故障或其它

    2024年02月12日
    浏览(33)
  • 08-微服务Seata分布式事务使用

    一、分布式事务简介 事务ACID: A(Atomic):原子性,构成事务的所有操作,要么都执行完成,要么全部不执行,不可能出现部分成功部分失 败的情况。 C(Consistency):一致性,在事务执行前后,数据库的一致性约束没有被破坏。比如:张三向李四转100元, 转账前和转账后的

    2024年01月24日
    浏览(38)
  • 微服务13-Seata的四种分布式事务模式

    XA模式分为两种情况 : 提交成功: 提交失败: 具有强一致性seata相当于是在RM上做了一层封装; XA模式 优点 : 1.事务的强一致性,只要有失败的,TC事务协调者就会发送信息让RM回滚——满足ACID原则 2.没有代码侵入,常用数据库都支持 缺点 : 1.第一阶段就要锁定数据库资源

    2024年02月07日
    浏览(34)
  • 【springcloud微微服务】分布式事务框架Seata使用详解

    目录 一、前言 二、事务简介 2.1 原子性 2.2 一致性 2.3 隔离性 2.4 持久性

    2023年04月26日
    浏览(32)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包