分布式问题分析(二)分布式事务

指事务的操作位于不同的节点上,需要保证事务的 AICD 特性。

产生原因

– 数据库分库分表;
– SOA 架构,比如一个电商网站将订单业务和库存业务分离出来放到不同的节点上。

应用场景

– 下单:减少库存、更新订单状态。库存和订单如果不在同一个数据库,就涉及分布式事务。
– 支付:买家账户扣款、卖家账户入账。买家和卖家账户信息如果不在同一个数据库,就涉及分布式事务。

解决方案

1. 两阶段提交协议

> [两阶段提交]

两阶段提交协议可以很好地解决分布式事务问题。它可以使用 XA 来实现,XA 包含两个部分:事务管理器和本地资源管理器。其中本地资源管理器往往由数据库实现,比如 Oracle、DB2 这些商业数据库都实现了 XA 接口;而事务管理器作为全局的协调者,负责各个本地资源的提交和回滚。

2. 消息中间件

消息中间件也可称作消息系统 (MQ),它本质上是一个暂存转发消息的一个中间件。在分布式应用当中,我们可以把一个业务操作转换成一个消息,比如支付宝的余额转入余额宝操作,支付宝系统执行减少余额操作之后向消息系统发送一个消息,余额宝系统订阅这条消息然后进行增加余额宝操作。

2.1 消息处理模型

(一)消息队列

(二)发布/订阅

2.2 消息的可靠性

(一)发送端的可靠性

发送端完成操作后一定能将消息成功发送到消息系统。

实现方法:在本地数据库建一张消息表,将消息数据与业务数据保存在同一数据库实例里,这样就可以利用本地数据库的事务机制。事务提交成功后,将消息表中的消息转移到消息中间件,若转移消息成功则删除消息表中的数据,否则继续重传。

(二)接收端的可靠性

接收端能够从消息中间件成功消费一次消息。

实现方法:

– 保证接收端处理消息的业务逻辑具有幂等性:只要具有幂等性,那么消费多少次消息,最后处理的结果都是一样的。
– 保证消息具有唯一编号,并使用一张日志表来记录已经消费的消息编号。

本站所有文章均由网友分享,仅用于参考学习用,请勿直接转载,如有侵权,请联系网站客服删除相关文章。若由于商用引起版权纠纷,一切责任均由使用者承担
极客文库 » 分布式问题分析(二)分布式事务

Leave a Reply

欢迎加入「极客文库」,成为原创作者从这里开始!

立即加入 了解更多