分布式事务


CAP原则

CAP原则又称CAP定理,指的是在一个分布式系统中, Consistency(一致性)、 Availability(可用性)、Partition tolerance(分区容错性),三者不可得兼。

CAP原则是NOSQL数据库的基石。
分布式系统的CAP理论:理论首先把分布式系统中的三个特性进行了如下归纳:


一致性(C):在分布式系统中的所有数据备份,在同一时刻是否同样的值。(等同于所有节点访问同一份最新的数据副本)


可用性(A):在集群中一部分节点故障后,集群整体是否还能响应客户端的读写请求。(对数据更新具备高可用性)


分区容忍性(P):以实际效果而言,分区相当于对通信的时限要求。系统如果不能在时限内达成数据一致性,就意味着发生了分区的情况,必须就当前操作在C和A之间做出选择


BASE理论
Basically Available(基本可用)、Soft state(软状态)和Eventually consistent(最终一致性)
BASE是对CAP中一致性和可用性权衡的结果,其来源于对大规模互联网系统分布式实践的结论,是基于CAP定理逐步演化而来的,其核心思想是即使无法做到强一致性(Strong consistency),但每个应用都可以根据自身的业务特点,采用适当的方式来使系统达到最终一致性(Eventual consistency)。



依据目前的成功经验,可用性一般是更好的选择,
但是在服务和数据库之间维护数据一致性是非常根本的需求,微服务架构中应选择满足最终一致性。

实现最终一致性有三种模式:可靠事件模式、业务补偿模式、TCC模式 (Try-Confirm-Cancel)
https://yq.aliyun.com/articles/582282

TCC开源实现: 比如ByteTCC、seata、tcc-transaction等

服务注册发现

image.png

Dubbo

是个微服务整体架构的框架,提供的功能包括服务注册发现,远程调用,监控等等。对标的项目大概是spring cloud。Dubbo的服务发现模块基于zookeeper实现。

在微服务的开发过程中,如果使用的是 Dubbo 那就必须使用到 Zookeeper ,在使用 Spring Cloud Eureka 时,自然其功能更强大得多。博主也不得不感叹,Spring Cloud Eureka 后来者居上呀,Dubbo 早在几年前停止了维护,在其停止了维护的几年里正是互联网发展的大好时期,Eureka 借机快速发展,夺得了一大片市场,可以说已经超越了 Dubbo 了,17年的时候,阿里巴巴又突然宣布重启对 Dubbo 的维护,在其重启的发布会上,其主导维护者也表示,将希望加入 Eureka 的生态,呃。。。好吧。

Consul

https://www.consul.io/
CP
服务注册相比Eureka会稍慢一些。因为Consul的raft协议要求必须过半数的节点都写入成功才认为注册成功
Leader挂掉时,重新选举期间整个consul不可用。保证了强一致性但牺牲了可用性。

Eureka

AP
是spring cloud之下一个专门负责微服务服务注册和发现的组件,Eureka就是为了服务发现而设计的。是Dubbo对应的概念的一个部分。
服务注册相对要快,因为不需要等注册信息replicate到其他节点,也不保证注册信息是否replicate成功
当数据出现不一致时,虽然A, B上的注册信息不完全相同,但每个Eureka节点依然能够正常对外提供服务,这会出现查询服务信息时如果请求A查不到,但请求B就能查到。如此保证了可用性但牺牲了一致性。

Zookeeper

CP
是用来保证分布式一致性的一个软件。不是为了服务发现注册而设计的,只不过它的特性也可以被二次开发成服务发现注册中心罢了。

Zookeeper vs Eureka

https://juejin.im/post/5de28b0c5188254fc26bc269

Zookeeper保证CP
当向注册中心查询服务列表时,我们可以容忍注册中心返回的是几分钟以前的注册信息,但不能接受服务直接down掉不可用。也就是说,服务注册功能对可用性的要求要高于一致性。但是zk会出现这样一种情况,当master节点因为网络故障与其他节点失去联系时,剩余节点会重新进行leader选举。问题在于,选举leader的时间太长,30 ~ 120s, 且选举期间整个zk集群都是不可用的,这就导致在选举期间注册服务瘫痪。在云部署的环境下,因网络问题使得zk集群失去master节点是较大概率会发生的事,虽然服务能够最终恢复,但是漫长的选举时间导致的注册长期不可用是不能容忍的。

Eureka保证AP
Eureka看明白了这一点,因此在设计时就优先保证可用性。Eureka各个节点都是平等的,几个节点挂掉不会影响正常节点的工作,剩余的节点依然可以提供注册和查询服务。而Eureka的客户端在向某个Eureka注册或时如果发现连接失败,则会自动切换至其它节点,只要有一台Eureka还在,就能保证注册服务可用(保证可用性),只不过查到的信息可能不是最新的(不保证强一致性)。除此之外,Eureka还有一种自我保护机制,如果在15分钟内超过85%的节点都没有正常的心跳,那么Eureka就认为客户端与注册中心出现了网络故障,此时会出现以下几种情况:

Eureka不再从注册列表中移除因为长时间没收到心跳而应该过期的服务
Eureka仍然能够接受新服务的注册和查询请求,但是不会被同步到其它节点上(即保证当前节点依然可用)
当网络稳定时,当前实例新的注册信息会被同步到其它节点中

因此, Eureka可以很好的应对因网络故障导致部分节点失去联系的情况,而不会像zookeeper那样使整个注册服务瘫痪。

其他链接

Consul vs. Eureka
https://www.consul.io/intro/vs/eureka.html

存储


不同的微服务经常使用不同的数据库。
应用会产生各种不同类型的数据,关系型数据库并不一定是最佳选择。
例如,某个产生和查询字符串的应用采用Elasticsearch的字符搜索引擎;
某个产生社交图片数据的应用可以采用图数据库,例如,Neo4j;
基于微服务的应用一般都使用SQL和NoSQL结合的模式