系统重构新旧流量平滑迁移方案

ops/2024/10/16 0:23:14/

背景

旧交易系统存活时间比较久,随着组织架构的不断调整,旧交易新系统在各个团队轮转,技术和代码腐化严重,针对于新业务支持能力很差。

经过内部慎重决策,在旧交易系统基础上,针对技术和业务上进行重构,期望新架构在技术和业务上有一个良好的扩展性。

作为交易系统最为重要的就是稳定性,所以,如何让前置流量从旧系统平滑迁移至新系统,成为了我们现在主要解决的问题。

系统定位:B端交易系统
系统角色:分销商、平台主体、系统商

架构图

在这里插入图片描述

问题点

  1. 系统的稳定性:如果新系统交易链路出现异常怎么办?容错性?可监控?可灰度?可回滚?
  2. 订单一致性:新旧数据如何处理?是否需要迁移?留痕?冷库备份?

技术方案

同步收单

目的

同步收单主要考虑两点:

  1. 为了后续流量平滑迁移做准备
  2. 检查交易履约链路能力

关注点

同时需要注意的点:

  1. 新系统上线同步收单之前,一定要经过严格的QA测试,尽可能规避线上的一些问题
  2. 关于新交易系统依赖的域内服务和域外服务一定要保证幂等性
    1. 支付:避免一笔订单重复支付(如果支付平台服务能力支持幂等性,自己针对业务逻辑处理好就可以,比如,发现已经支付过了,等同于支付成功处理)
    2. 扣库存:避免一笔订单重复扣库存
    3. as so on
    4. 针对上述这些外部服务能力,可以做开关(配置中心)把控,正式切流之后将开关放开。
  3. 考虑到新旧架构订单号不一样,所以在履约能力处须mock掉订单号,以分销商ID和分销商订单号作为唯一标识(直连服务需提供元数据能力,即给你传一个元数据,需要给我原封不动传递回来)

域能力

在这里插入图片描述

增量数据核对

  1. 同步收单之后,务必要做好监控措施,针对交易履约能力的问题点及时发现和处理。

  2. 针对已经收单的增量订单,做好数据核对,可以及时发现系统问题。

    1. 量级不大,在本地库表写个定时任务写代码(连接双库客户端)比对就可以。
    2. 量级大,将双份数据同步到离线数仓,写sql比对也可以
    3. 如果考虑到实时性,可以在从库做sql比对
  3. 旁路验证策略:在旧系统每个交易节点读取数据的时候,发送一个旁路验证事件,去查一遍新库,做一下数据比对,如果不一样,及时告警,及时处理。

切流放量

方案

切流之前务必将一些开关和mock的接口放开。

经过同步收单后,系统收单能力基本趋向正常,这时候要逐步切流。
切流阶段:

  1. 5%:主要针对各个交易环节,成单率作为核心监控点,一周时间为期限
  2. 20%:主要观察业务指标和系统水位,一周为期限。
  3. 50%:此时,流量已经达到一半,要对系统整体稳定性做出考量,该扩容就扩容,该限流就限流。
  4. 100%:持续观察业务指标和系统水位,一周为期限。

设计

流量比率由【直连网关系统】统一由调度策略组件配置分发。

履约回调之时,通过新旧订单标识将流量召回,也由直连网关统一调度。

在这里插入图片描述

订单同步

此时,订单数据存在两份,一个是旧系统的订单,还有一个是新系统的订单。

针对于订单数据是否需要同步的问题就要从业务的维度去做考量。

我们交易系统定位是B端交易,所以暂不涉及订单的实时查询,直接将新旧数据库同步到买家库和卖家库即可,当前,进行订单数据双写的时候我们新系统的增量数据是脏数据,在同步到买家库和卖家库之前清除脏数据即可。

在这里插入图片描述

如果是C端订单,用户可能需要实时的查看订单列表,此时,我们的方案就有一点问题。

  1. 首先我们的订单号要保持一致,不能在同步双写的时候,写入两个系统的订单号不一致,这样后期订单数据同步的时候,数据就混乱了(当然也可以通过其他方式去避免,比如选取不同的唯一标识);
  2. 其次,在切流之前要将旧系统的存量数据同步到新系统的数据库中(这里要注意分库分表策略);
  3. 进而,进行存量数据核对;

在这里插入图片描述

系统下线

当新系统完成切流之后,需要观察一星期以上,方可将旧系统下线,主要是考虑到新系统的稳定性,可随时将流量切回旧系统。

在这里插入图片描述


http://www.ppmy.cn/ops/94969.html

相关文章

15.2 Scikit-learn简介与常用模型

欢迎来到我的博客,很高兴能够在这里和您见面!欢迎订阅相关专栏: 工💗重💗hao💗:野老杂谈 ⭐️ 全网最全IT互联网公司面试宝典:收集整理全网各大IT互联网公司技术、项目、HR面试真题. ⭐️ AIGC时代的创新与未来:详细讲解AIGC的概念、核心技术、应用领域等内容。 ⭐…

PHP模拟高并发异步请求测试+redis的setnx处理并发和防止死锁处理

/** PHP并发异步请求测试* /test/curlMulti*/public function curlMultiAction(){$urls ["http://localhost:801/api/order/create","http://localhost:801/api/order/create","http://localhost:801/api/order/create","http://localhos…

【Nodejs】五、Node.js 模块化

一、介绍 1.1 什么是模块化与模块 ? 将一个复杂的程序文件依据一定规则(规范)拆分成多个文件的过程称之为 模块化 其中拆分出的 每个文件就是一个模块 ,模块的内部数据是私有的,不过模块可以暴露内部数据以便其他 模块使用…

使用 Python 进行 PDF 文件加密

使用 Python 解密加密的 PDF 文件-CSDN博客定义一个名为的函数,该函数接受三个参数:输入的加密 PDF 文件路径input_pdf、输出的解密 PDF 文件路径output_pdf和密码password。https://blog.csdn.net/qq_45519030/article/details/141256661 在数字化时代…

顶顶通呼叫中心中间件-通话之前录音配置方法(mod_cti基于FreeSWITCH)

顶顶通呼叫中心中间件-通话之前录音配置方法(mod_cti基于FreeSWITCH) 1、修改配置文件 点击配置文件 -> 点击vars -> 根据图中配置 -> 点击提交XML ->重新启动freeswitch 修改成true就是电话接通开始录音&#xff0c;修改成false就是通话之前开始录音。 <!--应…

Qt 系统相关 - 网络与音视频

目录 一、Qt 网络 1. UDP Socket 1.1 核心 API 概览 1.2 回显服务器 1.3 回显客户端 2. TCP Socket 2.1 核心 API 概览 2.2 回显服务器 2.3 回显客户端 3. HTTP Client 3.1 核心 API 3.2 代码示例 二、Qt 音视频 1. Qt 音频 1.1 核心API概览 1.2 示例 2. Qt 视…

Vue项目-Table添加Form表单校验

一、HTML <template><div class"taskInfo"><el-form:model"generateParams":rules"formRules"ref"formRef"class"taskInfoForm"label-width"100px"><ul class"taskInfoSearch"&g…

深兰科技创始人陈海波入选“2024先锋科创家?硬科技商业先锋榜”

8月14日&#xff0c;2024先锋科创家系列榜单揭晓&#xff0c;深兰科技创始人、董事长陈海波先生凭借创新精神和商业洞察力成功入选&#xff0c;荣登“2024先锋科创家•硬科技商业先锋榜”。 该榜单评选由财联社《科创板日报》联合上海科学技术情报研究所(ISTIS)共同发起&#x…