网易支付-分布式事务
开篇说明
今天碰巧加了个群,听了堂课,当然了最后还是卖课的。两个小时左右,大佬讲了关于网易支付中的分布式事务内容,把课堂内容分享下。
网易支付-架构介绍
这部分主要在讲支付业务中的一些概念。
- 支付是货币债权从收款人向付款人的转移
- 客户点击支付,调用网易支付,网易支付要做电子货币与真实货币的清算,对应到银行,银行和客户清算真实货币
- 复式记账法:指对发生的每一笔业务,都以相等的金额,在相互联法
网易支付账户管理体系
- 支付账户类型
- 个人账户:面向个人客户的电子货币账户
- 企业账户:面向企业客户的电子货币账户
- 内部账户:根据网易支付自身结算和管理需要而设立的电子货币账户
- 信息类型
- 账户基本信息:包括账户、余额、类型、状态等
- 账户明细信息:包括该账户所有资金变动明细等
网易支付财务管理体系
- 缓冲记账
对于资金进出频繁的账户,特别是内部账户,会遇到并发处理的瓶颈问题,无法实时更新账户余额,甚至可能导致锁竞争引发系统故障,所以有必要引入缓冲记账 - 缓冲记账实现原理
对于有大量并发账务请求的账户进行异步账务处理,不实时创建账户明细和更新账户余额,记账信息登记在缓冲区,定时对一段时间内的一批缓冲账务请求进行汇总记账并更新账户余额。
其实这个和mysql的缓冲池原理、redis缓存是一样的,大家有时间可以理解下。
网易支付会计核算体系
- 会计核算体系
资产类的余额为借方,负债类余额为贷方,共同类科目根据实际情况区分,遵循【资产类=负债类+共同类】的恒等式。 - 资金平衡关系
网易支付采用复式记账法来保证系的两个或两个以上账户同时进行登记的方式进行会计核算系统资金平衡。复式记账法是指对发生的每一笔业务,都以相等的金额,在相互联法
资金平衡
- 会计原则:有借必有贷,借贷必相等
- 会计恒等式:资产 = 负债 + 共同(所有者权益)
- 资产增加记为“借”,资产减少记为“贷”;负债增加记为“贷”,负债减少记为“借”。
分布式事务原理
单体服务死锁的解决
具体业务场景是彩票开奖
需要在开奖后极短时间内完成所有中奖用户的派奖,派奖过程再支付侧的处理主要是从商户大账户的资金转账至用户账户,会产生比较严重的瞬时高并发以及数据库锁竞争的问题。经常会产生加锁顺序不一致导致的死锁问题。
解决:对记账模块进行重构
将所有涉及账户资金操作抽象成统一的记账服务接口。同一事务内根据账号从小到大排序后顺序加锁,这样就避免了产生死锁的情况。
热点账户降低锁竞争热度
热点账户的记账请求先缓存到队列中,再由异步任务批量汇总记账。
- 好处
- 能起到削峰填谷的作用,将瞬时的高并发请求改为按队列顺序执行
- 将多个记账请求合并成一次事务操作,减少了对账户锁的次数
采用缓冲入账的账户限制,异步记账可能会产生账户透支的情况,所以这个功能只对内部大商户账户开白名单
全局事务DTP模型
全局事务:事务由全局事务管理器全局管理
事务管理器:管理全局事务状态与参与的资源,协同资源的一致提交/回滚
TX协议:应用或应用服务器与事务管理器的借口
XA协议:全局事务管理器与资源管理器的接口
局限
- 故障影响大、恢复困难
- 复杂、更多架构与平台
- 更高协议成本 管理器
- 脆弱 故障点多
二阶段提交
TCC介绍
TCC实现介绍
- 锁的范围尽可能小,时间跨度越短越好
- seata支撑了TCC方案
- TCC的cancel是做补偿,而不是回滚
总结
本文只做学习用,贴的图也只是课堂截屏,侵删。听完大佬的一席课,如听一席课。这些还都只是业务架构方面的,技术可选的就多了去了。java之路尤长,技术做好了就拼经验,保持成长,我们一起加油呀!