交易系统之数据库弱依赖解决方案

张开发
2026/4/23 17:36:53 15 分钟阅读
交易系统之数据库弱依赖解决方案
数据库交易系统中最核心依赖数据持久化属于最核心服务。随着互联网的普及大流量高并发的场景越来越多7*24的交易系统对高可用要求越来越高同时在“数据为王”大环境下交易数据最终通过数据库进行持久化存储数据库成为整个系统最终重要服务不能出一点问题尤其核心P0系统哪怕瞬间的DB操作异常可能造成大量异常交易可能产生致命的问题所以核心系统弱依赖数据库都是必须考虑的。数据库弱依赖的整体思路将最可靠链路再增加上备用链路替换解决方案主要通过其他存储介质补偿机制替换同步的DB操作预期效果数据库出现故障期间也能保证系统运行正常不影响线上业务开展。本期介绍下实践过的三种解决方案DB灾备机制方案、DB高并发替换方案、财富系统弱依赖DB方案。一、DB灾备机制方案日常引发数据库操作出现异常的常见情况网络链路异常、执行工单导致数据库性能下降、慢SQL导致数据库异常等并且从发现问题到解决往往时间不短尤其核心交易链路都已无法容忍短时间的异常故障所以首先考虑增加灾备机制出现异常时间段内也要保证交易成功率哪怕可以损失一点性能要求。DB灾备机制方案是2016年接触到并实施第一版弱依赖数据库方案。方案主要思路DB操作故障时间段内通过其他存储介质临时存储数据并通过MQ异步补偿还原DB操作达到最终数据一致性。图1 DB灾备流程具体改造点1.DB操作增加灾备处理逻辑出现异常时将数据存储到缓存并发送MQ再通过消费MQ异步还原DB数据操作2.数据查询链路必须支持先查缓存再查数据库并且减少外部查询请求3.数据库的DB操作性能非常好毫秒级灾备处理链路同步操作入缓存MQ发送整体性能耗时变高了需合理设置MQ发送超时时间当时接入团队内部MQSender组件处理发送失败后异步自动重发提升灾备处理链路的成功率同时保障了MQ消息无丢失。二、DB高并发替换方案数据库的连接数是宝贵且有限凡是连接数据库的系统不可能无限进行机器扩容支持流量的增长同时数据库支持TPS也是有上限例如Mysql5.6.x版本建议最大500~1000之间尤其对高性能和高并发的系统来说在高要求的性能指标下数据库吞吐量成为支撑大流量的瓶颈如果通过增加数据库服务器成本往往也是无法承担。2018年有幸参与到P0核心交易系统的高可用升级项目目标将交易系统tps提升至2w以上当时20台数据库物理机单机单实例Mysql版本5.6.x在高性能指标要求下系统压测tps峰值最高可达到1~1.5w。为达成目标同时考虑资源成本项目升级改造方案思路通过缓存MQ组合将数据库操作完全异步化同时利用MQ消费批量拉取策略批量拉取数据进行DB批量操作减少数据库操作次数提升效率。中间件选择上充分利用缓存组件的高性能、高吞吐、支持连接数更大的优势保证了高性能同时也解决应用扩容问题。同时考虑到MQ平台上部署其他应用topic影响发送性能搭建单独独享MQ集群保证MQ发送的性能要求多次大促期间MQ发送耗时tp999都小于50ms。中间件达到高性能要求后将DB操作替换成同步入缓存发送MQ提升交易链路吞吐量压测结果也达到tps2w目标。图2 DB高并发替换具体改造点1.交易链路中DB操作全为insert无update满足了异步化后DB操作可进行批处理2.搭建单独MQ平台保证了MQ发送性能同时接入团队内部MQSender组件处理发送失败的异步自动重发保证整体链路的成功率3.缓存组件本身具备高吞吐量并且可快速扩容异步化后交易链路吞吐量大幅提升。同时缓存接入R2M、JIMDB双缓存针对不同机房设置主从操作例如金融机房同步主操作R2M异步操作JIMDB性能最优。双缓存机制防止单个缓存组件出现故障后可快速切换保证整体链路成功率4.异步化后通过MQ消费还原DB操作通过合理设置MQ拉取策略批量进行DB操作减少DB操作提升效率同时增加异步化延迟的UMP监控监控从交易发起到异步入库完整链路耗时可直观异步化后MQ消费能力便于动态调整5.减少外部系统的查询诉求统一以交易完成消息进行触达扭转必要查询请求全部查缓存上游要具备查询异常时重试机制。三、财富系统弱依赖DB方案财富交易系统参考以上两版方案并结合自身交易场景多、交易链路长、数据状态多情况。基于此设计出一版以流水数据驱动交易数据扭转的方案大概思路交易链路少变动交易数据的DB操作不变动增加中转层将交易链路DB操作转换为逐笔流水数据的持久化操作再异步消费MQ还原交易数据的DB操作通过将新增中转层做到弱依赖DB达到整个交易链路弱依赖DB。结合系统的流量现状查询流量大交易流量TPS未达上万当下主要目标加强交易链路的健壮性。流水数据持久化的操作并行执行DB入库、入缓存二者其一操作成功则直接返回成功并异步发送补偿操作的MQ如果DB出现故障期间缓存操作正常也可保证系统运行正常不影响线上业务开展。例如消费场景的弱依赖DB改造正常收到交易请求后首先业务校验防重幂等创建订单扣减用户份额更新订单状态将创建订单、更新订单状态的操作改造为创建两笔流水数据的操作交易链路不进行大的改造前提下通过将流水数据持久化做到弱依赖DB这样交易过程中即使DB出现故障时只要缓存组件正常运行即可保障消费交易正常完成再通过异步消费MQ还原创建订单、更新订单的操作。方案落地后得到了很好的验证曾经历过数据库因执行大的变更工单导致数据库出现性能故障消费交易链路不受影响保证业务正常运行和用户体验。图3 财富系统弱依赖DB方案具体改造点1.中转层流水数据持久化核心操作并行执行DB的insert操作、入缓存二者其一操作成功则直接返回成功并异步发送补偿操作的MQ2.消费MQ异步还原交易库的DB操作时通过数据中状态位保证MQ消费的顺序执行3.流水库和缓存的双向同步如果流水库或缓存出现故障时异步进行相互补偿存储目前流水库存储全量流水数据。4.交易链路主要改造两点一、防重幂等以流水数据为准流水数据查询是合并缓存和DB数据后返回二、交易数据调用DB操作切换到创建流水数据的操作总结以上数据库弱依赖的技术方案更适用于数据偏流水式的交易系统随技术迭代和业务发展技术方案也层出不穷并不断迭代创新欢迎大家跟我们研发团队交流沟通共同进步。

更多文章