当然,牺牲一致性,并不是完全不管数据的一致性,否则数据是混乱的,那么系统可用性再高分布式再好也没有了价值 。牺牲一致性,只是不再要求关系型数据库中的强一致性,而是只要系统能达到最终一致性即可 。
从CAP理论到BASE理论
BASE 是 Basically Available(基本可用)、Soft state(软状态)和 Eventually consistent(最终一致性)三个短语的简写,由 eBay 架构师 Dan Pritchett 于 2008 年在《BASE: An Acid Alternative》论文中首次提出 。
BASE 思想与 ACID 原理截然不同,它满足 CAP 原理,通过牺牲强一致性获得可用性,一般应用于服务化系统的应用层或者大数据处理系统中,通过达到最终一致性来尽量满足业务的绝大多数需求 。BASE 模型包含如下三个元素:
- BA:(Basically Available ),基本可用 。
- S:( Soft State),软状态,状态可以在一段时间内不同步 。
- E:(Eventually Consistent ),最终一致,在一定的时间窗口内,最终达成一致即可 。
1、基本可用:指分布式系统在出现故障的时候,允许损失部分可用性,保证核心可用 。但不等价于不可用 。比如:搜索引擎0.5秒返回查询结果,但由于故障,2秒响应查询结果;网页访问过大时,部分用户提供降级服务,等 。
2、软状态:软状态是指允许系统存在中间状态,并且该中间状态不会影响系统整体可用性 。即允许系统在不同节点间副本同步的时候存在延时 。
3、最终一致性:系统中的所有数据副本经过一定时间后,最终能够达到一致的状态,不需要实时保证系统数据的强一致性 。最终一致性是弱一致性的一种特殊情况 。
BASE理论面向的是大型高可用可扩展的分布式系统,通过牺牲强一致性来获得可用性 。ACID是传统数据库常用的概念设计,追求强一致性模型 。
基于可靠消息队列实现最终一致性

文章插图
基于消息的最终一致性是消除了分布式事务,是一种在BASE思想指导下比较好的方案 。这种方案实现了两个服务之间的解耦,解耦的关键就是异步消息和消息持久化机制 。在两个服务调用之间,会存在一个真空期,这段时间相关数据不一致,而只是在一个事务的中间状态 。
事务主动方的业务服务事务提交和消息发送之间必须通过事务同步,可以通过事务管理器进行管理,如两阶段提交 。事务主动方在完成事务提交和消息发送之后,它的最终处理结果不再受到事务被动方的影响 。即发送到事务被动方的事务要么成功,要么重试 。
所以,消息同样需要满足幂等性 。实际情况下,消息很难具有幂等性,解决这一问题的方法是使用另一个表记录已经被成功应用的消息,这样就可以通过避免消息多次被应用,从而达到幂等性 。
在实际应用中,如果消息接收端的服务出现失败,可能需要人工干预 。
场景举例说明
场景:在采购系统中拟制采购订单,在提交单据申请的时候既需要将单据成功保存到本地,同时又需要启动远程流程平台提供的流程启动服务 。在该场景中,第二个步骤属于必须要最终完成的操作,同时业务上也允许最终一致(不要因为流程平台本身问题导致单据提交不成功,启流程失败如何重试是系统内部的事情)对于该场景,基于消息实现最终一致性逻辑如下:

文章插图
三种事务处理方案的比较和选择对于上面谈到的三种事务处理方案,我们列个表格比较如下:

文章插图
当前主流的方法仍然是事务补偿和BASE最终一致性,同时可以看到,基于消息中间件实现的事务最终一致性由于本身具备高可靠,高性能,并满足大并发的高吞吐量,因此在互联网应用往往采用的更加多 。在企业内部的基于SOA服务的分布式事务控制,
推荐阅读
- rtsp协议之dss搭建rtsp服务器
- 甲状腺微粒体抗体高
- 手把手带你nginx搭建基于rtmp或者http的flv、mp4流媒体服务器
- 系统架构设计工具—SystemArchitect
- 微信朋友圈看出人的性格类型
- 我是如何部署日活几十万的单体应用服务的?
- 2 「系统架构」如何使用Dockerfile制作Docker容器?
- 你知道吗?使用 pycharm 连接服务器进行操作比 Xshell 更简单
- Linux服务器入侵检测排查方法
- Windows服务器入侵检测排查方法
