分布式系统:分布式事务

分布式系统的一致性主要考虑的是读写和服务器端的复制。本文主要针对分布式事务。

大型互联网平台往往是由一系列分布式系统构成的,开发语言平台和技术栈也相对比较杂,尤其是在SOA和微服务架构盛行的今天,一个看起来简单的功能,内部可能需要调用多个“服务”并操作多个数据库或分片来实现,情况往往会复杂很多。单一的技术手段和解决方案,已经无法应对和满足这些复杂的场景了。

两阶段提交

XA协议是2PC的规范,JTA也支持,各大数据库也支持。这里有个MySQL XA的例子

2PC可能比单机事务慢10倍。一般互联网公司不使用2PC。

回滚接口

写服务提供回滚接口,如果后续步骤出错了,则回滚前面的步骤。缺点很多,代码大,耦合高,复杂逻辑不好控制,且容易出现脏读(前面步骤已经提交了)。

同数据库消息表

写到一个数据库时,同时在同一个本地事务中添加消息。这个消息被消费者读取去执行后续的事务。eBay支付宝都曾经用过。

吞吐量和性能方面存在瓶颈,频繁的读写消息会给数据库造成压力

MQ的非事务消息

消息表的消费状态应该由消费者来更改,然而消费者的数据库和上述消费表不在一个数据库上,不是本地事务。

处理好如下问题。

  • 消息不能丢
  • 处理好重复消费消息

MQ的事务消息

阿里的RocketMQ支持了事务消息,确保消息的发送者的本地事务包含了发消息这个步骤。这篇文章很好的简要介绍了RocketMQ和他的事务消息。RocketMQ在阿里集团被广泛应用在订单,交易,充值,流计算,消息推送,日志流式处理,binglog分发等场景.

参考

Contents