赞
踩
目录
CAP = Consistency(一致性)、Availability(可用性)、Partition Tolerance(分区容错性)
CAP定理,又被称作布鲁尔定理(Brewer's theorem),它指出对于一个分布式系统来说,不可能同时满足以上三点,只能满足三项中的两项。
实际上,在分布式系统中,由于我们必须要实现分区容错性(Partition Tolerance),因此只能选择 CP 或者 AP 架构。
问题:为什么不能选择CA架构?
如果我们选择CA架构,则会出现这样的情况:如果分布式系统出现网络分区,当某个节点在进行写操作时,
BASE = Basically Available(基本可用) 、Soft-state(软状态) 、Eventually Consistent(最终一致性)
BASE理论是对CAP理论中的AP架构的补充,即在选择AP架构的情况下,如何更好的最终达到C。核心思想是即使无法做到强一致性,但每个应用都可以根据自身业务特点,采用适当的方式来使系统达到最终一致性。
常用的注册中心有Zookeeper、Eureka、Nacos、Consul和ETCD。其中Zookeeper、Consul、ETCD选择CP架构,Eureka选择AP架构,Nacos既支持CP架构也支持AP架构。
问题:服务注册应该选择AP还是CP?
对于服务注册来说,针对同一个服务,即使注册中心的不同节点保存的服务注册信息不相同,也并不会造成灾难性的后果。对于服务消费者来说,能消费才是最重要的,就算拿到的数据不是最新的数据,消费者本身也可以进行尝试失败重试。总比为了追求数据的一致性而获取不到实例信息整个服务不可用要好。
所以,对于服务注册来说,可用性比一致性更加的重要,选择AP架构,即 Eureka 和 Nacos。那么Eureka和Nacos如何选择?哪个让我做的事少,我就选择哪个,显然 Nacos 帮我们做了更多的事。
目前分布式锁的实现方式主要包括三种,其中基于Redis实现分布式锁的效率最高,加锁速度最快,因为Redis几乎都是纯内存操作,而基于数据库实现分布式锁和基于zookeeper实现分布式锁都会涉及到磁盘文件IO,效率相对低下。
利用数据库的唯一索引来实现。当进行加锁时,进行insert操作,数据库成功插入则认为加锁成功,当数据库报出 Duplicate entry 则表示无法获取该锁。
不过这种方式对于单主却无法自动切换主从的MySQL来说,基本就无法现实现P(分区容错性),(MySQL自动主从切换在目前并没有十分完美的解决方案)。可以说这种方式强依赖于数据库的可用性,数据库写操作是一个单点,一旦数据库挂掉,就导致锁的不可用。这种方式基本不在CAP的一个讨论范围。
利用Redis的setXX指令来实现,并设置一个超时时间,过期自动释放锁。Redisson是Redis官网推荐实现分布式锁的一个第三方类库。它提供了 watch dog 自动延时机制,通过开启另一个服务,后台进程定时检查持有锁的线程是否继续持有锁,使在 Redisson 实例被关闭前,不断的延长锁的有效期。
Redis分布式锁采用了AP架构。如果在社交发帖等不需要非常强的事务一致性的场景下,Redis分布式锁是非常适合的;但如果是交易类型等对数据一致性非常敏感的场景下,我们可能要寻在一种更加适合的 CP 架构的分布式锁。
多个节点同时在一个指定的节点下申请创建有序的临时节点,判断自己是否为序号最小的节点,如果是,则获取锁,否则就会监听序号比自己小的节点,一旦序号比自己小的节点被删除了,就再次判断自己是否是最小节点。
ZooKeeper分布式锁采用了CP架构。当ZooKeeper分布式锁提供给我们进行访问的时候,在zk集群中能确保这把锁在zk的每一个节点都存在。ZooKeeper分布式锁要比Redis分布式锁可靠很多,但它繁琐的实现机制导致了它的性能不如Redis,而且zk会随着集群的扩大而性能更加下降。
分布式事务跟ACID原则的数据库事务有点不一样,它是指事务的参与者、支持事务的服务器、资源服务器以及事务管理器分别位于不同的分布式系统的不同节点之上。简单来说,分布式事务指的就是分布式系统中的事务,它的存在就是为了保证不同数据库节点的数据一致性。
在分布式系统中,要实现分布式事务,常见的解决方案如下:
以上分布式事务的解决方案各有不同,不过其实都是遵循BASE理论,是最终一致性模型。业界目前使用本地消息表这种方案是比较多的。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。