分布式事务实现技术及考虑点
什么是分布式事务?
首先理解什么是本地事务
平时我们在程序中通过Spring去控制事务是利用数据库本身的事务特性来实现的,因此叫数据库事务,由于应用主要靠关系数据库来控制事务,而数据库通常和应用在同一个服务器,所以基于关系型数据库的事务又被称为本地事务
本地事务具有ACID四大特性
- 原子性(Atomicity):事务是一个不可分割的工作单位,事务中的操作要么全部成功,要么全部失败。
- 一致性(Consistency):事务在执行前后必须保持数据的一致性,即满足业务逻辑和约束条件。
- 隔离性(Isolation):事务之间不应相互干扰,每个事务都应该在独立的环境中执行,不受其他事务的影响。
- 持久性(Durability):事务一旦提交,其对数据的修改就应该永久保存在数据库中,即使发生系统故障或崩溃也不会丢失。
数据库事务在实现时会将一次事务涉及到的所有操作全部纳入到一个不可分割的执行单元,该执行单元中的所有操作要么都成功,要么都失败,只要其中任一操作执行失败,都将导致整个事务的回滚
理解了本地事务,那么什么是分布式事务?
现在的需求是:课程发布操作后,将数据写入数据库、Redis、ElasticSearch、MinIO四个地方,这四个地方已经不限制在一个数据库内,而是由四个分散的服务去提供,与这四个服务去通信需要网络通信,而网络存在不可到达性(例如突然断网),在这种分布式系统环境下,通过与不同的服务进行网络通信去完成事务,称之为分布式事务
在分布式系统中分布式事务的场景有很多,例如用户注册送积分、银行转账、创建订单减库存,这些都是分布式事务
拿转账举例,我们知道本地事务依赖数据库本身提供的事务特性来实现,因此以下逻辑可以控制本地事务
begin transaction;
// 1. 本地数据库操作:张三减少金额
// 2. 本地数据库操作:李四增加金额
end transaction;
但是在分布式环境下,会变成这样
begin transaction;
// 1. 本地数据库操作:张三减少金额
// 2. 远程调用:李四增加金额
end transaction;
可以设想,当远程调用让李四增加金额成功了,由于网络原因导致远程调用的结果没有返回,此时本地事务提交失败就回滚了张三减少金额的操作,此时张三和李四的数据就不一致了
因此在分布式框架的基础上,传统数据库事务就无法使用了,张三和李四的账户不在同一个数据库甚至不在同一个应用系统里,实现转账事务需要远程调用,由于网络问题就会导致分布式事务问题
什么是CAP理论
控制分布式事务首先需要理解CAP理论,什么是CAP理论?
CAP理论是一个分布式系统设计的重要理论,它指出一个分布式系统最多只能同时满足一致性(Consistency)、可用性(Availability)和分区容忍性(Partition tolerance)这三项中的两项。
- 一致性是指所有节点访问同一份最新的数据副本
- 可用性是指每个请求都能得到响应
- 分区容忍性是指系统能够在网络分区的情况下继续运行。
举例:一个网关两个节点
客户端经过网关访问用户服务的两个节点
一致性是指用户不管访问哪一个节点,拿到的数据都是最新的相同的,例如查询小明的信息,不能出现在数据没有改变的情况下,两次查询结果不一样
可用性是指任何时候查询用户信息都可以查询到结果,但是不保证查询到的是最新的数据
分区容忍性也叫分区容错性,由于网络通信异常,导致请求终端、消息丢失,单服务依然对外提供服务
CAP理论要强调的是在分布式系统中,这三点不可能全部满足,因为只要是分布式系统就要满足分区容忍性,因为服务间难免会出现网络异常,不能因为局部网络异常就导致整个系统不可用
满足分区容忍性的条件下,一致性和可用性不能同时满足
例如我们添加一个用户小明的信息,该信息先添加到结点1中,再同步到结点2中
如果满足C一致性,必须等待小明的信息同步完成后,系统才可用(否则当你查询结点2的时候,会查不到数据,违背了一致性)
如果满足A可用性,要时刻保证系统可用,就不用等待信息同步完成,此时系统的一致性就无法满足
所以C和A不能同时满足,在分布式系统中进行分布式事务控制,要么保证CP、要么保证AP
分布式事务控制方案
学习CAP理论,我们知道进行分布式事务控制要在C一致性和A可用性中做出取舍,保证一致性就不要保证可用性,保证可用性就不要保证一致性。
首先要确认我们的需求是要CP还是AP,具体要根据应用场景进行判断
CP的场景:满足C舍弃A,强调一致性
跨行转账:一次转账请求要等待双方银行系统都完成整个事务才算完成,只要其中一个失败,另一方执行回滚操作
开户操作:在业务系统开户同时要在运营商开户,任何一方开户失败,该用户都不可使用新开账户,要满足一致性
AP的场景:满足A舍弃C,强调可用性
订单退款,今日退款成功,明日账户到账,只要用户可以接受在一定时间内到账即可
注册送积分,注册成功,积分在24小时内到账
支付短信通信,支付成功发短信,短信发送可以有延迟
在实际应用中符合AP的场景比较多,虽然AP舍弃C的一致性,但实际最终数据还是保持了一致,所以业界定义了BASE理论
BASE 理论
BASE是Basically Available(基本可用)、Soft state(软状态)和 Eventually consistent (最终一致性)三个短语的缩写。
基本可用:当系统无法满足全部可用时,保证核心业务可用即可,比如一个外卖系统,到了饭点的时候系统并发量很高,此时要保证下单流程涉及的服务可用,其他服务暂不可用
软状态:可以存在中间状态,例如:微博的评论功能。当用户发表一条评论时,这条评论并不会立即同步到所有关注者的页面上,而是会先存储在缓存中,并逐渐传播到其他节点。这样就存在了一个中间状态,即某些用户可以看到这条评论,而某些用户还不能看到。
最终一致性:前面的软状态并不影响微博的整体可用性,用户仍然可以正常浏览和发表微博。最终,在一定时间内,所有关注者都能看到这条评论,达到了最终一致性。
分布式事务常见的技术方案
实现CP就需要强一致性:
例如Seata AT模式、TCC模式
实现AP保证最终一致性:
消息队列,通知失败自动重试,超过最大次数手动处理、任务调度
在我们的系统中,课程发布操作后,将数据写入数据库、Redis、ElasticSearch、MinIO,采用定时任务,利用将发布课程消息表来记录任务,任务完成删除消息表记录,任务没完成则下一轮定时任务会重新执行。
相关文章:
分布式事务实现技术及考虑点
什么是分布式事务? 首先理解什么是本地事务 平时我们在程序中通过Spring去控制事务是利用数据库本身的事务特性来实现的,因此叫数据库事务,由于应用主要靠关系数据库来控制事务,而数据库通常和应用在同一个服务器,所…...
JavaScript中闭包的理解
闭包(Closure)概念:一个函数对周围状态的引用捆绑在一起,内层函数中访问到其外层函数的作用域。简单来说;闭包内层函数引用外层函数的变量,如下图: 外层在使用一个函数包裹住闭包是对变量的保护,…...
传统IO和NIO文件拷贝过程
参考:https://blog.csdn.net/weixin_57323780/article/details/130250582...
算法思想总结:优先级队列
一、最后一块石头的重量 . - 力扣(LeetCode) 我们每次都要快速找到前两个最大的石头进行抵消,这个时候用优先级队列(建大堆),不断取堆顶元素是最好的!每次删除堆顶元素后,可以自动调整…...
《米小圈日记魔法》边看边学,轻松掌握写日记的魔法!
在当今充满数字化娱乐和信息快速变迁的时代,如何创新引导孩子们学习,特别是如何培养他们的写作能力,一直是家长和教育者们关注的焦点。今天就向大家推荐一部寓教于乐的动画片《米小圈日记魔法》,该系列动画通过其独特的故事情节和…...
鸿蒙应用实践:利用扣子API开发起床文案生成器
前言 扣子是一个新一代 AI 应用开发平台,无需编程基础即可快速搭建基于大模型的 Bot,并发布到各个渠道。平台优势包括无限拓展的能力集(内置和自定义插件)、丰富的数据源(支持多种数据格式和上传方式)、持…...
二手物品交易小程序的设计
管理员账户功能包括:系统首页,个人中心,用户管理,管理员管理,商品信息管理,论坛管理,收货地址管理,基础数据管理 微信端账号功能包括:系统首页,商品信息&…...
基于Spring Boot的高校智慧采购系统
1 项目介绍 1.1 摘要 随着信息技术与网络技术的迅猛发展,人类社会已跨入全新信息化纪元。传统的管理手段因其内在局限,在处理海量信息资源时日渐捉襟见肘,难以匹配不断提升的信息管理效率和便捷化需求。顺应时代发展趋势,各类先…...
数字流的秩
题目链接 数字流的秩 题目描述 注意点 x < 50000 解答思路 可以使用二叉搜索树存储出现的次数以及数字的出现次数,方便后续统计数字x的秩关键在于构建树的过程,如果树中已经有值为x的节点,需要将该节点对应的数字出现次数加1…...
【mybatis】mybatis-plus中Wrapper(条件构造器)简介_常用方法及说明
1、简介 MyBatis-Plus 是一个 MyBatis 的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。MyBatis-Plus 提供了强大的条件构造器(Wrapper),用于构建复杂的 SQL 查询条件,使得我们…...
IT专业入门:高考假期预习指南
七月,是一个充满转折与希望的月份。随着各省高考分数的揭晓,许多有志于踏入IT领域的少年们正站在新旅程的起点上。高考的完结并不意味着学习的结束,相反,它是一个全新的开始,一个探索未知世界的绝佳时机。作为IT领域的…...
推动高效能:东芝TB67H301FTG全桥直流电机驱动IC
在如今高度自动化的时代,电子产品的性能和效率成为了工程师们关注的焦点。东芝的TB67H301FTG全桥直流电机驱动IC应运而生,以其卓越的技术和可靠性,成为众多应用的理想选择。无论是在机器人、家用电器、工业自动化,还是在其他需要精…...
Matplotlib 中文显示
Matplotlib 中文显示 Matplotlib 是一个强大的 Python 绘图库,广泛应用于数据可视化领域。然而,对于中文用户来说,Matplotlib 的默认设置可能不支持中文显示,这给使用带来了一定的不便。本文将详细介绍如何在 Matplotlib 中正确显示中文,包括中文字符的字体选择、字体大小…...
【LeetCode:841. 钥匙和房间 + DFS】
🚀 算法题 🚀 🌲 算法刷题专栏 | 面试必备算法 | 面试高频算法 🍀 🌲 越难的东西,越要努力坚持,因为它具有很高的价值,算法就是这样✨ 🌲 作者简介:硕风和炜,…...
1)并发事务的问题
1) 并发事务的问题? (1)读“脏”数据 事务T1修改数据后T2读取了该数据,但是T1撤消了修改, 事务T1进行了回滚,导致事务T2读取的数据与数据库中的数据不一致。(2)丢失修改 两个事务…...
Python缓存利器:cachetools库详解
Python缓存利器:cachetools库详解 1. cachetools简介2. 安装3. 基本概念3.1 LRU Cache (Least Recently Used)3.2 TTL Cache (Time-To-Live)3.3 LFU Cache (Least Frequently Used) 4. 使用示例4.1 使用LRU Cache4.2 使用TTL Cache4.3 使用LFU Cache4.4 缓存装饰器 5. 进阶用法…...
【Python实战因果推断】20_线性回归的不合理效果10
目录 Neutral Controls Noise Inducing Control Feature Selection: A Bias-Variance Trade-Off Neutral Controls 现在,您可能已经对回归如何调整混杂变量有了一定的了解。如果您想知道干预 T 对 Y 的影响,同时调整混杂变量 X,您所要做的…...
在Ubuntu 16.04上安装和配置ownCloud的方法
前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站。 简介 ownCloud 是一个文件共享服务器,允许您将个人内容(如文档和图片)存储在一个类似 Dropbox 的集…...
Java | Leetcode Java题解之第213题打家劫舍II
题目: 题解: class Solution {public int rob(int[] nums) {int length nums.length;if (length 1) {return nums[0];} else if (length 2) {return Math.max(nums[0], nums[1]);}return Math.max(robRange(nums, 0, length - 2), robRange(nums, 1,…...
使用 ESP32 接收 MAX4466 模拟麦克风模块的数据,通过 DAC 转码成 PCM 格式,并通过 MQTT 发送给另一台设备,可以通过以下步骤实现。
硬件准备 两个 ESP32 开发板MAX4466 模拟麦克风模块MQTT 服务器(例如 Mosquitto) 接线 MAX4466 模块输出(AO) -> ESP32 ADC 引脚(如 GPIO 34) 软件准备 音频采集DAC 转码MQTT 发送和接收 代码实现…...
Python算法基础篇之广度优先搜索(BFS)
一、什么是广度优先搜索(BFS)? 广度优先搜索(Breadth-First Search, BFS) 是一种用于遍历或搜索图、树的算法。其核心策略是:从起始节点出发,先访问所有直接邻居(第1层)&…...
【车辆路径规划】基于RRT算法的车辆导航工具箱实现附matlab代码
✅作者简介:热爱科研的Matlab仿真开发者,擅长毕业设计辅导、数学建模、数据处理、程序设计科研仿真。🍎完整代码获取 定制创新 论文复现点击:Matlab科研工作室👇 关注我领取海量matlab电子书和数学建模资料 dz…...
Android App原生指令通道doCommandNative深度解析与Frida Hook实战
1. 这不是“逆向教程”,而是一次真实App通信链路的解剖现场你有没有遇到过这样的情况:在某A系头部电商App里,点击一个商品卡片,页面秒开;但用常规WebView调试或抓包工具去观察,却看不到任何明显的HTTP请求发…...
【ChatGPT故事化表达黄金法则】:20年AI内容专家亲授3步叙事框架,让提示词转化率提升300%
更多请点击: https://intelliparadigm.com 第一章:ChatGPT故事化表达的底层认知革命 传统人机交互长期受限于指令式范式——用户需精确编码意图,系统则机械匹配关键词或规则。ChatGPT 的突破性不在于参数规模,而在于其将语言建模…...
机器学习海气耦合模型Ola:解耦训练与滞后集合预报实战
1. 项目概述:当机器学习遇见海气耦合在气候预测这个领域里摸爬滚打了十几年,我见过太多复杂的物理模型和让人头大的耦合方案。传统的海气耦合模型,比如那些基于物理方程组的数值模式,虽然机理清晰,但计算成本高得吓人&…...
Gofile下载神器:Python多线程极速下载完整指南
Gofile下载神器:Python多线程极速下载完整指南 【免费下载链接】gofile-downloader Download files from https://gofile.io 项目地址: https://gitcode.com/gh_mirrors/go/gofile-downloader 在当今数字时代,文件传输效率直接关系到工作效率。Go…...
告别古板前端界面,这个 Github 狂揽 8.1万 Star 的 UI 开源项目,让你 AI 生成的 UI 界面审美直接拉满
大家好,我是Java1234_小锋老师。 先说结论:它到底解决什么问题? 如果你经常用 AI 写前端页面,大概率遇到过这种场景: 你说「帮我做一个 SaaS 落地页」,AI 确实能跑起来,但出来的界面总有点「…...
AutoCut终极教程:如何用文本编辑器3分钟剪出专业视频
AutoCut终极教程:如何用文本编辑器3分钟剪出专业视频 【免费下载链接】autocut 用文本编辑器剪视频 项目地址: https://gitcode.com/GitHub_Trending/au/autocut 还在为视频剪辑软件复杂的界面而头疼吗?AutoCut让你告别繁琐的视频编辑,…...
艾尔登法环存档救星:5分钟学会角色迁移,告别数百小时进度丢失
艾尔登法环存档救星:5分钟学会角色迁移,告别数百小时进度丢失 【免费下载链接】EldenRingSaveCopier 项目地址: https://gitcode.com/gh_mirrors/el/EldenRingSaveCopier 艾尔登法环存档管理器是你守护游戏进度的终极解决方案。想象一下…...
为什么92%的DeepSeek团队仍在手动调配额?揭秘v3.2+配额API自动化编排的4个关键接口与避坑清单
更多请点击: https://kaifayun.com 第一章:DeepSeek配额管理的现状困局与演进动因 当前,DeepSeek模型服务在多租户场景下面临日益突出的配额治理挑战。开发者普遍反馈配额分配僵化、实时性差、缺乏细粒度控制能力,导致高优先级任…...
