php分布式数据一致性,如何解决分布式系统数据事务一致性问题

在分布式系统中,如何基于业务方面的考量、将RESTful与MQ(消息中间件)结合、解决事务完整性/数据一致性问题的架构设计。

一、面向业务考量的最终一致性方案考虑

这里先举两个例子。

1、支付宝的“WS Transaction标准”尝试:

支付宝在他们的分布式系统中为解决事务完整性的问题,曾经尝试过WS Transaction标准,但是经过实际做测试,最后发现成本实在是太高了。完成一个事务,为确保事务完整性,20多条的消息的交互,其中只有1条是业务消息,其他都是系统之间的协议消息。这就会导致客户端响应太慢,客户无法承受这样的性能。

2、Ebay架构师的最终一致性方案:

来自Ebay的架构师根据他们的最佳实践给出过解决方案。就是关于数据一致性的,比如他们的分布式存储如何保持数据一致性。其中探讨了“实时一致”与“严格事务”之间的悖论,他们采用了局部实时一致、全局最终一致的解决方案。在这里就需要从业务上辨别哪些操作是可以放宽的(允许不在一个事务中),哪些操作必须是原子性的。现在Ebay的整个架构就是基于“最终一致性”的,支付宝也从中受到启发,沿用该设计思路解决了“客户端迅速响应”和“服务端数据一致”的矛盾。

故考虑系统架构设计的时候,不仅仅考虑技术,也把业务因素考虑进来,面向业务考量进行系统设计,会让我们在技术上做出更合理的抉择。基于业务考虑,有利于得出事务的优先级别,也有利于作出架构设计上的最佳取舍。通常来说银行、证券系统的事务完整性(或者说数据一致性)具有绝对优先级,也就要求绝对严格的实时保证。而通讯系统在事务完整性(或者说数据一致性上)的优先级别上甚至没有支付宝和Ebay高,这两者都有复杂的帐务交易。如果他们也认为局部实时一致、全局最终一致就能够满足业务的要求,那么自然在通讯系统中也有其可行性。

二、Restful与MQ技术适用场景分析

一般而言Restful技术架构为对客户端开放的一组资源服务。在分布式系统中既有客户端与服务器之间的交互,又有服务器与服务器之间的交互。比如说XCAP协议就是标准的Restful风格的接口,提供客户端远程操作XML文档的服务,而“运营管理系统”调用其他业务系统接口,用以管理用户可被分配的服务以及权限等,则是服务器之间的信息交互。前者当然适合Restful风格的技术接口,后者个人更倾向于异步的、基于消息的通信方式。因为客户端与服务器通常是跨越互联网的,而服务器与服务器之间可能位于一个局域网内,甚至可能被安放在同一个机房。

我们知道Restful风格的技术架构通常是通过JSON或者XML等进行信息的传递,总之都是通过“字符串格式”的封装进行信息传递。通过字符格式交互信息在使用上带来简便的同时,因为封装、解析、转换等过程使其在性能自然要付出一些代价,如果是服务器之间在更底层同类协议之间的数据交互性能就要高的多。这里顺便提到信息交互在不同场景下的性能顺序,按照从快到慢排序:

1、同一进程之间的信息交互;

2、同一机器两个进程之间的信息交互;

3、两个分布机器之间的信息交互。

因为HTTP是在TCP/IP协议之上的包装,WebService是在HTTP协议之上的包装,根据越低层协议之间的信息交互越高效的特征,从协议级由快到慢排序:

1、基于TCP/IP协议的信息交互;

2、基于HTTP协议的信息交互;

3、基于WebService协议的信息交互。

另外,因为“运营管理系统”与其他系统之间是直接交互的,比如运营要给某个用户开通某些特定服务,那就要分别调用提供这几个服务的业务系统的“细粒度”接口。一旦增加新的服务,也势必影响到运营管理系统的修改。我们说在分布式系统中有个原则,尽可能设计“粗粒度”接口,以减少系统之间的网络交互。如果在运营管理系统与其他业务系统之间由“消息中间件”来进行信息交互,那么:

1、运营管理系统可以设计面向服务的“粗粒度”接口,开通几个服务只需要把几种类型的数据封装在一起,一次性传递给MQ。增加服务也只不过增加一种数据类型而已;

2、MQ可以保证消息最终一定会被接收、处理。因为MQ可以实现基于“订阅-通知”的Event-Driven机制,业务系统只要在MQ中注册自己,就可以实时收到来自MQ的消息。即使出现系统或者网络异常,消息也会被MQ中间件持久化,一旦业务系统恢复,消息马上会被发往业务系统,这显然比目前采用的每隔一段时间扫描一次数据库要高效的多。

三、MQ与最终一致性

MQ消息队列技术是分布式应用间交换信息的一种技术。消息队列可驻留在内存或磁盘上,队列存储消息直到它们被应用程序读走。通过消息队列,应用程序可独立地执行——它们不需要知道彼此的位置、或在继续执行前不需要等待接收程序接收此消息。它为构造异步方式实现的分布式应用提供了松耦合方法,在应用中以执行多种功能,比如要求服务、交换信息或异步处理等。

在分布式系统中,尤其是不同语言的分布式系统中,如果没有消息中间件完成信息交换,应用开发者为了高效传输数据,就要编写相应语言的应用程序来发送和接收信息,且交换信息没有标准方法,每个应用必须进行特定的编程从而和多平台、不同环境下的一个或多个应用通信。

假如系统可以采用数据“局部实时一致、全局最终一致”的方案,就可以选择不需要支持事务的MQ中间件,因为其可以保证:即使在系统异常、网络异常等特殊情况下,消息也会被持久化,当系统恢复,消息马上会被处理,也即最终一定会被接受处理,也就是最终一致。而不需要支持事务的MQ性能及吞吐率都会很高。

总之,个人倾向于用 Restful对客户端提供服务,服务器之间引入MQ服务,建立异步的、基于消息的信息交互方式,并基于数据局部实时一致、全局最终一致的原则,来解决事务问题

第1章 课程介绍 介绍该课程的内容、学习成果、实例,还有学习所需的前提知识。 1-1 导学-分布式事务实践 第2章 事务原则与实现 介绍了事务的四大原则,并通过实例介绍数据库实现事务的方法,以及使用JDBC实现事务的方法。 2-1 事务原则与实现:事务 2-2 事务原则与实现:SQL事务 2-3 事务原则与实现:JDBC事务(上) 2-4 事务原则与实现:JDBC事务(下) 第3章 使用Docker搭建环境 介绍了Docker的使用,通过Docker将课程环境搭建起来,方便那些不了解这些技术的同学之后的学习。 3-1 docker简介与mysql安装-1 3-2 docker简介与mysql安装-2 3-3 SpringBoot基础 第4章 Spring事务机制 介绍了Spring的事务机制、事物抽象、内部事务和外部事物,以及常用的几种事务管理的实现,包括DataSource、JPA、JMS、JTA都通过实例进行说明。还有XA以及两阶段提交,并通过实例演示了使用JTA,通过两阶段提交,实现多数据源的事务实现。... 4-1 Spring事务机制_基本接口 4-2 Spring事务机制_实现 4-3 Jpa事务实例 4-4 Jms事务原理 4-5 Jms-session事务实例 4-6 Jms-spring事务实例 4-7 外部事务与JTA 4-8 JTA单数据事务实例 4-9 JTA多数据事务实例 第5章 分布式系统 介绍了分布式系统的定义、实现原则和几种形式,详细介绍了微服务架构的分布式系统,并使用Spring Cloud框架演示了一个完整的微服务系统的实现过程。 5-1 CAP原则和BASE理论简介 5-2 分布式系统综述 5-3 SpringCloud微服务架构 5-4 实现registry 5-5 实现proxy 5-6 user服务 5-7 order服务 5-8 添加hystrix 5-9 使用feign 5-10 优化服务间调用 第6章 分布式事务实现,模式和技术 介绍分布式事务的定义、原则和实现原则,介绍使用Spring框架实现分布式事务的几种方式,包括使用JTA、Spring事务同步、链式事务等,并通过实战介绍其实现。除此以外还介绍了一些分布式事务相关的技术,如幂等性、全局一致性ID、分布式对象等。... 6-1 分布式事务介绍 6-2 spring分布式事务实现_使用JTA 6-3 spring分布式事务实现_不使用JTA 6-4 实例1-DB-DB 6-5 实例1-DB-DB.链式事务管理器 6-6 实例2-JPA-DB.链式事务管理器 6-7 实例3-JMS-DB.最大努力一次提交 6-8 分布式事务实现模式与技术 6-9 全局一致性ID和分布式对象_ 第7章 分布式事务实现:消息驱动模式 详细介绍3种分布式事务实现的模式中的消息驱动模式并通过完整实例演示了消息驱动模式下,实现微服务系统的分布式事务的完整过程。 7-1 分布式事务实现:消息驱动模式 7-2 消息驱动模式实例:设计 7-3 消息驱动模式实例:创建ticket服务 7-4 消息驱动模式实例:实现基本ticket功能 7-5 消息驱动模式实例:锁票1 7-6 消息驱动模式实例:锁票2 7-7 按消息流程实现业务 7-8 支付过程 7-9 票转移 7-10 错误处理:锁票失败 7-11 错误处理:扣费失败 7-12 并发时的错误处理 第8章 分布式事务实现:Event Sourcing模式 详细介绍了分布式事务实现的模式中的Event Sourcing模式,并通过完整实例演示了Event Sourcing模式下,实现微服务系统的分布式事务的完整过程。 8-1 事件溯源模式介绍 8-2 事件溯源模式与Axon框架-1 8-3 事件溯源模式与Axon框架-2 8-4 使用Axon框架的设计过程介绍 8-5 Axon框架-实例(上) 8-6 Axon框架-实例(下) 8-7 Saga模式和Axon Saga 8-8 聚合命令事件(上) 8-9 聚合命令事件(下) 8-10 实现saga 8-11 实现query 8-12 处理超时 8-13 并发测试 8-14 cloud-axon实例:分布式处理介绍 8-15 事件设计 8-16 事件与队列设计 8-17 实现User服务 8-18 实现Ticket服务 8-19 实现Order服务 8-20 实现读写分离 8-21 测试与并发 8-22 事件溯源模式与Axon框架总结 第9章 TCC模式和微服务架构的设计模式 本章介绍TCC模式,也对微服务系统的几种设计模式,以及这些模式下分布式事务的实现模式进行了介绍。 9-1 TCC模式介绍 9-2 微服务架构的设计模式 第10章 课程总
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值