大家好,我是徒手敲代码。
写完设计模式之后,就断更了将近两个星期。
可能是一直下雨,湿气太重的原因,睡眠质量不太好,导致精神状态也比较低迷。
接下来会更新分布式系统专题相关的文章,发表自己的一些见解,如果有错误的地方,欢迎各位指出。
所谓的分布式系统,就是多个节点分工合作,就算某一个节点挂了,也只会影响其中的一些服务,而不至于成个系统都崩溃。此外,在遇到性能瓶颈的时候,还可以比较容易的做出扩展,比如增加更多的节点,而不至于要重构整个系统。
就好像一家饭店,本来只有老板一个人,下单、炒菜、买单都是老板全部干完。这样在客人少的时候,确实问题不大,还节约成本。但是当人多了之后,老板的效率始终有限,可以招呼的客人也是有限的。而且如果老板突然病倒了,那么这家饭店将无法正常运作。
但是如果对饭店进行拓展,设定厨房部负责炒菜、营业部复杂下单,那么即使一两个员工病倒,也不会影响饭店的正常营业。客人多了之后,只需要再聘请多几个厨师,几个服务员,即可满足增加的需求。
对于一个分布式系统,有三个指标,分别是 Consistency(一致性)、Availability(可用性)、Partition tolerance(分区容错性)。这三个指标是由加州大学的计算机科学家 Eric Brewer 提出来的。
而这三个指标,不能同时满足,只能满足其中的两个,这就是 CAP 定理的结论,也是分布式系统的起点。
分区容错性
首先来看分区容错性。它的意思是:数据在网络传输当中,可能会出现错误,即使出现了错误,系统仍然能够正常运行。比如:一台服务器在中国,另一台服务器在加拿大,这两台服务器之间,可能会无法通信。
一般来说,分区容错是无法避免的,系统在设计的时候,必须考虑到这种情况。所以 CAP 定理中的 P 是一定要满足的。
一致性
一致性分为两种情况:
- 一个数据库,有多个节点,主节点更新了数据之后,从节点也要更新数据,保证主从的数据是一致的
- 一个操作涉及到多个服务,比如A服务和B服务,如果A服务成功了,那么B服务也必须要成功,否则AB服务都要回滚
可用性
可用性意思就是,客户端每次发过来的请求,都要给出回应,也就是所谓的有求必应。
一致性和可用性的矛盾
实际上,一致性和可用性,是不能同时满足的。
假设现在有两台服务器,分别为 A 和 B。
如果满足了一致性,那么在写入了 A 之后,B马上要进行数据的同步,同步的过程,其他请求不能访问进来,而且要对B进行加锁,这个时候,就已经不满足可用性这个需求了。
如果满足了可用性,那么数据写入了A之后,B就不能马上加锁,进行数据的同步,在B同步数据完成之前,A和B的数据必然是不一致的,所以不可能满足一致性的需求。
计算机系统的设计,就像人生一样,不可能百分百的完美,需要根据实际的业务场景,对不同的结果作出取舍。
想要吃健康的家常便饭,就必须接受它的清淡;想要吃方便快捷的麦当劳,就要接受它的热气。
今天的分享到这里结束了。
关注公众号“徒手敲代码”,免费领取腾讯大佬推荐的Java电子书!