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

      本篇是在上一篇的基础上,主要对分布式应用架构下的异步化机制和缓存技术进行学习,主要记录和思考如下,供大家学习参考。大家知道原来传统的单一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.大库存商品的大促场景:类似于小库存商品描述场景,需要缓存商品的基本信息,同时将订单交易创建环节中对原本商品数据库的库存信息操作替换为对缓存服务中运行,实现纳秒级的数据更新处理。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/965963.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【提示词工程】探索大语言模型的参数设置:优化提示词交互的技巧

在与大语言模型(Large Language Model, LLM)进行交互时,提示词的设计和参数设置直接影响生成内容的质量和效果。无论是通过 API 调用还是直接使用模型,掌握模型的参数配置方法都至关重要。本文将为您详细解析常见的参数设置及其应用场景,帮助您更高效地利用大语言模型。 …

(七)QT——消息事件机制&绘图&文件

目录 前言 消息事件机制 (Event System) 绘图 (Graphics & Drawing) 绘图设备 Qt 提供的主要绘图设备 Qt 主要绘图设备的特点 各个绘图设备的详细介绍 文件处理 (File Handling) 总结 前言 QT 是一个非常强大的图形用户界面(GUI)开发框架&…

ChatGPT提问技巧:行业热门应用提示词案例-文案写作

ChatGPT 作为强大的 AI 语言模型,已经成为文案写作的得力助手。但要让它写出真正符合你需求的文案,关键在于如何与它“沟通”,也就是如何设计提示词(Prompt)。以下是一些实用的提示词案例,帮助你解锁 ChatG…

C++服务端开发注意事项总结

文章目录 一、架构设计1. 选择合适的网络框架2. 确定并发模型3. 模块化设计 二、性能优化1. 优化内存管理2. 减少锁的使用3. 优化网络通信 三、安全性1. 输入验证2. 使用安全的通信协议3. 防止拒绝服务攻击(DoS) 四、可维护性1. 日志记录2. 代码注释3. 单…

idea中git的简单使用

提交,推送直接合并 合到哪个分支就到先切到哪个分支

Kubernetes 中 BGP 与二层网络的较量:究竟孰轻孰重?

如果你曾搭建过Kubernetes集群,就会知道网络配置是一个很容易让人深陷其中的领域。在负载均衡器、服务通告和IP管理之间,你要同时应对许多变动的因素。对于许多配置而言,使用二层(L2)网络就完全能满足需求。但边界网关协议(BGP)—— 支撑互联网运行的技术 —— 也逐渐出…

LSSVM最小二乘支持向量机多变量多步光伏功率预测(Matlab)

代码下载:LSSVM最小二乘支持向量机多变量多步光伏功率预测(Matlab) LSSVM最小二乘支持向量机多变量多步光伏功率预测 一、引言 1.1、研究背景与意义 随着全球能源危机和环境问题的日益严重,可再生能源的开发利用成为了世界各国…

docker容器运行时忘了加自动重启命令了,之后如何添加自动重启命令,使其随开机自动重启

要让已有的Docker容器在系统重启后自动启动,可以通过以下步骤设置其重启策略: 步骤 1:查找容器名称或ID docker ps -a找到目标容器的ID或名称。 步骤 2:更新容器的重启策略 使用 docker update 命令直接修改容器的重启策略&am…

第16章 Single Thread Execution设计模式(Java高并发编程详解:多线程与系统设计)

简单来说, Single Thread Execution就是采用排他式的操作保证在同一时刻只能有一个线程访问共享资源。 1.机场过安检 1.1非线程安全 先模拟一个非线程安全的安检口类,旅客(线程)分别手持登机牌和身份证接受工作人员的检查,示例代码如所示。…

深度学习:解码智能的“数字炼金术”

深度学习:解码智能的“数字炼金术” 1943年,当神经科学家沃伦麦卡洛克和数学家沃尔特皮茨在论文中首次提出人工神经元模型时,他们或许没有想到,这个简单的数学公式会在80年后掀起改变人类文明的技术革命。深度学习作为这场革命的…

让文物“活”起来,以3D数字化技术传承文物历史文化!

文物,作为不可再生的宝贵资源,其任何毁损都是无法逆转的损失。然而,当前文物保护与修复领域仍大量依赖传统技术,同时,文物管理机构和专业团队的力量相对薄弱,亟需引入数字化管理手段以应对挑战。 积木易搭…

pytest-xdist 进行多进程并发测试

在自动化测试中,运行时间过长往往是令人头疼的问题。你是否遇到过执行 Pytest 测试用例时,整个测试流程缓慢得让人抓狂?别担心,pytest-xdist 正是解决这一问题的利器!它支持多进程并发执行,能够显著加快测试…

广度优先搜索(BFS)算法详解——以走迷宫问题为例

引言:当算法遇见迷宫 想象你置身于一个复杂的迷宫,如何在最短时间内找到出口?这个问题不仅存在于童话故事中,更是计算机科学中经典的路径搜索问题。本文将带你通过走迷宫问题,深入理解广度优先搜索(BFS&am…

kubeadm构建k8s源码阅读环境

目标 前面看了minikube的源码了解到其本质是调用了kubeadm来启动k8s集群,并没有达到最初看代码的目的。 所以继续看看kubeadm的代码,看看能否用来方便地构建源码调试环境。 k8s源码编译 kubeadm源码在k8s源码库中,所以要先克隆k8s源码。之…

BFS算法篇——广度优先搜索,探索未知的旅程(上)

文章目录 前言一、BFS的思路二、BFS的C语言实现1. 图的表示2. BFS的实现 三、代码解析四、输出结果五、总结 前言 广度优先搜索(BFS)是一种广泛应用于图论中的算法,常用于寻找最短路径、图的遍历等问题。与深度优先搜索(DFS&…

baigeiRSA

baigeiRSA 打开附件有两个: 1.import libnumfrom Crypto.Util import numberfrom secret import flag​size 128e 65537p number.getPrime(size)q number.getPrime(size)n p*q​m libnum.s2n(flag)c pow(m, e, n)​print(n %d % n)print(c %d % c)​​2.n…

脚本一键生成管理下游k8s集群的kubeconfig

一、场景 1.1 需要管理下游k8s集群的场景。 1.2 不希望使用默认的cluster-admin权限的config. 二、脚本 **重点参数: 2.1 配置变量。 1、有单独namespace的权限和集群只读权限。 2、自签名的CA证书位置要正确。 2.2 如果配置错误,需要重新…

camera光心检测算法

1.概要 光心检测算法,基于opencv c实现,便于模组厂快速集成到软件工具中,适用于camera模组厂算法评估组装制程镜头与sensor的偏心程度,便于工程师了解制程的问题找出改善方向。 2.技术介绍 下图为camera模组厂抓取的bayer-raw经过…

基于logback+fastjson实现日志脱敏

一、需求背景 日常工作中,必不可免的会将一些敏感信息,如用户名、密码、手机号、身份证号、银行账号等等打印出来,但往往为了安全,这些信息都需要进行脱敏。脱敏实际就是用一些特殊字符来替换部分值。 JSON 和 JSONObject Fastj…

RC5分组加密算法

目录 (1)RC5密钥扩展算法 (2)RC5加密算法 (3)RC5解密算法 RC5分组加密算法 RC5分组密码算法是1994年RSA实验室的RonaldL.Rivest教授发明的。它是参数可变的分组密码算法,三个可变的参数是&a…