分布式系统数据一致性

分布式系统数据一致性


分布式事务有两种解决方式
1.异步消息(消息队列)
(1)使用异步消息 Consumer 端需要实现幂等,幂等是指多个请求返回相同的结果。
(a)一种方式是业务逻辑保证幂等。比如接到支付成功的消息订单状态变成支付完成,如果当前状态是支付完成,则再收到一个支付成功的消息则说明消息重复了,直接作为消息成功处理。
(b)另外一种方式如果业务逻辑无法保证幂等,则要增加一个去重表或者类似的实现。对于 producer 端在业务数据库的同实例上放一个消息库,发消息和业务操作在同一个本地事务里。发消息的时候消息并不立即发出,而是向消息库插入一条消息记录,然后在事务提交的时候再异步将消息发出,发送消息如果成功则将消息库里的消息删除,如果遇到消息队列服务异常或网络问题,消息没有成功发出那么消息就留在这里了,会有另外一个服务不断地将这些消息扫出重新发送。

2. 有的业务不适合异步消息的方式,事务的各个参与方都需要同步的得到结果。每个参与方的本地业务库的同实例上面放一个事务记录库。由一个中心服务对比三方的事务记录表,做一个最终决定。假设现在三方的事务记录是 A 成功,B 失败,C 成功。那么最终决定有两种方式,根据具体场景:
(1)重试 B,直到 B 成功,事务记录表里记录了各项调用参数等信息;
(2)执行 A 和 B 的补偿操作(一种可行的补偿方式是回滚)。


DTS 方案
1.支付宝在 2PC 的基础上改进而来。
2.分布式事务服务 (Distributed Transaction Service, DTS) 是一个分布式事务框架,用来保障在大规模分布式环境下事务的最终一致性。


分布式环境下(数据分布)要任何时刻保证数据一致性是不可能的,只能采取妥协的方案来保证数据最终一致性。



参考原文(保证分布式系统数据一致性的6种方案): http://www.cnblogs.com/lzyGod/p/5558474.html
参考原文(关于分布式系统的数据一致性问题): http://elf8848.iteye.com/blog/2067771


猜你喜欢

转载自huangyongxing310.iteye.com/blog/2358397
今日推荐