先说CAP
CAP,C 是指强一致性,A是指可用性,P是指分区一致性。
这三个是不同同时满足的,最多只能同时满足两个。P是一定要占用的,剩下的一个我们就要根据业务的需求去衡量。
为什么说C和A不能同事满足
这里就拿注册中中间件来说:一个注册中心集群,如果想要保证一致性,那就一定要等集群全部节点的服务注册表信息完全一直了,才能对外提供服务,否则一致性就不能保证。比如说三个节点,其中一个节点的注册表信息发生变化,此时如果没有完成同步,想要保持可用性开放对外服务,则到不同的节点上取到的数据是不一致的,这保证了可用性而违背一致性。如果一定要等集群数据同步完,再提供服务,则在同步期间,一定不能对外提供服务,这就失去了可用性。所以说可用性A和一致性C是相互冲突的。
最重要的区别- zookeper 是保证 cp的,Eureka是保证AP 的 。从CP 和 AP 的角度上来说, zookeper 使用的主从,主节点挂了以后,从节点切换成主节点,问题就出在这里,那就是选举的时间有点长。 而 Eureka 配置的集群,只要有一个存在,就可以正常的提供服务。
- 时效性问题:根据Eureka的机制,一个服务从上线,完成注册,到消费端能够使用,如果不调参数的话,需要花费一分钟的时间。这源于Eureka的多级缓存,整体是采用一个被动更新的方式来更新注册表数据的。也就是说如果时效性要求比较高的话,确实是有问题的,我们要考虑,如果注册的服务挂了,一分种才能发现。难道这一分钟都去报错吗?还是要处理。 而zk是使用主动推送的方式更新注册的服务的。一旦有服务注册过来,就主动更新注册表到客户端。
- 容量问题:注册中心能够支持多少个客户端的连接。
Eureka 的优势所在
Eureka 可以很好的应对,因为网络故障导致部分节点失去联系的情况,不会像zookeper一样整个注册服务瘫痪。