点一下关注吧!!!非常感谢!!持续更新!!!

🚀 AI篇持续更新中!(长期更新)

目前2025年06月16日更新到:
AI炼丹日志-29 - 字节跳动 DeerFlow 深度研究框斜体样式架 私有部署 测试上手 架构研究,持续打造实用AI工具指南!📐🤖

💻 Java篇正式开启!(300篇)

目前2025年06月26日更新到:
Java-55 深入浅出 分布式服务 分布式一致性 强一致、弱一致、单调读一致、最终一致
MyBatis 已完结,Spring 已完结,Nginx已完结,Tomcat已完结,分布式服务正在更新!深入浅出助你打牢基础!

📊 大数据板块已完成多项干货更新(300篇):

包括 Hadoop、Hive、Kafka、Flink、ClickHouse、Elasticsearch 等二十余项核心组件,覆盖离线+实时数仓全栈!
目前2025年06月13日更新到:
大数据-278 Spark MLib - 基础介绍 机器学习算法 梯度提升树 GBDT案例 详解

请添加图片描述

一致性3PC(Three-Phase Commit)

概述

3PC(Three-Phase Commit)全称为三阶段提交协议,是二阶段提交协议(2PC)的改进版本。3PC将2PC的提交事务请求过程进一步细分为两个阶段,最终形成由CanCommit、PreCommit和doCommit三个阶段组成的分布式事务处理协议。

协议阶段详解

1. CanCommit阶段(询问阶段)

  • 协调者向所有参与者发送CanCommit请求
  • 参与者检查自身状态,判断是否可以执行事务
  • 参与者回复Yes/No响应(ACK/NACK)
  • 协调者根据响应决定是否进入下一阶段

2. PreCommit阶段(准备阶段)

  • 若全部参与者回复Yes,协调者发送PreCommit请求
  • 参与者执行事务操作但不提交,写入undo/redo日志
  • 参与者锁定相关资源,确保事务可回滚
  • 参与者回复Ack确认准备完成

3. doCommit阶段(提交阶段)

  • 协调者收到所有Ack后发送doCommit请求
  • 参与者正式提交事务
  • 参与者释放资源锁
  • 参与者回复Ack确认提交完成

改进优势

与2PC相比,3PC的主要改进包括:

  1. 增加了CanCommit阶段,提前验证参与者状态
  2. 降低了阻塞风险(引入超时机制)
  3. 提高了系统可用性(部分故障可继续运行)
  4. 减少了协调者单点故障的影响

应用场景

3PC适用于以下分布式系统场景:

  • 数据库集群事务处理
  • 跨服务的事务协调
  • 微服务架构中的Saga模式
  • 需要较高可用性的分布式系统

局限性

尽管3PC有所改进,但仍存在以下问题:

  • 网络分区时可能导致数据不一致
  • 实现复杂度高于2PC
  • 性能开销相对较大
  • 不能完全解决所有分布式一致性问题

在这里插入图片描述

阶段一

● 事务询问:协调者向所有参与者发送一个包含事务内容的canCommit请求,询问是否可以执行事务提交操作,并开始等待各参与者的响应
● 各参与者向协调者反馈事务询问的响应:参与者在接收到来自协调者的包含了事务内容的canCommit请求后,在正常情况下,如果自身认为可以顺利执行事务,则反馈Yes,并进入预备状态,否则反馈No响应。

在这里插入图片描述

阶段二

PreCommit
协调者在得到参与者的响应之后,会根据结果有2种执行操作的情况:执行事务预提交,或者中断事务。
假如所有参与者反馈的都是Yes,那么就会执行事务预提交。

● 发送预提交请求:协调者向所有参与节点发出 preCommit 请求,并进入 prepared 阶段
● 事务预提交:参与者接收到 preCommit 请求后,会执行事务操作,并将 Undo、Redo 信息记录到事务日志中
● 各参与协调者反馈事务执行的结果:若参与者执行成功了事务操作,那么反馈ACK。若任一参与者反馈了No的时候,或者超时之后,协调者无法收到所有参与者的响应,则中断事务

中断事务也分为两个步骤:
● 发送中断请求:协调者向所有参与者发出 abort 请求
● 中断事务:无论是收到来自协调者的abort请求或者等待协调者请求过程中超时,参与者都会中断事务

在这里插入图片描述

阶段三

doCommit

该阶段做真正的事务提交或者完成事务回滚,所有会出现两种情况:

情况一 执行事务提交

● 发送提交请求:进入这一阶段,假设协调者处于正常工作状态,并且它接收到了来自所有参与者ACK响应,那么他将从预提交状态转换为提交状态,并向所有参与者发送doCommit请求
● 事务提交:参与者收到doCommit请求后,会正式执行事务提交操作,并在完成提交之后释放整个事务执行过程中占用的事务资源。
● 反馈事务提交结果:参与者在完成事务提交后,向协调者发送ACK响应
● 完成事务:协调者接收到所有参与者反馈的ACK消息之后,完成事务。

情况二 中断事务

● 发送中断请求:协调者向所有的参与者节点发送abort请求。
● 事务回滚:参与者收到abort请求后,会根据记录的Undo信息来执行事务回滚,并在完成回滚之后释放整个事务执行期间占用的资源
● 反馈事务回滚结果:参与者在完成事务回滚后,向协调者发送ACK消息
● 中断事务:协调者接收到所有参与者反馈的ACK消息后,中断事务

注意:一旦进入阶段三,可能会出现2种故障:
● 协调者出现问题
● 协调者和参与者之间的网络故障

如果出现任意一种情况,最终都会导致参与者无法收到 doCommit 请求 或者 abort 请求,针对这种情况,参与者都会在超时之后,继续进行事务提交

2PC对比3PC

超时机制改进

在2PC(两阶段提交)协议中,只有协调者拥有超时机制。这意味着当协调者在规定时间内没有收到参与者的响应时,会默认事务执行失败。然而,3PC(三阶段提交)对此进行了重要改进:

  1. 参与者超时机制:
    • 每个参与者都设置了超时计时器
    • 如果在CanCommit或PreCommit阶段长时间未收到协调者指令(如网络分区或协调者故障)
    • 参与者会在超时后自动执行本地Commit操作释放资源

实际应用场景示例:
当电商系统处理分布式订单时,如果支付服务(参与者)在PreCommit阶段与订单服务(协调者)失去连接,支付服务会在超时后自动提交本地事务,避免资金长时间冻结。

三阶段设计优势

3PC通过三个阶段的设计提供了更好的可靠性:

  1. CanCommit阶段:

    • 协调者询问参与者是否具备执行事务的条件
    • 参与者检查资源可用性但不锁定资源
    • 类似于"预检查"阶段
  2. PreCommit阶段:

    • 核心缓冲阶段
    • 协调者在收到所有参与者的Yes响应后发送PreCommit请求
    • 参与者执行事务操作但暂不提交
    • 在此阶段确保所有参与者状态一致
  3. DoCommit阶段:

    • 最终提交阶段
    • 协调者确认所有参与者完成PreCommit后发送提交指令

分阶段好处示例:
在银行转账系统中,PreCommit阶段可以确保所有账户的余额检查通过且金额已临时扣减,才会进入最终提交阶段,避免部分账户扣款成功而其他账户失败的情况。

局限性

尽管有上述改进,3PC仍存在以下问题:

  1. 数据不一致的可能性:

    • 在DoCommit阶段若发生网络分区
    • 部分参与者可能收不到提交指令
    • 导致系统部分节点已提交而其他节点未提交
  2. 性能损耗:

    • 额外的通信阶段增加了延迟
    • 不适合对延迟敏感的应用场景
  3. 实现复杂度:

    • 需要更复杂的状态机来处理各阶段异常
    • 增加了系统开发和维护成本

实际案例:
在分布式数据库系统中,即使使用3PC,仍然需要额外的补偿机制(如人工干预或自动修复程序)来处理极端情况下出现的数据不一致问题。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/bicheng/86960.shtml
繁体地址,请注明出处:http://hk.pswp.cn/bicheng/86960.shtml
英文地址,请注明出处:http://en.pswp.cn/bicheng/86960.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

matplotlib 绘制饼图

1、功能介绍: 使用 python 的 matplotlib 库来创建一个简单的饼图。 2、代码部分: import matplotlib.pyplot as plt# 示例数据 labels [A, B, C, D, E] # 类别标签 sizes [15, 30, 45, 5, 5] # 每个类别对应的数值(百分比&#xff09…

用Rust写平衡三进制除法器

1、除法的本质 除法的本质是减法,也就是一个大的数减去一个小的数,比如:10/2,也就是10-2-2-2-2-20,所以商5余0,10/3,也就是10-3-3-31,所以商3余1,这也是很常见的方法,但如…

深入探索WordPress Multisite:构建与管理多站点网络

随着互联网的快速发展,越来越多的企业和个人开始使用内容管理系统来搭建和维护自己的网站。WordPress作为全球最受欢迎的CMS之一,因其强大的功能和灵活性,成为了许多网站管理员的首选平台。而在一些特定需求的场景下,WordPress Mu…

.Net Core 获取文件路径

在 .NET Core 中获取文件路径的方法取决于你要获取的文件的位置和上下文。这里将介绍几种常见的方式来获取文件路径。 1. 获取当前工作目录 你可以使用 Directory.GetCurrentDirectory() 方法来获取当前工作目录的路径: using System; using System.IO; class P…

顺序表整理和单项链表01 day20

二:各个主要函数 一:CreatSeqList SeqList *CreateSeqList(int len); -------------------------------------------------------------/*** brief Create a Seq List object 创建一个顺序表** param n 是顺序表的大小* return SeqList* 指向顺序表的…

电商导购app平台的缓存策略与性能优化方案:架构师的实践经验

电商导购app平台的缓存策略与性能优化方案:架构师的实践经验 大家好,我是阿可,微赚淘客系统及省赚客APP创始人,是个冬天不穿秋裤,天冷也要风度的程序猿! 缓存策略的重要性 在电商导购APP平台中&#xff…

学习C++、QT---12(C++的继承、权限对继承的影响)

每日一言 你的价值,由你自己定义,无需他人评判。 C的继承 直接上案例 继承是什么意思呢,就是我本来这个类我叫他基类、我希望创建我的下一个类有我这之前的类的属性和方法,那么我如果不用继承的话,就需要多写很多一样…

(6)Wireshark的TCP包详解-上篇

1.简介 上一篇中通过介绍和讲解,应该知道要讲解和介绍的内容在哪里了吧,没错就是介绍OSI七层模型的传输层。因为只有它建立主机端到端的连接如:TCP、UDP。 2.TCP是什么? tcp是工作在传输层,也就是网络层上一层的协议。 它是面…

太极八卦罗盘JS绘制

LeaferJS 是一款好用的 Canvas 引擎,通过LeaferJS绘制罗盘案例. https://www.leaferjs.com/ui/guide/ 示例 太极八卦罗盘 直接上代码 <template><div id"LuoPan"></div><div id"info"><p>屏幕宽度: {{ screenWidth }}px<…

Python开源项目月排行 2025年5月

#2025年5月2025年6月1日1scrapy一个开源的、基于 Python 的高性能网络爬虫和数据抓取框架。Scrapy 项目最初由伦敦的网络聚合和电子商务公司 Mydeco 的员工以及乌拉圭蒙得维的亚的网络咨询公司 Insophia 的开发者共同创建。目前&#xff0c;Scrapy 由 Zyte&#xff08;原名 Scr…

Debezium日常分享系列之:在 Kubernetes 中使用 Debezium 的 CDC

Debezium日常分享系列之&#xff1a;在 Kubernetes 中使用 Debezium 的 CDC 架构源数据库创建数据库凭证密钥Debezium 自定义镜像构建并推送镜像Kafka Connect 集群Debezium Postgres 连接器Debezium 创建的 Kafka 主题 Debezium 是一个开源的分布式变更数据捕获 (CDC) 平台。D…

tf serving和torch serve哪个耗时更低

TensorFlow Serving&#xff08;TF Serving&#xff09;和 TorchServe 的耗时对比需结合具体场景&#xff08;如硬件配置、模型类型、优化策略等&#xff09;&#xff0c;以下从多维度分析两者的性能差异及适用场景。 ⏱️ 1. 标准性能基准对比 根据公开压测数据&#xff08;…

Java面试宝典:基础六

133. 二进制小数点位移 答案:C(乘以2) 解析: 原理:二进制小数点右移一位等价于乘以 (2^1)(左移则除以 (2))。示例: 101.1(5.5)右移 → 1011(11)验证:(5.5 \times 2 = 11)说明:位移前:1 0 1 . 1 (值 = 2+2⁰+2⁻ = 5.5) 位移后:1 0 1 1 . (值 = 2+2+2⁰ =…

04-React中绑定this并给函数传参的几种方式

前言绑定 this 的方式一&#xff1a;bind()绑定 this 并给函数传参 的方式二&#xff1a;构造函数里设置 bind()绑定 this 并给函数传参 的方式三&#xff1a;箭头函数【荐】 前言 我们先来看下面这段代码&#xff1a; components/MyComponent.jsx import React from "…

Docker拉取不兼容的镜像解决办法

错误提示如下&#xff1a; WARNING: The requested images platform (linux/amd64) does not match the detected host platform (linux/arm64/v8) and no specific platform was requested295ef35cfefe0dce6904e017e89218695d9a9c092b45496218f4476357be4f9c 这个警告表明你…

android14 未充电状态电量低于15%弹框提示 10%直接关机

上层接收电量变化广播&#xff0c;添加未充电判断&#xff0c;做出弹框或关机动作 SystemUI\src\com\android\systemui\power\PowerUI.java Overridepublic void onReceive(Context context, Intent intent) {String action intent.getAction();if (PowerManager.ACTION_POWE…

ASP.NET Core 中 Kestrel 的应用及在前后端分离项目中的角色

目录 一、Kestrel 基础&#xff1a;轻量级且高性能的 Web 服务器 二、前后端分离项目架构&#xff1a;Vue、.NET Core API、Nginx 与 Kestrel 2.1 交互流程图 2.2 流程详解 三、Kestrel 在架构中的核心作用 四、launchSettings.json 与 Kestrel 配置的关系及底层机制 4.1…

Kotlin 退出循环总结

文章目录 Kotlin 退出循环总结for循环forEach()嵌套for循环lambda函数inline函数 Kotlin 退出循环总结 for循环 for ((index, value) in list.withIndex()) {if (value "c") {break // 退出循环}println("$index - $value") }// 0 - a // 1 - bfo…

再看C语言

目录 与Java的差异化 编程范式 跨平台 编译过程 包管理 基本类型 内存结构 重点掌握 进制、字节与计算 指针 结构体 关键词 动态内存 模块化 高级特性 动态链接 虚拟内存 打包编译 并发编程 现在需要参与到存储软件开发工作&#xff0c;存储层比较接近OS系统…

机器学习入门 | 训练、推理与其他机器学习活动(预处理、测试与评估)

在训练阶段&#xff0c;训练算法通过优化目标/损失函数在训练数据集上的表现&#xff0c;不断更新模型参数θ。在监督学习场景中&#xff0c;训练数据集由输入-标签对&#xff08;真实输出值&#xff09;组成。目标函数应当奖励模型根据训练输入成功预测真实输出的行为&#xf…