CAP原理
=====
CAP原理:分布式计算系统不可能同时确保以下三个特性:
-
一致性(consistency)
-
可用性(availability)
-
分区容忍性(partition)
**(1)分区容忍性:**网络可能发生分区,即节点之间的通信不可保障。
大多数分布式系统都分布在多个子网络。每个子网络就叫做一个区(partition)。比如,一台服务器放在中国,另一台服务器放在美国,这就是两个区,它们之间可能无法通信。
上图中,G1 和 G2 是两台跨区的服务器。G1 向 G2 发送一条消息,G2 可能无法收到。系统设计的时候,必须考虑到这种情况。
一般来说,分区容错无法避免,因此可以认为 CAP 的 P 总是成立。CAP 定理告诉我们,剩下的 C 和 A 无法同时做到。
**(2)一致性:**任何操作应该都是原子的,发生在后面的事件能看到前面事件发生导致的结果,这指的是强一致性。
写操作之后的读操作,必须返回该值。举例来说,某条记录是 v0,用户向 G1 发起一个写操作,将其改为 v1。
接下来,用户的读操作就会得到 v1。这就叫一致性。
问题是,用户有可能向 G2 发起读操作,由于 G2 的值没有发生变化,因此返回的是 v0。G1 和 G2 读操作的结果不一致,这就不满足一致性了。
为了让 G2 也能变为 v1,就要在 G1 写操作的时候,让 G1 向 G2 发送一条消息,要求 G2 也改成 v1。
这样的话,用户向 G2 发起读操作,也能得到 v1。
**(3)可用性:**在有限时间内,任何非失败节点都能应答请求。
只要收到用户的请求,服务器就必须给出回应。用户可以选择向 G1 或 G2 发起读操作。不管是哪台服务器,只要收到请求,就必须告诉用户,到底是 v0 还是 v1,否则就不满足可用性。
**一致性和可用性,为什么不可能同时成立?**答案很简单,因为可能通信失败(即出现分区容错)。
如果保证 G2 的一致性,那么 G1 必须在写操作时,锁定 G2 的读操作和写操作。只有数据同步后,才能重新开放读写。锁定期间,G2 不能读写,没有可用性不。
如果保证 G2 的可用性,那么势必不能锁定 G2,所以一致性不成立。
综上所述,G2 无法同时做到一致性和可用性。系统设计时只能选择一个目标。如果追求一致性,那么无法保证所有节点的可用性;如果追求所有节点的可用性,那就没法做到一致性。
应用场景
弱化一致性的场景,例如网站静态页面内容,实时性较弱的查询类数据库等对一致性不敏感的。
弱化可用性的场景,例如银行取款机,对一致性很敏感。
弱化分区容忍性,某些关系型数据库及ZooKeeper主要考虑这种设计。网络可以通过双通道等机制增强可靠性,达到高稳定的网络通信。
ACID原则
======
ACID原则指的是:
-
Atomicity(原子性)
-
Consistency(一致性)
-
Isolation(隔离性)
-
Durability(持久性)
这是比较有名的描述一致性的原则,通常出现在分布式数据库领域。满足一致性需求,但是允许付出可用性的代价。
-
A:每次操作是原子的,要么成功,要么不执行;
-
C:数据库的状态是一致的,无中间状态;
-
I:各种操作之间互不影响;
-
D:状态的改变是持久的,不会失效。
与ACID相对的一个原则是BASE(Basic Availability, Soft-state, Eventual Consistency)原则,牺牲对一致性约束(但实现最终一致性),来换取一定的可用性。
区块链的分布式特性
=========
区块链有一种机制来保护自身的安全性,那就是分布式。相对于用一个中心化的实体来管理区块链网络,区块链采用的是一种peer-to-peer网络,并且所有人都可以加入。当有人加入这个网络时,他就会得到整个区块链的复制。这个人就可以以此来验证是否所有的区块还是合法未篡改的。
那么接下来我们就来看看,当某人创建了一个新的区块时,会发生哪些改变这个新的区块会被发送给网络上的所有人。每个人再验证这个区块以确保这个区块没有被篡改过。如果所有的东西都被检验正确之后,那么每个人就都会把这块新的区块加到自己的区块链上。
我们可以称之为,网络上的所有人达成了「共识」。他们认同网络中那些区块是合法的,哪些是不合法的。那些被篡改过的区块将会被网络上的其他用户拒绝。所以,要成功篡改一个区块链,你需要篡改区块链上的所有区块,重新完成每个区块的工作量证明,并且控制区块链网络中超过50%的用户。
只有这样,你篡改的区块才会被所有人承认。但实际上,这基本上是不可能做得到的!
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)
![不懂分布式系统的核心问题:一致性与共识,还想入门区块链?挖矿?,程序员,区块链](https://imgs.yssmx.com/Uploads/2024/04/848934-8.jpeg)
总结
上述知识点,囊括了目前互联网企业的主流应用技术以及能让你成为“香饽饽”的高级架构知识,每个笔记里面几乎都带有实战内容。
很多人担心学了容易忘,这里教你一个方法,那就是重复学习。
打个比方,假如你正在学习 spring 注解,突然发现了一个注解@Aspect,不知道干什么用的,你可能会去查看源码或者通过博客学习,花了半小时终于弄懂了,下次又看到@Aspect 了,你有点郁闷了,上次好像在哪哪哪学习,你快速打开网页花了五分钟又学会了。
从半小时和五分钟的对比中可以发现多学一次就离真正掌握知识又近了一步。
人的本性就是容易遗忘,只有不断加深印象、重复学习才能真正掌握,所以很多书我都是推荐大家多看几遍。哪有那么多天才,他只是比你多看了几遍书。文章来源:https://www.toymoban.com/news/detail-848934.html
《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》,点击传送门即可获取!
存中…(img-WLA2yewU-1711874827805)]
人的本性就是容易遗忘,只有不断加深印象、重复学习才能真正掌握,所以很多书我都是推荐大家多看几遍。哪有那么多天才,他只是比你多看了几遍书。
《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》,点击传送门即可获取!文章来源地址https://www.toymoban.com/news/detail-848934.html
到了这里,关于不懂分布式系统的核心问题:一致性与共识,还想入门区块链?挖矿?的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!