读书笔记--分布式架构的异步化和缓存技术原理及应用场景
本篇是在上一篇的基础上,主要对分布式应用架构下的异步化机制和缓存技术进行学习,主要记录和思考如下,供大家学习参考。大家知道原来传统的单一WAR应用中,由于所有数据都在同一个数据库中,因此事务问题一般借助数据库事务来解决,但是对于分布式架构下的应用系统来说,事务性问题就无法采用这种方式了,否则会出现数据库单点问题,而且随着应用范围和用户量的增大,需要通过分布式异步化机制来解决系统处理性能和吞吐率下降等问题,以及各大平台的直播促销活动带来的瞬时流量等问题。本文介绍的柔性事务、两阶段/三阶段提交、消息服务实现分布式事务处理、缓存技术支撑各种大促秒杀场景的稳定、可靠的实施,那分布式架构下的事务性问题该如何解决呢?如何借助缓存技术来支撑目前比较流行的秒杀活动、抖音直播促销活动等。
一、分布式事务相关的几个业务概念术语
1.事务和柔性事务
传统的事务主要通过数据库事务来保证业务的一致性,核心就是实现了ACID(原子性、一致性、隔离性和持久性),表示一个事务包含的所有逻辑处理都作用于数据库上,只有这个事务的所有操作都成功,才会永久更新到数据库,任何一个操作失败,对数据库修改都会失效。
柔性事务是在互联网场景或分布式领域提出的,主要有两个理论:CAP和BASE,CAP理论认为一个分布式系统最多只能同时满足一致性(Consistency)、可用性(Availability)和分区容错性(Partition tolerance)中的其中两项。BASE是CAP理论的延伸,包括基本可用(Basically Available)、柔性状态(Soft State)和最终一致性(Eventual Consistency),允许一定时间内不同节点的数据不一致,但要求实现数据的最终一致机制,目的是为了实现较高的可用性,因此,高可用=系统构建在多机=分布式系统,高性能=分布式系统的副产品。
2.业务流程异步化
企业在做共享服务平台建设过程中,各个业务平台不断建设沉淀并提供一些可共享给外部的专业服务,这些服务组合起来就是一个或一类业务场景,但这些服务之间不可能都顺序同步执行,很多服务都是异步调用方式,而且同步执行将导致调用时间比较长影响用户体验,同时长时间占用资源导致系统的吞吐量下降。因此就需要将业务流程中的各个业务逻辑通过异步化方式进行并行处理,相当于同步执行的异步化处理,这样既降低了处理时间,也提升了吞吐量和并发处理效率,目前主要通过消息队列来实现。比如网上订单交易业务流程包括订单交易开始、库存检查、库存预减、订单生成、支付生成等,其中的订单生成通过消息中间件服务可拆分为订单日志、支付生成等。
3.数据库事务异步化
核心就是将大事务拆分为小事务,降低数据库资源的长时间占用导致的数据库瓶颈,最终提升系统的吞吐量和事务操作响应时间。比如还款业务流程拆分为还款开始、还款计算、还款计划分派、还款计划处理和详单处理等。
4.柔性事务中的两阶段提交(2PC)和三阶段提交(3PC)
在分布式系统中,用户在下单时,需要同时创建订单信息和减库存的操作,然而创建订单信息和减库存是分布在不同服务器和不同数据库中的,这种情况下只能借助分布式事务介入,保证所有操作,要么一起提交,要么一起回滚,如下图所示。

两阶段提交(2PC,2 Phase Commit):一种分布式事务协议,确保所有参与者在提交或回滚事务时都处于一致的状态。
1)准备阶段(prepare phase):在这个阶段,事务协调者(Transaction Coordinator)向所有参与者(Transaction Participant)发出准备请求,询问它们是否准备好提交事务。参与者执行所有必要的操作,并回复协调者是否准备好提交事务。如果所有参与者都回复准备好提交事务,协调者将进入下一个阶段。如果任何参与者不能准备好提交事务,协调者将通知所有参与者回滚事务。
2)提交阶段(commit phase):在这个阶段,如果所有参与者都已准备好提交事务,则协调者向所有参与者发送提交请求。参与者执行所有必要的操作,并将其结果记录在持久性存储中。一旦所有参与者都已提交事务,协调者将向它们发送确认请求。如果任何参与者未能提交事务,则协调者将通知所有参与者回滚事务。
两阶段提交面临的问题:
2PC 协议可确保分布式事务的原子性和一致性,但是其效率较低,可能会出现阻塞等问题。
1)同步阻塞问题:执行过程中,所有参与节点都是事务阻塞型的。当参与者占有公共资源时,其他第三方节点访问公共资源不得不处于阻塞状态。也就是说从投票阶段到提交阶段完成这段时间,资源是被锁住的。
2)单点故障:由于协调者的重要性,一旦协调者发生故障。参与者会一直阻塞下去。尤其在第二阶段,协调者发生故障,那么所有的参与者还都处于锁定事务资源的状态中,而无法继续完成事务操作。
3)数据不一致问题:在 2PC 最后提交阶段中,当协调者向参与者发送 commit 请求之后,发生了局部网络异常或者在发送 commit 请求过程中协调者发生了故障,这会导致只有一部分参与者接受到了 commit 请求。而在这部分参与者接到 commit 请求之后就会执行 commit 操作。但是其他部分未接到 commit 请求的机器则无法执行事务提交,于是整个分布式系统便出现了数据不一致性的现象。
三阶段提交(3PC,3 Phase Commit):3PC是在 2PC 协议的基础上添加了一个额外的阶段来解决 2PC 协议可能出现的阻塞问题。
1)CanCommit 阶段(询问阶段):在这个阶段,事务协调者(Transaction Coordinator)向所有参与者(Transaction Participant)发出 CanCommit 请求,询问它们是否准备好提交事务。参与者执行所有必要的操作,并回复协调者它们是否可以提交事务。
2)PreCommit 阶段(准备阶段):如果所有参与者都回复可以提交事务,则协调者将向所有参与者发送PreCommit 请求,通知它们准备提交事务。参与者执行所有必要的操作,并回复协调者它们是否已经准备好提交事务。
3)DoCommit 阶段(提交阶段):如果所有参与者都已经准备好提交事务,则协调者将向所有参与者发送DoCommit 请求,通知它们提交事务。参与者执行所有必要的操作,并将其结果记录在持久性存储中。一旦所有参与者都已提交事务,协调者将向它们发送确认请求。如果任何参与者未能提交事务,则协调者将通知所有参与者回滚事务。
3PC相较于2PC的优点:
3PC引入了超时机制,同时在协调者和参与者中都引入超时机制(2PC 只有协调者有超时机制);
3PC 相比于 2PC 增加了 CanCommit 阶段,可以尽早的发现问题,从而避免了后续的阻塞和无效操作,3PC 协议能够更快地执行提交或回滚事务。也就是说,3PC 相比于 2PC,因为引入了超时机制,所以发生阻塞的几率变小了;同时 3PC 把之前 2PC 的准备阶段一分为二,变成了两步,这样就多了一个缓冲阶段,保证了在最后提交阶段之前各参与节点的状态是一致的。
5.数据一致性问题和解决方案
3PC 虽然可以减少同步阻塞问题和单点故障问题,但依然存在数据一致性问题(概率很小),而解决数据一致性问题的方案有很多,常见的有Paxos算法或柔性事物机制等。
1)Paxos 算法:Paxos 算法是一种基于消息传递的分布式一致性算法。
Paxos 算法是一种分布式共识算法,用于在分布式系统中实现数据的一致性和共识,保证分布式系统中不同节点之间的数据同步和一致性。 Paxos 算法由三个角色组成:提议者、接受者和学习者。当一个节点需要发起一个提议时,它会向其他节点发送一个提议,接受者会接收到这个提议,并对其进行处理,可能会拒绝提议,也可能会接受提议。如果有足够多的节点接受了该提议,那么提议就会被确定下来,并且通知给所有学习者,最终所有节点都会达成共识。
2)柔性事务:允许一定时间内不同节点的数据不一致,但要求最终一致的机制。柔性事物有 TCC 补偿事物、可靠消息事物(MQ 事物)等。比如阿里的支付宝XTS框架、TXC事务等。
二、柔性事务如何解决分布式事务问题
1.日志补偿机制:类似于传统的数据库,原子性主要通过日志保证,事务日志记录了参与者信息、开始和结束状态等,参与者需要根据重做或回滚REDO/UNDO日志,实现数据恢复到一致状态,根据事务的当前执行状态,重试异常步骤或回滚前序步骤。
2.可靠消息传递:在分布式环境下,节点之间的消息传递有成功、失败和不知道成功还是失败三种状态,这种情况下一般采取消息至少投递一次,但可能投递多次,可能存在网络通信危险期(比如收不到回应的原因是请求没有成功发送到服务器,服务器处理完成后的回应无法传回请求方)。
3.实现无锁机制:解决性能瓶颈和吞吐率问题是采取无锁机制实现事务隔离,主要有避免事务进入回滚、辅助业务变化明细表而不直接对原始数据库进行修改操作(只有用户付款成功采取更新库存数据等)和乐观锁(通过数据版本号方式实现数据更新操作,只有版本号一致才做更新操作等),乐观锁需要在应用中实现,需要所有应用都实现数据的存储逻辑机制,一般的数据应用的共享服务中心层统一实现。
三、阿里实现的柔性事务解决方案有哪些?
1.消息分布式事务:通过异步消息队列方式实现分布式事务,大大提升了整个业务处理的吞吐率和响应时间,这些异步消息同样起到检查点作用,比如互联网订单交易流程可以从下单开始拆分为库存、支付宝、交易等,但这种方式只能让开发人员全面了解业务并通过正向补偿来实现。
2.支付宝XTS框架:基于BASE实现两阶段提交分布式事务,保证分布式环境下的高可用和数据一致性要求,支持事务的正向和反向补偿,这种方案需要开发人员根据该框架,负责实现XTS提供的接口,以实现XTS框架对事务参与者的事务协调和控制,包括TCC阶段,具体如下。
Try:主要对系统进行检测及资源预留
Confirm:主要对业务系统做确认提交,默认Confirm阶段不会出错,只有Try成功,Confirm一定成功。
Cancel:主要在业务执行错误时需要回滚的状态下,执行业务取消,预留资源释放等。
3.TXC架构事务服务:同样基于BASE实现两阶段提交分布式事务,全面支持分布式数据库事务、多库事务、消息事务、服务链路调用事务基各种组合场景下的事务,包括事务协调者(TXC Server)、事务发起者(Client)、事务提供者()、资源管理器(Resource Manger)等。
四、缓存技术及应用场景
缓存是另一项实现系统更好处理性能和更高吞吐率的技术,我们知道内存操作时间是纳秒级、SSD硬盘操作时间是微妙级,随着业务范围和用户量的增大,缓存技术或平台在业务场景中越来越重要的角色,核心缓存产品有阿里的Tair,开源的Redis等。
1.小库存商品的秒杀场景:类似于双11秒杀购物节,这种场景需要实现商品的定时上架、商品色瞬时售空等,需要通过库存的乐观锁实现库存数量的更新操作,一般通过缓存服务器缓存商品的基本信息,只有在最终下单后才需要对数据库进行库存更新访问操作。
2.大库存商品的大促场景:类似于小库存商品描述场景,需要缓存商品的基本信息,同时将订单交易创建环节中对原本商品数据库的库存信息操作替换为对缓存服务中运行,实现纳秒级的数据更新处理。
相关文章:
读书笔记--分布式架构的异步化和缓存技术原理及应用场景
本篇是在上一篇的基础上,主要对分布式应用架构下的异步化机制和缓存技术进行学习,主要记录和思考如下,供大家学习参考。大家知道原来传统的单一WAR应用中,由于所有数据都在同一个数据库中,因此事务问题一般借助数据库事…...
售后板子HDMI无输出分析
问题: 某产品售后有1例HDMI无输出。 分析: 1、测试HDMI的HPD脚(HDMI座子的19pin),测试电压4.5V,属于正常。 2、用万用表直流电压档,测试HDMI的3对数据脚和1对时钟脚(板子通过HDM…...
python3处理表格常用操作
使用pandas库读取excel文件 import pandas as pd data pd.read_excel(D:\\飞书\\近一年用量.xlsx)指定工作表 import pandas as pd data pd.read_excel(D:\\飞书\\近一年用量.xlsx, sheet_nameSheet1)读取日期格式 data pd.read_excel(example.xlsx, parse_dates[Date])添…...
AUX接口(Auxiliary Port)
AUX接口(Auxiliary Port)是网络设备(如路由器、交换机等)上的一个辅助端口,主要用于设备的配置、管理和维护。以下是关于AUX接口的一些关键点: ### 1. **功能** - **设备配置**:通过AUX接口连接…...
计算机毕业设计Python+Vue.js游戏推荐系统 Steam游戏推荐系统 Django Flask 游 戏可视化 游戏数据分析 游戏大数据 爬虫
温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 作者简介:Java领…...
【梦想终会实现】Linux驱动学习5
加油加油坚持住! 1、 Linux驱动模型:驱动模型即将各模型中共有的部分抽象成C结构体。Linux2.4版本前无驱动模型的概念,每个驱动写的代码因人而异,随后为规范书写方式,发明了驱动模型,即提取公共信息组成一…...
Spring 核心技术解析【纯干货版】-Spring 数据访问模块 Spring-Jdbc
在 Spring 框架中,有一个重要的子项目叫做 spring-jdbc。这个模块提供了一种方 便的编程方式来访问基于 JDBC(Java数据库连接)的数据源。本篇博客将详细解析 Spring JDBC 的主要组件和用法,以帮助你更好地理解并使用这个强大的工具…...
Docker 安装详细教程(适用于CentOS 7 系统)
目录 步骤如下: 1. 卸载旧版 Docker 2. 配置 Docker 的 YUM 仓库 3. 安装 Docker 4. 启动 Docker 并验证安装 5. 配置 Docker 镜像加速 总结 前言 Docker 分为 CE 和 EE 两大版本。CE即社区版(免费,支持周期7个月)…...
Mac本地部署DeekSeek-R1下载太慢怎么办?
Ubuntu 24 本地安装DeekSeek-R1 在命令行先安装ollama curl -fsSL https://ollama.com/install.sh | sh 下载太慢,使用讯雷,mac版下载链接 https://ollama.com/download/Ollama-darwin.zip 进入网站 deepseek-r1:8b,看内存大小4G就8B模型 …...
《Angular之image loading 404》
前言: 千锤万凿出深山,烈火焚烧若等闲。 正文: 一。问题描述 页面加载图片,报错404 二。问题定位 页面需要加载图片,本地开发写成硬编码的形式请求图片资源: 然而部署到服务器上报错404 三。解决方案 正确…...
JavaScript前后端交互-AJAX/fetch
摘自千峰教育kerwin的js教程 AJAX 1、AJAX 的优势 不需要插件的支持,原生 js 就可以使用用户体验好(不需要刷新页面就可以更新数据)减轻服务端和带宽的负担缺点: 搜索引擎的支持度不够,因为数据都不在页面上…...
ZooKeeper单节点详细部署流程
ZooKeeper单节点详细部署流程 文章目录 ZooKeeper单节点详细部署流程 一.下载稳定版本**ZooKeeper**二进制安装包二.安装并启动**ZooKeeper**1.安装**ZooKeeper**2.配置并启动**ZooKeeper** ZooKeeper 版本与 JDK 兼容性3.检查启动状态4.配置环境变量 三.可视化工具管理**Zooke…...
流浪地球发动机启动问题解析与实现
目录 引言问题分析 2.1 发动机启动状态管理 2.2 手动启动与关联启动逻辑 2.3 最晚启动发动机的确定Python 实现 3.1 代码实现 3.2 <...
Java 注解使用教程
简介 Java 1.5 引入了注解,现在它在 Java EE 框架(如 Hibernate、Jersey 和 Spring )中被大量使用。Java 注释是该语言的一个强大特性,用于向 Java 代码中添加元数据。它们不直接影响程序逻辑,但可以由工具、库或框架…...
网络安全学习
博客目录 1.Ddos 攻击2.SYN Flood3.如何应对 Ddos 攻击4.Xss 漏洞5.越权访问漏洞6.水平越权与垂直越权7.水平越权8.垂直越权 1.Ddos 攻击 DDos 全名 Distributed Denial of Service,翻译成中文就是分布式拒绝服务。指的是处于不同位置的多个攻击者同时向一个或数个…...
4 前端前置技术(上):AJAX技术、Axios技术(前端发送请求)
文章目录 前言一、Ajax技术(从服务端获取数据,发送各种请求)0 接口文档管理:使用apipost等接口测试软件创建接口便于前端后端分离测试1 基本概念2 原生Ajax使用示例(几年前的早期用法) 二、 Axios技术(对原…...
2022年全国职业院校技能大赛网络系统管理赛项模块A:网络构建(样题3)-网络部分解析-附详细代码
目录 附录1:拓扑图 附录2:地址规划表 1.SW1 2.SW2 3.SW3 4.SW4 5.SW5 6.SW6 7.SW7 8.R1 9.R2 10.R3 11.AC1 12.AC2 13.AP2 14.AP3 15.EG1 16.EG2 附录1:拓扑图 附录2:地址规划表 设备...
ASP.NET Core中间件的概念及基本使用
什么是中间件 中间件是ASP.NET Core的核心组件,MVC框架、响应缓存、身份验证、CORS、Swagger等都是内置中间件。 广义上来讲:Tomcat、WebLogic、Redis、IIS;狭义上来讲,ASP.NET Core中的中间件指ASP.NET Core中的一个组件。中间件…...
每日Attention学习22——Inverted Residual RWKV
模块出处 [arXiv 25] [link] [code] RWKV-UNet: Improving UNet with Long-Range Cooperation for Effective Medical Image Segmentation 模块名称 Inverted Residual RWKV (IR-RWKV) 模块作用 用于vision的RWKV结构 模块结构 模块代码 注:cpp扩展请参考作者原…...
使用jmeter进行压力测试
使用jmeter进行压力测试 jmeter安装 官网安装包下载,选择二进制文件,解压。 tar -xzvf apache-jmeter-x.tgz依赖jdk安装。 yum install java-1.8.0-openjdk环境变量配置,修改/etc/profile文件,添加以下内容。 export JMETER/…...
OkHttp 中实现断点续传 demo
在 OkHttp 中实现断点续传主要通过以下步骤完成,核心是利用 HTTP 协议的 Range 请求头指定下载范围: 实现原理 Range 请求头:向服务器请求文件的特定字节范围(如 Range: bytes1024-) 本地文件记录:保存已…...
数据库分批入库
今天在工作中,遇到一个问题,就是分批查询的时候,由于批次过大导致出现了一些问题,一下是问题描述和解决方案: 示例: // 假设已有数据列表 dataList 和 PreparedStatement pstmt int batchSize 1000; // …...
CSS设置元素的宽度根据其内容自动调整
width: fit-content 是 CSS 中的一个属性值,用于设置元素的宽度根据其内容自动调整,确保宽度刚好容纳内容而不会超出。 效果对比 默认情况(width: auto): 块级元素(如 <div>)会占满父容器…...
HDFS分布式存储 zookeeper
hadoop介绍 狭义上hadoop是指apache的一款开源软件 用java语言实现开源框架,允许使用简单的变成模型跨计算机对大型集群进行分布式处理(1.海量的数据存储 2.海量数据的计算)Hadoop核心组件 hdfs(分布式文件存储系统)&a…...
算法:模拟
1.替换所有的问号 1576. 替换所有的问号 - 力扣(LeetCode) 遍历字符串:通过外层循环逐一检查每个字符。遇到 ? 时处理: 内层循环遍历小写字母(a 到 z)。对每个字母检查是否满足: 与…...
A2A JS SDK 完整教程:快速入门指南
目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库ÿ…...
AI+无人机如何守护濒危物种?YOLOv8实现95%精准识别
【导读】 野生动物监测在理解和保护生态系统中发挥着至关重要的作用。然而,传统的野生动物观察方法往往耗时耗力、成本高昂且范围有限。无人机的出现为野生动物监测提供了有前景的替代方案,能够实现大范围覆盖并远程采集数据。尽管具备这些优势…...
Python+ZeroMQ实战:智能车辆状态监控与模拟模式自动切换
目录 关键点 技术实现1 技术实现2 摘要: 本文将介绍如何利用Python和ZeroMQ消息队列构建一个智能车辆状态监控系统。系统能够根据时间策略自动切换驾驶模式(自动驾驶、人工驾驶、远程驾驶、主动安全),并通过实时消息推送更新车…...
游戏开发中常见的战斗数值英文缩写对照表
游戏开发中常见的战斗数值英文缩写对照表 基础属性(Basic Attributes) 缩写英文全称中文释义常见使用场景HPHit Points / Health Points生命值角色生存状态MPMana Points / Magic Points魔法值技能释放资源SPStamina Points体力值动作消耗资源APAction…...
中科院1区顶刊|IF14+:多组学MR联合单细胞时空分析,锁定心血管代谢疾病的免疫治疗新靶点
中科院1区顶刊|IF14:多组学MR联合单细胞时空分析,锁定心血管代谢疾病的免疫治疗新靶点 当下,免疫与代谢性疾病的关联研究已成为生命科学领域的前沿热点。随着研究的深入,我们愈发清晰地认识到免疫系统与代谢系统之间存在着极为复…...
