微服务架构的分布式事务解决方案

分布式系统架构中,分布式事务问题是一个绕不过去的挑战。而微服务架构的流行,让分布式事问题日益突出!

下面我们以电商购物支付流程中,在各大参与者系统中可能会遇到分布式事务问题的场景进行详细的分析!

如上图所示,假设三大参与平台(电商平台、支付平台、银行)的系统都做了分布式系统架构拆分,按上数中的流程步骤进行分析:

1、电商平台中创建订单:预留库存、预扣减积分、锁定优惠券,此时电商平台内各服务间会有分布式事务问题,因为此时已经要跨多个内部服务修改数据;

2、支付平台中创建支付订单(选银行卡支付):查询账户、查询限制规则,符合条件的就创建支付订单并跳转银行,此时不会有分布式事务问题,因为还不会跨服务改数据;

3、银行平台中创建交易订单:查找账户、创建交易记录、判断账户余额并扣款、增加积分、通知支付平台,此时也会有分布式事务问题(如果是服务化架构的话);

4、支付平台收到银行扣款结果:更改订单状态、给账户加款、给积分帐户增加积分、生成会计分录、通知电商平台等,此时也会有分布式事务问题;

5、电商平台收到支付平台的支付结果:更改订单状态、扣减库存、扣减积分、使用优惠券、增加消费积分等,系统内部各服务间调用也会遇到分布式事问题;

如上图,支付平台收到银行扣款结果后的内部处理流程:

1、支付平台的支付网关对银行通知结果进行校验,然后调用支付订单服务执行支付订单处理;

2、支付订单服务根据银行扣款结果更改支付订单状态;

3、调用资金账户服务给电商平台的商户账户加款(实际过程中可能还会有各种的成本计费;如果是余额支付,还可能是同时从用户账户扣款,给商户账户加款);

4、调用积分服务给用户积分账户增加积分;

5、调用会计服务向会计(财务)系统写进交易原始凭证生成会计分录;

6、调用通知服务将支付处理结果通知电商平台;

如上图,把支付系统中的银行扣款成功回调处理流程提取出来,对应的分布式事务问题的代码场景:

/** 支付订单处理 **/
@Transactional(rollbackFor = Exception.class)
public void completeOrder() {
orderDao.update();  // 订单服务本地更新订单状态
accountService.update();  // 调用资金账户服务给资金帐户加款
pointService.update();  // 调用积分服务给积分帐户增加积分
accountingService.insert();  // 调用会计服务向会计系统写入会计原始凭证
merchantNotifyService.notify();  // 调用商户通知服务向商户发送支付结果通知
}

本地事务控制还可行吗?

以上分布式事务问题,需要多种分布式事务解决方案来进行处理。

订单处理:本地事务

资金账户加款、积分账户增加积分:TCC型事务(或两阶段提交型事务),实时性要求比较高,数据必须可靠。

会计记账:异步确保型事务(基于可靠消息的最终一致性,可以异步,但数据绝对不能丢,而且一定要记账成功)

商户通知:最大努力通知型事务(按规律进行通知,不保证数据一定能通知成功,但会提供可查询操作接口进行核对)

龙果支付系统(开源版)

开源中国地址:http://www.oschina.net/p/roncoo-pay

http://git.oschina.net/roncoocom/roncoo-pay

GitHub地址:https://github.com/roncoo/roncoo-pay

在线支付演示:http://demo.pay.roncoo.com

后台运营管理:http://demo.pay.roncoo.com/boss

龙果开源支付系统业务介绍与部署

原创声明,本文系作者授权云+社区-专栏发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

编辑于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Python小屋

1900页Python系列PPT分享三:选择与循环结构语法及案例(96页)

总体说明:本套PPT共约1900页,包含董付国老师Python系列图书《Python程序设计基础》(2017年7月第5次印刷)、《Python程序设计(第2版)...

42910
来自专栏程序猿的那些趣事

优秀程序员的10条黄金法则!

这是一条非常值得遵循的伟大原则。我很习惯于回过头去检查自己写下的代码,重构那些被多次使用的部分。虽然在将一个长方法分解为若干个短方法时,会遇到一些困难。Ctrl...

824
来自专栏无原型不设计

3个细节,轻松区分效果图和原型图

产品设计是一个相对宽泛的概念,其中包含的内容不胜枚举。尤其对于新人小白来说,产品设计的分工分类着实令他们头痛。有些设计人员很多时候连自己画的到底是什么都不知道...

2515
来自专栏数据小魔方

柱形组图

今天要跟大家分享的图表是柱形组图! ▽▼▽ 今天要讲的图表与之前一篇条形组图有异曲同工之妙,都是通过在一幅图表中展示一个属性的多个数据指标,使之形成强烈对比,展...

3055
来自专栏钱曙光的专栏

一周极客热文:一位码农的几点思考

一位码农总结了自己的编程生涯,总结了以下几点: 对框架了解的越多,你才能用得更好。——更好意味着更快,更可靠,写出的代码更容易向上兼容。但另一方面来说,你得先停...

19610
来自专栏程序员互动联盟

怎样学习一门编程语言

1、选择一门语言 ? 2、确定你感兴趣的领域 你可以开始学习任何编程语言(尽管其中一些被描述地比其他的更加“易学”),你得去问自己自己想用通过学习这门语言完成什...

3589
来自专栏程序员互动联盟

开发同事辞职,接手到垃圾代码怎么办?

辞职的人留下一堆写的比较烂的代码,这种事情在十几年的编程生涯中遇到了好几次。即使代码再烂在没有预留充足的时间情况下,也不会轻易的改动,在有限的时间内先把能处理的...

592
来自专栏我分享我快乐

手机应用宣传设计思路演示

1、 内容整理 此广告主要内容为:“云安全保障全面针对网址和下载软件实施云安全监测,为您提供安全无忧的上网环境,远离木马和病毒” 2、 素材选取 素材选取...

30511
来自专栏web前端教室

【从入门到放弃】| 请问,你是在哪个“点”决定放弃的?

今天是15号,再有几天,我的1120期的前端零基础课就讲完一半了,现在已经进入第三部分的内容: 1、html、css、js、jq; 2、nodeJs、 3、电商...

1937
来自专栏非著名程序员

编程不息,Bug 不止

今天不想聊别的,就想聊点 Bug,是不是感觉我有点傲娇呢?昨天大家的留言我都一一仔细看完了,看完之后,就想到了一句话:生命不息,坎坷不止。2016年大家真的是被...

1649

扫码关注云+社区