分布式事务就是保证各个微服务之间数据一致,本质上就是保证不同数据库的数据一致性。一致性状态包含
因此,存在如下几种方案:
2PC ,二阶段提交是一种尽量强一致性设计,引入一个事务协调者来协调和管理各参与者的提交和回滚,包含准备和提交两个阶段,阶段之间同步阻塞,准备阶段协调者有超时机制。
大致流程:
存在问题:
场景:目前支付宝使用2PC两阶段提交思想实现了分布式事务服务,它是一个分布式事务框架,用来保障在大规模分布式环境下事务的最终一致性。
3PC,为了解决2PC的不确定性,包含准备,预提交,提交三个阶段。准备阶段只是询问参与者的状态,其他阶段分别对应2PC。相比2PC,参与者也有超时机制(防止在2PC协调者提交阶段准备发送命令的时候挂了,参与者一直阻塞等待的情况),并且新增了一个阶段使得故障恢复之后协调者的决策复杂度降低(解决2PC的不确定性,在将要发生不确定性时,新协调者发现有一个参与者处于预提交或者提交阶段,那么表明已经经过了所有参与者的确认了,所以此时执行的就是提交命令)
场景:没有找到具体实现,偏理论。
2PC 和 3PC 都不能保证数据100%一致,因此一般都需要有定时扫描补偿机制。
TCC,2PC 和 3PC 都是数据库层面的,而 TCC 是业务层面的分布式事务。TCC指的是Try - Confirm - Cancel
其也存在一个事务管理者,用来记录TCC全局事务状态提交或者回滚。其流程和2PC差不多。但业务的侵入较大、业务耦合度高,需要将原来一个接口可以实现的逻辑拆分为三个接口。
场景:TCC 需要提供三个接口,提高了编程的复杂性,并且依赖于业务方来配合提供这样的接口,推行难度大,所以一般不推荐使用这种方式。
本地消息表,利用各个系统本地事务来实现分布式事务。系统中会定义一个存放本地消息的表,一般都是放在数据库中。
大致流程:
场景:跨行转账可通过该方案实现。在银行一的用户A向银行二的用户B转账
消息事务,只有阿里的RocketMQ支持,实现了最终一致性。
大致流程:
场景:用户注册成功后发送邮件、电商系统给用户发送优惠券等需要保证最终一致性的场景。
最大努力通知,是最简单的一种柔性事务,适用于一些对最终一致性不敏感的业务,且被动方的处理结果,并不会影响主动方的处理结果。
大致流程:
场景:最常见的场景就是支付回调,支付服务收到第三方服务支付成功通知后,先更新自己库中订单支付状态,然后同步通知订单服务支付成功。如果此次同步通知失败,会通过异步脚步不断重试地调用订单服务的接口。
我们从分布式系统中负载均衡的问题来描述分布式hash。
常见的负载均衡算法如下:
随机访问策略。随机访问,可能造成服务器负载压力不均衡。
轮询策略。请求均匀分配,但是浪费了性能高的服务器的资源。
权重轮询策略。根据权重轮询,权重需要静态配置,无法自动调节。
Hash取模策略。通过hash取模,伸缩性差,当新增或者下线服务器机器时候,用户与服务器的映射关系会大量失效。
一致性哈希策略。简单来说就是将整个哈希值(int范围)空间组织成一个虚拟的hash圆环,将每个服务器标识符跟int最大hash取模,得到一些对应在hash环上的点。用户在访问的时候,根据用户的标识符使用同样的hash函数取模,得到hash环上的一点,但这一点很可能没有服务器映射在上面,所以会顺时针行走,遇到的第一台服务器就是应该处理该用户请求的服务器。
优点:
缺点: