BASE理论之思考
一、什么是BASE理论?
BASE理论是对CAP中一致性和可用性权衡的结果,它的核心思想是:即使无法做到强一致性,但每个应用都可以根据自身业务特点,采用适当的方式来使系统达到最终一致性。
BASE理论包含如下三个元素:
- BA:基本可用;
- S:软状态,状态可以在一段时间内不同步;
- E:最终一致性,在一定的时间窗口内,最终数据达成一致即可。
1.什么是基本可用?
举例说明:
以曾经做过的OJ系统为例,OJ系统一般宕机的原因,主要是很多学员在相同的某个时间段统一提交。那么什么时候大多学员会统一提交呢?
一般刷题的时候,时间不确定,有的人喜欢上午刷题,有的人喜欢晚上刷题。基本上OJ是能够承载着不确定时间的提交。问题提到大多学员会在什么时候统一提交,答案是考试,考试有一定的时间规定,例如120分钟或150分钟等,超过时间规定范围视为放弃考试,一般考试会提交10分钟内交卷,而这个10分钟承载着大量的学员提交,而这个大量提交不亚于电商秒杀商品。大量的学员提交,会造成系统一度假死状态,即不能正常对外提供服务,通常我们的做法是弹性伸缩,所谓弹性伸缩就是每到考试的时候,服务器会自动根据学员提交的情况来决定是否创建更多的实例,通过创建更多的实例来平衡服务压力。但有些时候并不是创建更多的实例就能应对的,例如12306抢票,全国人民抢票回家,针对这样的场景,不仅仅是加机器来横向扩容保证服务可用,还得服务将降级处理,所谓服务降级分为两个层面,一个是延迟服务,另一个是暂停目前用不到的服务把资源给优先级高的服务,以此来达到服务基本可用的目的。
2.什么是软状态?
举例说明:
以批量导入大量的历史数据为例,成千上万的Excel文件,里面装有上亿的数据,针对这些数据,系统使用人员在导入数据的过程中,总希望导入一个能够马上得到实时反馈(成功了多少,失败了多少,失败的原因是什么),但从实际中来看,几百万条数据插入到数据库,肯定会消耗数据库资源,一定程度上降低数据库性能,使得其它应用服务受到一定程度上的影响。以我上家公司的解决办法就是延迟插入,首先用户在导入数据的时候,我们会马上提示,数据正在导入中,导入成功后会给该用户发送手机短信或者是邮件,但其实数据正在导入中并没有马上导入,而是进入到一个数据导入任务队列中,排队执行,先进先出,当执行到该任务时,数据任务导入队列会集中多个服务器进行数据导入,分批次导入,这样一来效率高的多。当然了,这样一来,用户不能马上看到数据,但这在一定程度上提高了系统整体可用性,避免因为数据导入而影响对外的正常服务,正好符合软状态,即数据状态可以在一段时间内不同步。
3.什么是最终一致性?
举例说明:
以很久以前我写的一个博客爬虫为例,博客爬虫分别是有三个,一个思否爬虫,一个是CSDN爬虫,最后是博客园爬虫,三个系统均是一个小的SpringBoot微服务,我的主服务仍然是博客系统,爬虫数据抓取并实时入库,会在一定程度上导致我的主博客系统访问缓慢,原因是因为爬虫应用抓取数据并实时入库,性能在数据库上,后来我想了一个办法将爬虫数据库放在阿里云的RDS上,每当晚上的23点到第二天的5点,这个时间段,爬虫会将爬虫数据库上面的数据迁移到我的主博客系统上。
以此来保证数据的最终一致性,也就是我不一定要数据马上入库能看到效果,我可以允许一定的延迟时间,只要最终某个时间段我能看到大量的数据即可,当时做这个的目的在于那个时候研究数据库SQL优化,在研究SQL优化层面,我需要造一批数据,但我不喜欢假数据,于是通过爬虫抓取一些真实的数据,这些真实的数据主要为我个人服务,一方面作为学习的素材,另外一方面可以基于真实的内容做一些数据分析。
二、为什么会产生BASE理论?
新的理论的产生总是为了改进和完善旧有的理论,但本质上仍然变化不大(这也是左耳朵耗子为什么着重说要注重基本功,也包括我的导师以及老J也曾说过多次)。
例如:
从单体应用到分布式微服务应用、从CAP理论到BASE理论、从前后端不分离到前后分离等,就很好的说明了这一点。
BASE理论之思考的更多相关文章
- CAP理论和BASE理论及数据库的ACID中关于一致性及不同点的思考
CAP定理又被称作是布鲁尔定理,是加州大学伯克利分销计算机科学家里克在2000年提出,是分布式理论基础. CAP:是分布式系统的理论基础 [一致性 可用性 分区容错性] BASE理论是对CAP中 ...
- 【分布式】1、CAP原则(CAP定理)、BASE理论
CAP原则又称CAP定理,指的是在一个分布式系统中, Consistency(一致性). Availability(可用性).Partition tolerance(分区容错性),三者不可得兼. CA ...
- CAP原则(CAP定理)、BASE理论
CAP原则又称CAP定理,指的是在一个分布式系统中, Consistency(一致性). Availability(可用性).Partition tolerance(分区容错性),三者不可得兼. CA ...
- 关于分布式存储系统中-CAP原则(CAP定理)与BASE理论比较
CAP原则又称CAP定理,指的是在一个分布式系统中, Consistency(一致性). Availability(可用性).Partition tolerance(分区容错性),三者不可得兼. CA ...
- 差点跪了!阿里3面真题:CAP和BASE理论了解么?可以结合实际案例说下不?
本文节选自我开源的 JavaGuide :https://github.com/Snailclimb/JavaGuide (Github标星92k+!一份涵盖大部分 Java 程序员所需要掌握的核心知 ...
- 从分布式一致性谈到CAP理论、BASE理论
问题的提出 在计算机科学领域,分布式一致性是一个相当重要且被广泛探索与论证问题,首先来看三种业务场景. 1.火车站售票 假如说我们的终端用户是一位经常坐火车的旅行家,通常他是去车站的售票处购买车票,然 ...
- CAP原理、一致性模型、BASE理论和ACID特性
CAP原理 在理论计算机科学中,CAP定理(CAP theorem),又被称作布鲁尔定理(Brewer's theorem),它指出对于一个分布式计算系统来说,不可能同时满足以下三点: 一致性(Con ...
- CAP和BASE理论
详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcyt370 1. CAP理论 2000年7月,加州大学伯克利分校的Eric Bre ...
- Zookeeper笔记1-CAP/BASE理论
分布式系统八大谬论: 1.网络相当可靠 2.延迟为0 3.传输带宽是无限的 4.网络相当安全. 5.拓扑结构不会改变 6.必须要有一名管理员 7.传输成本为0 8.网络同质化. 分布式最常出现的问题: ...
随机推荐
- BLUENRG-LP 学习笔记
在学习 BLUENRG-LP 的过程中,及时地把碰到的问题记录下来,并作解答,形成本文档. 该文档会时时更新,并且当某些章节内容过多时,会独立出来,形成新的文章. BLUENRG-LP 的特性 芯片内 ...
- Python 基础教程 —— 网络爬虫入门篇
前言 Python 是一种解释型.面向对象.动态数据类型的高级程序设计语言,它由 Guido van Rossum 于 1989 年底发明,第一个公开发行版发行于 1991 年.自面世以后,Pytho ...
- hdu4885 有 限制的最短路
题意: 给你起点终点,和一些加油站,和每次加油后的最大行驶距离,问你从起点到终点最少加油次数,要求两点之间必须走直线,见到加油站必须加油,也就是说如果想从a走到b,那么a,b连线上的加油站 ...
- 使用BurpSuite抓取HTTPS网站的数据包
昨天面试,技术官问到了我如何使用BurpSuite抓取https网站的数据包,一时间没能回答上来(尴尬!).因为以前https网站的数据包我都是用Fiddler抓取的,Fiddlert自动帮我们配置好 ...
- Portswigger web security academy:SQL injection
Portswigger web security academy:SQL injection 目录 Portswigger web security academy:SQL injection SQL ...
- [BUUCTF-Pwn]刷题记录1
[BUUCTF-Pwn]刷题记录1 力争从今天(2021.3.23)开始每日至少一道吧--在这里记录一些栈相关的题目. 最近更新(2021.5.8) 如果我的解题步骤中有不正确的理解或不恰当的表述,希 ...
- 【python】Leetcode每日一题-螺旋矩阵
Leetcode每日一题-螺旋矩阵 [题目描述] 给你一个 m 行 n 列的矩阵 matrix ,请按照 顺时针螺旋顺序 ,返回矩阵中的所有元素. 示例1: 输入:matrix = [[1,2,3], ...
- 浅谈自动特征构造工具Featuretools
简介 特征工程在机器学习中具有重要意义,但是通过手动创造特征是一个缓慢且艰巨的过程.Python的特征工程库featuretools可以帮助我们简化这一过程.Featuretools是执行自动化特征工 ...
- c语言编程学习之字符串
字符串字面量与字符变量 1.字符串字面量 字符串字面量是一对双引号括起来的字符序列.当c语言编译器在程序中遇到长度为n的字符串字面量时,它会为字符串字面量分配长度为n+1的内存空间.这块内存空间用来存 ...
- Java线程池的工作流程
线程池刚被创建的时候,只是向系统里申请一个用于执行流程队列和管理线程池的线程资源.在调用execute()添加一个任务时,线程池会按照以下流程执行: 1.如果正在运行的线程数少于corePoolSiz ...