1、什么是分布式
我们把所有功能集中放在一个系统,比如用户注册,登入,用户下单买东西等,全部放在一个系统部署在一台服务器上,属于集中式系统。若随着业务的增大,越来越多的用户和越来越麻烦的也无需求,为了保证高内聚低耦合,可以吧业务拆分成不同的模块,springCloud就属于分布式,吧每个功能点放在不同的系统里,在部署在不同的服务器上,保证容错性低,而集群部署可以保证高可用。
2、什么是CAP
Consistency(一致性):保证客户端的操作完服务端之后,每次访问的数据都是一致,比如张三和李四同事访问A、B两个不同的服务器,张三修改A服务器数据库之后,必须同步到B,保证李四在B服务器查询数据库和A服务器数据一致。
Availability(高可用):表示服务器正常可用,一直能响应客户端,不能因为宕机,或者解决一致性问题,而导致客户端一直显示加载中。
Partition Tolerance(分区容错性):表示分布式系统在某个网络分区有故障时候,系统还能正常运行,满足正常的业务需求,保证一致性和高可用,客户端感受不到有故障发生。
3、为什么只能满足两个
这张图网上有很多,如果你看过资料或者视频,应该看过很多遍,举个例子:
- 有两台服务器,张三在A服务器吧数据改成了金额从1改成了100;
- A服务器吧数据同步到B服务器,数据也成为了100;
- 李四从B服务器访问获取到的数据也是100。
上面这个例子满足了cap的三个特性,这是最理想的状态。但若网络出现故障的情况下怎么办呢?当A服务器同步数据到B服务器的时候,网络出现了故障,因此李四从B服务器获取 到的数据还是1,因为数据并未从A数据库同步过来,但这时候系统也能访问,就没有一致性了,拥有了分区容错性和可用性。
正因为这三个矛盾,三者不能同时满足,既然不能一起满足,我们就要在cap里面进行取舍。
怎么取舍呢?
- 选择CA without P:这时候意味着系统不是分布式,牺牲了分区容错性。因为分布式系统就是把功能分开,部署在不同的服务器。
- 选择AP without C : 这时候就意味着不同的系统储存的数据是不一样的,客户访问A系统获取的数据是1,访问B系统获取的数据是100。
- 选择CP without A : 这种情况意味着选择分布式系统并且保证一致性,但如果网络节点发生故障,客户端就会出现一直阻塞状态,等待网络恢复才能获取到一致性的结果。
如何取舍就要根据业务场景来评估,事实证明,大部分都是牺牲一致性,比如双11活动,12306抢票,抢了之后显示票不够,但并不是说牺牲一致性就是最好的,在数据要求比较严谨的方面,比如mysql数据库,是需要满足一致性和可用性的。