分布式事务理论和解决方案

news2024/9/21 0:42:33

分布式事务理论

在这里插入图片描述

business(下单)远程调用库存(storage),保存订单(order),扣减积分(account),只有这三个步骤全部成功,我们的下订单才算成功。

如果是单体应用,我们将三处代码全部写在一个系统里面,而且我们全部连向的是一个数据库,这样的话我们使用本地事务就可以控制,只要有一个失败则全体回滚。

但是正是由于我们分布式系统的出现,由于我们业务太大,我们不可能将业务全写到一个系统里面,我们就拆分成了好多微服务,比如库存服务、订单服务、用户账户服务,而且每个服务还是连自己的数据库,操作自己的数据,还互相没有关系,
分布式系统之间部署还可能不在一块儿,库存服务在1号机器,订单服务在2号机器,用户账户服务在3号机器,这样我们想要完成下单逻辑,就需要远程调用这三个机器的各个方法,但由于我们分布式系统中经常会出现异常

机器宕机、网络异常、消息丢失、消息乱序、数据错误、不可靠的 TCP、存储数据丢失…

分布式事务是企业集成中的一个技术难点,也是每一个分布式系统架构中都会涉及到的一个东西,特别是在微服务架构中,几乎可以说是无法避免。

分布式事务出现的原因,就是节点之间互相的状态不能同步,包括网络状况互相感知不到。

cap定理(cap和base都是理论)

CAP 原则又称 CAP 定理,指的是在一个分布式系统中

  1. 一致性(Consistency):
    在分布式系统中的所有数据备份,在同一时刻是否同样的值。(等同于所有节点访问同一份最新的数据副本)

  2. 可用性(Availability)
    在集群中一部分节点故障后,集群整体是否还能响应客户端的读写请求。(对数据更新具备高可用性)

  3. 分区容错性(Partition tolerance)
    多数分布式系统都分布在多个子网络。每个子网络就叫做一个区(partition)。
    分区容错的意思是,区间(服务器之间)通信可能失败。

CAP 原则指的是,这三个要素最多只能同时实现两点,不可能三者兼顾。

原因是:
123三台机器,我们让三个节点都保存a数据,这就满足了一致性

假设我们不是由于节点故障而是通信故障,13之间的网线断了,我们保存数据肯定只给某一个机器发了请求,1号机器让23同步,因为13之间网线断了,死活连不上,此时就发生了分区错误
分区错误之后,假设我们想让它满足可用性,我们让3号机器恢复,比如我们负载均衡去3号机器读数据,但由于3号之前通信故障,数据没有同步过来,读到的数据自然就不一样了,所以一满足可用性就发现又不一致了。想要满足一致性,就必须让3号机器不能访问,不能访问就不可用了。所以一致性和可用性只能二选一

在分布式系统中分区容错必须满足,因为网络肯定会出现问题;那么一致性与可用性就只能二选一,满足可用的话就得容忍业务能访问到不一致的数据,满足一致的话,就不能让整个集群可用了,如果让整个集群可用的话,数据就会不一致。

如何取舍

对于多数大型互联网应用的场景,主机众多、部署分散,而且现在的集群规模越来越大,所以节点故障、网络故障是常态,而且要保证服务可用性达到99.99999%(N 个 9),即保证P 和 A,舍弃 C(一致性)。

base理论

是对 CAP 理论的延伸,思想是即使无法做到强一致性(CAP 的一致性就是强一致性),但可以采用适当的采取弱一致性,即最终一致性
BASE 是指

  • 基本可用(Basically Available)

    • 基本可用是指分布式系统在出现故障的时候,允许损失部分可用性(例如响应时间、功能上的可用性),允许损失部分可用性。需要注意的是,基本可用绝不等价于系统不可用。

      • 响应时间上的损失:正常情况下搜索引擎需要在 0.5 秒之内返回给用户相应的查询结果,但由于出现故障(比如系统部分机房发生断电或断网故障),查询结果的响应时间增加到了 1~2 秒。

      • 功能上的损失:购物网站在购物高峰(如双十一)时,为了保护系统的稳定性,部分消费者可能会被引导到一个降级页面。

  • 软状态( Soft State)
    软状态是指允许系统存在中间状态,而该中间状态不会影响系统整体可用性。分布式存储中一般一份数据会有多个副本,允许不同副本同步的延时就是软状态的体现。mysql replication 的异步复制也是一种体现。

  • 最终一致性( Eventual Consistency)
    最终一致性是指系统中的所有数据副本经过一定时间后,最终能够达到一致的状态。弱一致性和强一致性相反,最终一致性是弱一致性的一种特殊情况。

  • 强一致性、弱一致性、最终一致性
    从客户端角度,多进程并发访问时,更新过的数据在不同进程如何获取的不同策略,决定了不同的一致性。对于关系型数据库,要求更新过的数据能被后续的访问都能看到,这是强一致性。如果能容忍后续的部分或者全部访问不到,则是弱一致性。如果经过一段时间后要求能访问到更新后的数据,则是最终一致性

分布式事务解决方案

2PC

  • 基于XA协议的两阶段提交(2PC)
  • 二阶段提交2PC(Two phase Commit)是指,在分布式系统里,为了保证所有节点在进行事务提交时保持一致性的一种算法。
  • 实现思路

有两个角色:协调者 和 参与者

(1)投票阶段:参与者将操作结果通知给协调者

(2)提交阶段:协调者收到参与者的通知后,根据参与者结果决定最终提交还是回滚

  • 举例说明

甲 乙 丙 丁会议

  • 缺陷:

1 强一致性

2 协调者单点故障问题

3 丢失消息

TCC

  • TCC不是强一致性,保证最终一致性

本地消息表

在这里插入图片描述
在这里插入图片描述

  • 执行流程:
    • 订单系统,添加一条订单和一条消息,在一个事务里提交。
    • 订单系统,使用定时任务轮询查询状态为未同步的消息表,发送到 MQ,如果发送失败,就重试发送。
    • 库存系统,接收 MQ 消息,修改库存表,需要保证幂等操作。
    • 如果修改成功,调用 RPC 接口修改订单系统消息表的状态为已完成或者直接删除这条消息。
    • 如果修改失败,可以不做处理,等待重试。
  • 订单系统中的消息有可能由于业务问题会一直重复发送,所以为了避免这种情况可以记录一下发送次数,当达到次数限制之后报警,人工接入处理;库存系统需要保证幂等,避免同一条消息被多次消费造成数据一致。

订单系统中的消息有可能由于业务问题会一直重复发送,所以为了避免这种情况可以记录一下发送次数,当达到次数限制之后报警,人工接入处理;库存系统需要保证幂等,避免同一条消息被多次消费造成数据一致。

todo 这篇文章的知识感觉需要重新消化或者整理感觉

第一,高端技术人才在适合的工作岗位,一定会显出他的价值来,然后在价值体系去评价他。我们可以设一个高端投诉平台,大家有问题就写邮件到这个平台,人力资源去听他倾诉,做成纪要报给有关部门帮助他调整。我们可以安排一些人际理解力强、熟悉华为流程、善于沟通、善于团结人的老员工,到导师部去听群众的声音,调节矛盾。

任正非

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

2024-01-开发技术积累

文章目录 递归删除文件执行任务超时时间读写锁获取异常栈信息通过NIO读取文件单例模式代码NIO管道写文件(来自nacos)NIO读取文件(来自Nacos)spring指定注解扫描 递归删除文件 xxl-job源码 public static boolean deleteRecursively(File root) {if (root ! null && ro…

JAVA中的Stream流的使用详解

1.Stream的介绍 Java 8 API添加了一个新的抽象称为流Stream,可以让你以一种声明的方式处理数据。Stream 使用一种类似用 SQL 语句从数据库查询数据的直观方式来提供一种对 Java 集合运算和表达的高阶抽象。Stream API可以极大提高Java程序员的生产力,让程…

React+Vis.js(04):vis.js设置节点显示图片

文章目录 实现效果关键代码完整代码设置图片边框和背景颜色我们继续以 复仇者联盟为例,来介绍如何实现节点显示 图片。 实现效果 以图片进行节点的显示,使得显示效果更加直观,信息更为明了。 关键代码 在vis.js中,通过属性shape来控制节点显示为图像。 const nodes …

Shire 0.5 发布:构建数据安全 RAG,充分整合研发资产

最近,我们发布了新版本的 Shire,在这个新的发布(Shire 0.5)里,你可以更好地融合本地研发资产,同时构建数据安全 RAG。在这次版本中,我们增加了: 对 SonarQube 的 issue 支持。可以直…

1.反爬虫机制

一、IP 封锁 网站可以检测请求的IP地址,并封锁那些频繁请求的IP,使其无法访问网站。这是一种常见的反爬虫策略,用于防止单个IP地址对服务器造成过大的负载。 解决办法 : 使用代理IP池以避免IP封锁 // 待补充 二、请求头检测(Us…

2024百元学生党蓝牙耳机有哪些?甄选四款精品王炸机型推荐

近年来,随着手机的普及和音乐娱乐的盛行,蓝牙耳机成为越来越多人的选择。蓝牙耳机的优点在于无需使用线缆,方便携带,而且可以随时随地享受音乐或者通话。在市面上,有各种各样的蓝牙耳机可供选择,对于预算有…

Star-CCM+探针查看与创建

在实际应用工况中,数值计算结束后为了产看某个点的标量场或矢量场可以采用探针查看。而在软件中可以通过“,”、“。”快捷键进行创建与查看。两者的区别具体如下所示: 鼠标放在要查看部件的位置,同时点击键盘上的“。”键&#…

神经网络动画讲解 - 神经网络工作流程

神经网络工作流程 神经网络工作流程: 特征分解1(手写数字->简单笔画组合)、特征分解2(简单笔画->最小笔画组合)、特征识别1(最小笔画组合->简单笔画)、特征识别2(简单笔画…

Java 入门指南:迭代器(Iterator)

迭代器 迭代器(Iterator) 是一种行为型设计模式,属于设计模式之一,迭代器模式提供了一种方法来顺序访问一个聚合对象(如List、Set等)中各个元素,而不需要暴露该对象的内部表示。 Iterator 对象…

攻防世界-web题型-6星难度汇总-个人wp

i-got-id-200 这一题很清楚的告诉了考点是什么,就是cgi相关的知识,不过我对这个不了解。。。也不会perl语言,先去网上看看这个东西吧,了解一下 看到一篇挺有意思的视频CGI(通用网关接口)_百度百科 看了这…

MediaTek 天玑9000 旗舰5G,都有哪些突破

天玑9000,是MTK 在2022发布的全新旗舰SOC , 采用台积电4nm制程和Armv9架构,八核CPU。 市场上采用天玑9000的手机有小米12Pro、小米Redmi K50 Pro、Vivo X80等。 今天我们看下这款soc更详细的一些特点介绍。 一、率先采用台积电 4nm 先进制程 业界率先采用台积电 4nm…

传统2D3D视觉分享

哈喽,大家好,本文主要是说明关于【视觉源码小铺】知识星球内的相关内容 视觉源码小铺都有什么内容 IVision拖拽平台&算法 星球内算法(持续更新)

滚雪球学Java(90):Java图形界面新篇章:Swing框架深度解析,真有点东西!

咦咦咦,各位小可爱,我是你们的好伙伴——bug菌,今天又来给大家普及Java SE啦,别躲起来啊,听我讲干货还不快点赞,赞多了我就有动力讲得更嗨啦!所以呀,养成先点赞后阅读的好习惯&#…

解决MySQL的PacketTooBigException异常问题

一、背景 在大数据量导入mysql的时候,提示错误Cause: com.mysql.cj.jdbc.exceptions.PacketTooBigException: Packet for query is too large 原因是MySQL的max_allowed_packet设置最大允许接收的数据包过小引起的,默认的max_allowed_packet如果不设置&…

Stable Diffusion 使用详解(9)--- 艺术字及海报融入

目录 背景 方法一 利用controlNet lineart invert depth 提示词 效果 方法二 准备蒙版 绘制大型场景艺术字 controlnet Lora 模型 效果 PS 融入 背景 如果看过上一期你应该知道如何利用layer diffusion 制作场景动漫海报,其实掌握这个方法后&#xf…

DFS 算法:记忆化搜索

我的个人主页 {\large \mathsf{{\color{Red} 我的个人主页} } } 我的个人主页 往 {\color{Red} {\Huge 往} } 往 期 {\color{Green} {\Huge 期} } 期 文 {\color{Blue} {\Huge 文} } 文 章 {\color{Orange} {\Huge 章}} 章 无 此系列更新频繁,求各位读者点赞 关…

视频号小店:微信生态下的新零售革命者

在数字化浪潮的席卷之下,微信视频号凭借其独特的社交基因和庞大的用户群落,正悄然崛起为新零售战场上的新晋强者。特别是视频号小店体系的创立,为商家打造了一个集商品展现、交易促进与营销策略部署于一体的综合运营平台,实现了业…

网络安全中的人工智能应用

1. 引言 随着网络攻击的复杂性和频率不断增加,传统的安全防护措施逐渐难以应对这些威胁。人工智能(AI)作为一种变革性的技术,正在逐步成为增强网络安全的重要工具。AI通过自动化、智能化的方式,可以有效提高威胁检测、…

【JAVA基础】多态

文章目录 多态向上转型练习题 多态 父类的引用指向子类的对象 public class A {public String name;public int age;public void run(){ //该run()方法被覆盖System.out.println("a跑的快");}public void eat(String name){System.out.println(name"吃的很多&…

从零到一,我的AI绘画赚钱之旅:准大一新生暑假自学成才,月入学费不是梦!

大家好,我是即将步入大学校园的准大一新生。在这个漫长的暑假里,我决定学习一门新技术,充实自己。在一次网上冲浪的过程中,我偶然发现了AI绘画这个神奇的世界。以下是我在暑假期间学习AI绘画的经历,以及我是如何通过它…