Go微服务: 分布式Cap定理和Base理论

分布式中的Cap定理

  • CAP理论
    • C: 一致性,是站在分布式的角度,要么读取到数据,要么读取失败,比如数据库主从,同步时的时候加锁,同步完成才能读到同步的数据,同步完成,才返回数据给程序,这样就能解决数据不一致的问题,简单来说,就是保证数据最新
    • A: 可用性,任何客户端请求,都能得到响应式数据,不会出现响应错误,但可能不包含最新的写入数据,简单来说,就是保证数据不出错
    • P: 分区容错性,由于分布式系统都是通过网络通信的,网络是不可靠的,当任意数量的消息丢失或延迟到达的时候,系统仍然提供服务, 不会挂掉,简单说,就是一直运行,不管内部出现任何数据同步问题,强调的是不挂,但是要保证集群内有足够多的可用节点,所以一般要满足这个P条件
  • CAP理论只有两两相交不能同时满足三点,一般而言,分布式系统要满足P这个要求,就是不能挂掉,所以,要么是CP,要么是AP。而CA类型的就是单体应用,而非分布式应用

Base 理论

  • 这里先看一个场景:有两个人分别是a和b, a在A银行存钱,b在B银行存钱
  • 有一种情况是a给b转账10元,b查询时可能不会及时到账,系统还没有执行完,这样就存在一个中间状态,比如提示1个小时候再查询是否到账,这样就可以从业务层面解决问题
  • 还有一种情况a转了,系统执行了,但是遇到问题了,b没有收到,这时候,a仍然要保持原来的余额,那这时候通知a, 重新转一次账,即可。这一种是银行系统故障问题
  • 为了保持一致性,在高并发的场景中是不可接受的,可以主动提示用户,1小时之后再进行查询,这是一个中间状态,或者设置一个转账中的标识
  • 现在我们思考2个问题,在生产环境中是否可以牺牲可用性?也就是系统不能提供服务了; 是否可以牺牲一致性?也就是数据不一致的问题
  • 我们在分布式服务中就需要做一些取舍,根据自身情况的等级来选择
  • 现在举2个例子:单独的mysql是强一致性,分布式的集群是弱一致性,在强一致性的单独的系统中,基于事务可以回滚;分布式,比如A和B银行,两家银行,都是相互独立的,相互不会被控制,所以是弱一致性
  • 我们现在来看下Base理论的三要素
    • 1 ) 基本可用 Basically Available
    • 系统出现了不可预知的故障,但是能用,相比较正常系统而言会有响应时间上的损失和功能上的损失,比如从原来的 200ms响应到 500ms相应,再比如抢购活动中,抢不到提示稍后再试
    • 2 )软状态 Soft State
    • 也就是可以有一段时间不同步,什么是软状态呢?相对于原子性而言,要求多个节点的数据副本都是一致的,这是一种"硬状态"
    • 软状态是指允许系统中的数据存在中间状态,并认为该状态不影响系统的整体可用性,即允许系统在多个不同的节点的数据副本存在数据延时
    • 3 )最终一致性,Eventually Consistent, 简称 E, 最终数据一致就可以了,而不是时时保持强一致。上面说软状态,其实不可能一直是软状态,必须有个时间期限。在期限过后,应当保证所有副本保持数据一致性,从而达到数据的最终一致性。这个时间期限取决于网络延时、系统负载、数据复制方案设计等因素。A到B银行的转账就是最终一致性的体现
相关推荐
ttwuai4 天前
Go开源后台管理系统推荐:怎么按技术栈和边界比较4个官方仓库?
golang·gin
codeejun4 天前
每日一Go·MySQL-5、锁机制全解析
云原生·golang
Achou.Wang4 天前
k8s中nginx worker process自动设置
后端·golang
Thomas.Sir4 天前
第21课:PyTorch|GPU多卡训练与分布式训练基础【让多卡并行成为你的加速引擎】
人工智能·pytorch·分布式
Cicada1284 天前
库存消息消费的正确性设计——从幂等窗口到批量流水线
分布式·系统架构
ChaITSimpleLove4 天前
云原生性能对决:JDK21虚拟线程+GraalVM vs .NET10/11 技术栈深度对比
微服务·云原生·serverless·graalvm native·native aot·runtime async·.net11/java21
EatFan5 天前
gRPC 为什么比 HTTP+JSON 快?详细讲解gRPC
后端·微服务·grpc
Francek Chen5 天前
【大数据处理与分析】数据仓库Hive:04 数据仓库Hive概述
大数据·数据仓库·hive·hadoop·分布式
Gl�ria5 天前
Hadoop/YARN 集群缩容:下线DN节点
大数据·hadoop·分布式