当前位置: 首页 > news >正文

读书笔记--分布式架构的异步化和缓存技术原理及应用场景

      本篇是在上一篇的基础上,主要对分布式应用架构下的异步化机制和缓存技术进行学习,主要记录和思考如下,供大家学习参考。大家知道原来传统的单一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个月)&#xf…...

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 就可以使用用户体验好(不需要刷新页面就可以更新数据)减轻服务端和带宽的负担缺点: 搜索引擎的支持度不够,因为数据都不在页面上&#xf…...

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 引入了注解&#xff0c;现在它在 Java EE 框架&#xff08;如 Hibernate、Jersey 和 Spring &#xff09;中被大量使用。Java 注释是该语言的一个强大特性&#xff0c;用于向 Java 代码中添加元数据。它们不直接影响程序逻辑&#xff0c;但可以由工具、库或框架…...

网络安全学习

博客目录 1.Ddos 攻击2.SYN Flood3.如何应对 Ddos 攻击4.Xss 漏洞5.越权访问漏洞6.水平越权与垂直越权7.水平越权8.垂直越权 1.Ddos 攻击 DDos 全名 Distributed Denial of Service&#xff0c;翻译成中文就是分布式拒绝服务。指的是处于不同位置的多个攻击者同时向一个或数个…...

4 前端前置技术(上):AJAX技术、Axios技术(前端发送请求)

文章目录 前言一、Ajax技术&#xff08;从服务端获取数据&#xff0c;发送各种请求&#xff09;0 接口文档管理&#xff1a;使用apipost等接口测试软件创建接口便于前端后端分离测试1 基本概念2 原生Ajax使用示例&#xff08;几年前的早期用法&#xff09; 二、 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的核心组件&#xff0c;MVC框架、响应缓存、身份验证、CORS、Swagger等都是内置中间件。 广义上来讲&#xff1a;Tomcat、WebLogic、Redis、IIS&#xff1b;狭义上来讲&#xff0c;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结构 模块结构 模块代码 注&#xff1a;cpp扩展请参考作者原…...

使用jmeter进行压力测试

使用jmeter进行压力测试 jmeter安装 官网安装包下载&#xff0c;选择二进制文件&#xff0c;解压。 tar -xzvf apache-jmeter-x.tgz依赖jdk安装。 yum install java-1.8.0-openjdk环境变量配置&#xff0c;修改/etc/profile文件&#xff0c;添加以下内容。 export JMETER/…...

汽车生产虚拟实训中的技能提升与生产优化​

在制造业蓬勃发展的大背景下&#xff0c;虚拟教学实训宛如一颗璀璨的新星&#xff0c;正发挥着不可或缺且日益凸显的关键作用&#xff0c;源源不断地为企业的稳健前行与创新发展注入磅礴强大的动力。就以汽车制造企业这一极具代表性的行业主体为例&#xff0c;汽车生产线上各类…...

Python基于历史模拟方法实现投资组合风险管理的VaR与ES模型项目实战

说明&#xff1a;这是一个机器学习实战项目&#xff08;附带数据代码文档&#xff09;&#xff0c;如需数据代码文档可以直接到文章最后关注获取。 1.项目背景 在金融市场日益复杂和波动加剧的背景下&#xff0c;风险管理成为金融机构和个人投资者关注的核心议题之一。VaR&…...

C++:多态机制详解

目录 一. 多态的概念 1.静态多态&#xff08;编译时多态&#xff09; 二.动态多态的定义及实现 1.多态的构成条件 2.虚函数 3.虚函数的重写/覆盖 4.虚函数重写的一些其他问题 1&#xff09;.协变 2&#xff09;.析构函数的重写 5.override 和 final关键字 1&#…...

GO协程(Goroutine)问题总结

在使用Go语言来编写代码时&#xff0c;遇到的一些问题总结一下 [参考文档]&#xff1a;https://www.topgoer.com/%E5%B9%B6%E5%8F%91%E7%BC%96%E7%A8%8B/goroutine.html 1. main()函数默认的Goroutine 场景再现&#xff1a; 今天在看到这个教程的时候&#xff0c;在自己的电…...

手机平板能效生态设计指令EU 2023/1670标准解读

手机平板能效生态设计指令EU 2023/1670标准解读 以下是针对欧盟《手机和平板电脑生态设计法规》(EU) 2023/1670 的核心解读&#xff0c;综合法规核心要求、最新修正及企业合规要点&#xff1a; 一、法规背景与目标 生效与强制时间 发布于2023年8月31日&#xff08;OJ公报&…...

C++实现分布式网络通信框架RPC(2)——rpc发布端

有了上篇文章的项目的基本知识的了解&#xff0c;现在我们就开始构建项目。 目录 一、构建工程目录 二、本地服务发布成RPC服务 2.1理解RPC发布 2.2实现 三、Mprpc框架的基础类设计 3.1框架的初始化类 MprpcApplication 代码实现 3.2读取配置文件类 MprpcConfig 代码实现…...

第八部分:阶段项目 6:构建 React 前端应用

现在&#xff0c;是时候将你学到的 React 基础知识付诸实践&#xff0c;构建一个简单的前端应用来模拟与后端 API 的交互了。在这个阶段&#xff0c;你可以先使用模拟数据&#xff0c;或者如果你的后端 API&#xff08;阶段项目 5&#xff09;已经搭建好&#xff0c;可以直接连…...

TCP/IP 网络编程 | 服务端 客户端的封装

设计模式 文章目录 设计模式一、socket.h 接口&#xff08;interface&#xff09;二、socket.cpp 实现&#xff08;implementation&#xff09;三、server.cpp 使用封装&#xff08;main 函数&#xff09;四、client.cpp 使用封装&#xff08;main 函数&#xff09;五、退出方法…...

python打卡第47天

昨天代码中注意力热图的部分顺移至今天 知识点回顾&#xff1a; 热力图 作业&#xff1a;对比不同卷积层热图可视化的结果 def visualize_attention_map(model, test_loader, device, class_names, num_samples3):"""可视化模型的注意力热力图&#xff0c;展示模…...

C# WPF 左右布局实现学习笔记(1)

开发流程视频&#xff1a; https://www.youtube.com/watch?vCkHyDYeImjY&ab_channelC%23DesignPro Git源码&#xff1a; GitHub - CSharpDesignPro/Page-Navigation-using-MVVM: WPF - Page Navigation using MVVM 1. 新建工程 新建WPF应用&#xff08;.NET Framework) 2.…...