2021-2-20:请你说说分布式系统 BASE 理论是什么?
BASE 理论是由 Dan Pritchett 在 ACM 上发表的一篇论文中提出的理论。是在 CAP 理论基础上提出的一种更实际的理论指导,和 PACELC 理论是有些相近的地方的。
BASE 是指 基本可用(Basically Available)、软状态( Soft State)、最终一致性( Eventual Consistency)。
对于目前的互联网应用,基本上都不会是单机系统,而是多机分布式系统,所以 CAP 中的 P 是一定要的特性。剩下的 C P 根据实际场景取舍。BASE 就是一种取舍方案的指导。
假设我们微服务系统结构是:
假设我们系统有如下几个业务需求:
- 查询账户余额(涉及账户微服务)
- 商品下单(涉及账户微服务,订单微服务,商品微服务)
- 商品剩余库存(涉及商品微服务)
- 查看用户订单(涉及订单微服务,商品微服务)
1. 基本可用(Basically Available)
基本可用主要包括三点:
- 目前系统能承受的压力范围内的请求是正常处理的,超过范围的可能处理不正常,但是不能因为这些请求影响正常的请求。
- 响应时间正常,在压力大的时候,响应时间可能增长,但是不能超过一定时间
- 可以忍受一定的功能损失,在某些系统出问题的时候,其他系统应该保证本身业务接口正常的运行。
1.1. 目前系统能承受的压力范围内的请求是正常处理的
在双 11 的时候,用户量会突然增高,并且这个量很难预测,尤其是商品下单的业务压力会增大很多,可能超过系统的极限。在超过系统极限的时候,可能会导致整个系统都不可用(例如超过超时极限导致很多请求在队列排队导致后续请求也排队从而雪崩),这是不可取的。
所以,一般会考虑动态扩容,根据业务压力,进行相应的系统微服务的扩容。并且由于动态扩容一般具有滞后性,还需要加上限流器,对某些敏感业务请求根据微服务数量进行动态限制,防止雪崩的出现。
1.2. 响应时间正常
在闲时,用户请求下单可能是毫秒级返回,在系统压力大的时候,这个响应时间可以适当加大,例如 3s 返回。但是这个响应超时时间不要设置太长,第一影响用户体验,第二会导致更多请求排队。
对于不同的业务接口最好设置不同的响应超时时间,例如查询账户余额超时时间短一些,查看用户订单可以稍微长一些。
可以根据系统接口的平均响应时间,请求的个数,制定系统扩容策略
1.3. 可以忍受一定的功能损失
这个主要在于微服务的拆分,以及服务降级策略
比如现在商品微服务因为压力过大挂了,或者重启,这时候的业务:
- 查询账户余额(涉及账户微服务),这个由于微服务隔离不受影响
- 查询商品剩余库存(涉及商品微服务),这个系统挂了,需要服务降级,例如返回商品库存加载中(前端定时查询),或者商品库存为 0.
- 商品下单,目前不可用
- 查看用户的订单,可能里面的商品信息显示不出来(服务降级),但是订单列表,以及其中的订单金额、交易时间信息等等应该可以展示,而不是整个接口报异常。
2. 软状态(Soft State)
指的是允许系统中的数据存在中间状态,并认为该状态不影响系统的整体可用性,即允许系统在多个不同节点的数据副本存在数据延时。
例如下单,订单可以有 初始化 -> 已冻结金额 -> 已扣库存 -> 已扣款 -> 下单成功 这几个状态,如果扣库存失败则变为 待解冻金额 -> 下单失败 状态,分别对应下单的几个中间逻辑。除了下单成功与下单失败以外,其他的都是软状态,并不是最终状态。基本上所有的软状态都需要对应的补偿任务。有了这些中间状态,即使系统重启,也可以通过这些中间状态补偿重试将下单逻辑走下去。
查询订单的时候,在已冻结金额状态之后的订单就可以展示给用户看了,在下单成功之前,都可以显示为处理中。在扣库存失败之后,可以显示为退款中。
3. 最终一致性(Eventually Consistent)
上面提到的软状态,并不会一直保持在这个软状态,而是最终通过系统正常逻辑或者补偿逻辑走向最终状态,各个节点也会同步这个最终状态,这就是最终一致性。
Werner Vogels针对这个最终一致性,总结了五种实现最终一致性的不同场景方案,分别是:
- Causal consistency(因果一致性)
- Read-your-writes consistency(读你所写一致性)
- Session consistency(会话级别一致性)
- Monotonic read consistency(单调读一致性)
- Monotonic write consistency(单调写一致性)
在实际的实践中,这 5 种设计方案往往会互相结合使用,以构建一个具有最终一致性的分布式系统。
3.1. Causal consistency(因果一致性)
因果关系的意思是进程 A 的修改会通知进程 B,没有因果一致性的就是进程 A 的修改不会通知进程 C。对于有因果关系的进程,他们访问的数据应该是强一致性的,没有这个关系的走的是最终一致性。
举一个例子,用户查看商品库存的请求是非常巨大的,并且能接受一点时间内的不一致。假设为了应对这么大的请求,这个库存在商品微服务实例本地也缓存了一份,并且会随着收到下单请求就会将缓存失效重新获取扣库存后最新的库存量,同时这个缓存 5s 后一定会过期(真正扣库存不会使用这个缓存,这个仅仅展示用)。那么下单请求通过订单微服务 RPC 请求的商品微服务实例上面的库存就是最新的库存,其他实例的库存可能有点滞后性。
3.2. Read-your-writes consistency(读你所写一致性)
进程 A 在更新了数据项之后,总是访问更新的值,永远不会看到旧的值。这是因果一致性模型的一个特例。
3.3. Session consistency(会话级别一致性)
在同一个会话内的修改,是可以立刻读取到最终修改的。在其他会话可能不会立刻读取到。
例如数据库的主从同步,请求在这个会话内写入主数据库,那么主数据库会话能立刻读取到这个修改,根据数据库的双 1 同步配置,默认情况下,只有同步完成后才能读取到这个修改。
3.4. Monotonic read consistency(单调读一致性)
如果一个节点从系统中读取出一个数据项的某个值后,那么系统对于该节点后续的任何数据访问都不应该返回更旧版本的值。
3.5. Monotonic write consistency(单调写一致性)
系统要保证同一个节点的写操作是顺序执行的。
微信搜索“我的编程喵”关注公众号,每日一刷,轻松提升技术,斩获各种offer:
2021-2-20:请你说说分布式系统 BASE 理论是什么?的更多相关文章
- 分布式系统的BASE理论
一.BASE理论 eBay的架构师Dan Pritchett源于对大规模分布式系统的实践总结,在ACM上发表文章提出BASE理论,BASE理论是对CAP理论的延伸,核心思想是即使无法做到强一致性(St ...
- 分布式系统的CAP和BASE理论
1. 背景 网络分区:俗称“脑裂”.当网络发生异常情况,导致分布式系统中部分节点之间的网络延时不断变大,最终导致组成分布式系统的所有节点中,只有部分节点之间能够进行正常通信,而另一些节点则不能. 当网 ...
- 2021.07.20 P3951 小凯的疑惑(最大公因数,未证)
2021.07.20 P3951 小凯的疑惑(最大公因数,未证) 重点: 1.最大公因数 题意: 求ax+by最大的表示不了的数(a,b给定 x,y非负). 分析: 不会.--2021.07.20 代 ...
- 2021.07.20 CF1477A Nezzar and Board(最大公因数,未证)
2021.07.20 CF1477A Nezzar and Board(最大公因数,未证) CF1477A Nezzar and Board - 洛谷 | 计算机科学教育新生态 (luogu.com. ...
- 分布式系统中的CAP原理和BASE理论
CAP是一致性(Consistency).可用性(Availability).分区容忍性(Partition tolerance)的缩写.CAP原理指的是这三个要素最多只能同时实现两点,不可能三者兼顾 ...
- 从分布式一致性谈到CAP理论、BASE理论
问题的提出 在计算机科学领域,分布式一致性是一个相当重要且被广泛探索与论证问题,首先来看三种业务场景. 1.火车站售票 假如说我们的终端用户是一位经常坐火车的旅行家,通常他是去车站的售票处购买车票,然 ...
- 分布式之 BASE理论
------------------------------珍惜眼前的学习机会,当你现在有机会学习各种经验时,一定要倍加珍惜.靠混日子是混不了一辈子的,许多过程都是不能省略的,至少学会这些经验可以让你 ...
- 【分布式】1、CAP原则(CAP定理)、BASE理论
CAP原则又称CAP定理,指的是在一个分布式系统中, Consistency(一致性). Availability(可用性).Partition tolerance(分区容错性),三者不可得兼. CA ...
- 分布式系统理论--CAP理论、BASE理论
问题的提出 在计算机科学领域,分布式一致性是一个相当重要且被广泛探索与论证问题,首先来看三种业务场景. 1.火车站售票 假如说我们的终端用户是一位经常坐火车的旅行家,通常他是去车站的售票处购买车票,然 ...
随机推荐
- Go语言学习笔记(3)——面向对象编程
把存货赶紧更新一波(捂脸) 1. 类型系统 类型系统,就是说一种编程语言怎么设计的它的类型的体系结构. 比如基础类型啊,复合类型啊,一些可以指向任意对象的类型啊,以及类型的语义,面向对象的特性,接口, ...
- JDK-7新特性,更优雅的关闭流-java try-with-resource语句使用
前言 公司最近代码质量整改,需要对大方法进行调整,降低到50行以下,对方法的深度进行降低,然后有些文件涉及到流操作,很多try/catch/finally语句,导致行数超出规范值,使用这个语法可以很好 ...
- 【STM32】串口
一. 串口中断使能问题 错误: 串口只能接收一次数据,从串口助手发第二个数据时接收不到. 分析: 在UART_Receive_IT(huart)函数里,回调函数的上面有如下代码: 这几行代码的作用是关 ...
- Docker下使用centos无法使用systemctl怎么办
提交正在使用的容器: docker commit [ContainerId] 提交停止正在运行无法使用Systemctl的容器: docker stop [ContainerId] 删除这个容器(可选 ...
- c语言实现--顺序表操作
经过三天的时间终于把顺序表的操作实现搞定了.(主要是在测试部分停留了太长时间) 1;线性表顺序存储的概念:指的是在内存中用一段地址连续的存储单元依次存储线性表中的元素. 2;采用的实现方式:一段地址连 ...
- 2019牛客暑期多校训练营(第七场)B Irreducible Polynomial
传送门 题意: 给你一个n次n+1项式(An*X^n+A(n-1)*X^(n-1)...A*X+A0),将系数An都给你,问你这个多项式是不是一个不可约多项式,可约多项式就是类型(x+1)*(x+2) ...
- Codeforces Round #683 (Div. 2, by Meet IT) D. Catching Cheaters (DP)
题意:给你两个字符串,每次取它们的子串C和D,然后求LCS,得到的贡献为\(4*LCS(C,D)-|C|-|D|\),求最大贡献. 题解:首先应该了解\(O(n^2)\)的LCS的dp写法,然后在此基 ...
- hdu5489 Removed Interval
Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) Total Submission ...
- Linux程序设计——Linux基础
1. 什么是Linux 1)Linux系统是一种自由和开放源代码的类UNIX的完整操作系统. 2)林纳斯·本纳第克特·托瓦兹(LinusBenedictTorvalds,1969年~) 3)诞生于19 ...
- k8s二进制部署 - dashboard安装
配置资源清单rbac.yaml apiVersion: v1 kind: ServiceAccount metadata: labels: k8s-app: kubernetes-dashboard ...
