分布式系统的一致性主要考虑的是读写和服务器端的复制。本文主要针对分布式事务。
大型互联网平台往往是由一系列分布式系统构成的,开发语言平台和技术栈也相对比较杂,尤其是在SOA和微服务架构盛行的今天,一个看起来简单的功能,内部可能需要调用多个“服务”并操作多个数据库或分片来实现,情况往往会复杂很多。单一的技术手段和解决方案,已经无法应对和满足这些复杂的场景了。
两阶段提交
XA协议是2PC的规范,JTA也支持,各大数据库也支持。这里有个MySQL XA的例子。
2PC可能比单机事务慢10倍。一般互联网公司不使用2PC。
回滚接口
写服务提供回滚接口,如果后续步骤出错了,则回滚前面的步骤。缺点很多,代码大,耦合高,复杂逻辑不好控制,且容易出现脏读(前面步骤已经提交了)。
同数据库消息表
写到一个数据库时,同时在同一个本地事务中添加消息。这个消息被消费者读取去执行后续的事务。eBay支付宝都曾经用过。
吞吐量和性能方面存在瓶颈,频繁的读写消息会给数据库造成压力
MQ的非事务消息
消息表的消费状态应该由消费者来更改,然而消费者的数据库和上述消费表不在一个数据库上,不是本地事务。
处理好如下问题。
- 消息不能丢
- 处理好重复消费消息
MQ的事务消息
阿里的RocketMQ支持了事务消息,确保消息的发送者的本地事务包含了发消息这个步骤。这篇文章很好的简要介绍了RocketMQ和他的事务消息。RocketMQ在阿里集团被广泛应用在订单,交易,充值,流计算,消息推送,日志流式处理,binglog分发等场景.
参考
- 分布式系统的分布式事务
- [RocketMQ] (https://github.com/apache/incubator-rocketmq)