微服务在业界正获得越来越多的关注,理解微服务架构模式,对现有企业应用转型升级大有帮助。如何快速学习微服务中复杂的概念,掌握其实践,成为众多学习者关注的问题。 DaoCloud 首席架构师王天青 Grissom 为大家带来「3 分钟学习微服务」系列,为微服务学习 划 重 点 !上一期,我们推出了《 CAP 定理和数据一致性》,今天继续推出:互联网系统的一致性解决方案。
一个转账业务操作,需要同时调用记账服务( Account Service - AS )和支付服务( Payment Service - PS ),需要满足要么同时成功;要么同时失败。记账服务和支付服务可能是多个不同部门开发、部署在不同服务器上的远程服务。
我们可以使用分布式事务将记账操作和支付操作变为一个整体操作。好处很明显,可以实现数据强一致性,但是分布式事务由于有很多的同步操作, 对系统的吞吐量和请求的响应时间产生较大的影响。
在工程实践上,为了保障系统的可用性,互联网系统大多将强一致性需求转换成最终一致性的需求,并通过系统执行幂等性的保证,保证数据的最终一致性。但在电商等场景中,对于数据一致性的解决方法和常见的互联网系统(如 MySQL 主从同步)又有一定的区别。
另外一种方式是使用消息及补偿机制来确保最终一致性,并同时避免分布式事务。此方案的核心是将需要分布式处理的任务通过消息日志的方式来异步执行。消息日志可以存储到本地文本、数据库或消息队列,再通过业务规则自动或人工发起重试。人工重试更多的是应用于支付场景,通过对账系统对事后问题的处理。
如果大家读过 Domain Driven Design 这本书,在领域设计中,当领域对象 Aggregator 状态发生变化时,它会发布领域事件( Domain Event )给订阅方。我们可以使用领域事件来追踪领域对象的变化并用于维护事件的一致性。
原有的做法:
现在的做法:
领域事务( Domain Transaction )
领域事件( Domain Event )
示例:转账领域事务
事务状态由事件决定
这里我们使用事件机制和补偿机制实现了一种数据一致性的解决方案。该方案具备高吞吐量及低响应时间的特性,但是在某些服务失败场景下会存在数据不一致的情况,需要通过业务设计(引入新的中间状态),对账机制,重试机制,回滚机制等机制来确保数据最终一致性。
微服务的 Event Sourcing (事件溯源)和 Command Query Responsibility Separation (CQRS) 模式则天然能够更好支持这种数据一致性方案,我们会在下一篇文章《使用 Axon 框架实现 CQRS 和 ES 》中进行详细描述并给出示例实现。
1
fatjiong 2017-03-14 18:58:23 +08:00
好东西,感谢楼猪分享。分布式事务一直有点模糊。
|
2
zhy 2017-03-14 21:02:04 +08:00
觉得不错,有干货
|