【架构艺术】大规模业务逻辑迁移实践

对于一个成熟的工程项目而言,因为项目未来发展或是和企业内部更深度融合的需要,我们可能需要对既有业务逻辑做很大规模的改动,涉及到多方面的逻辑迁移和代码重构,才能够达到下一代产品所需要的效果。

今天这篇文章,就来剖析一下如何做好这件事情,尤其是在历史积淀非常厚重的场景,需要通过怎么样的手段,把这个问题解决好。

首先第一件事情是,了解背景。为什么要做这件事情,它对于团队和公司的业务价值以及技术层面的价值在哪里?从一个打工人的视角,一个大规模的业务逻辑迁移,背后一定是有大团队甚至公司层面的底层逻辑在牵引,如果作为负责人不去了解底层逻辑,那也就不好把握业务迁移的方向,最终就有满足不了技术跟产品效果的风险。

好比说,从业务角度,通过优化性能和线上表现问题,明确历史遗留潜规则,提升用户使用体验,减少用户适应成本,提升工程项目在公司内部的影响力,成为更加统一化的标准。这些都可能是这个项目做大规模迁移的理由。然后,从技术角度上,比如通过重构代码,整个项目能够呈现更加干净简洁的代码实现,更加统一的关系结构和逻辑思路,更高内聚,更易扩展,提升项目代码和服务架构的可扩展潜力。这些也都是业务迁移工作可以随之带来的技术价值。充分了解完这件事情的背景之后,我们就可以更加精确地下手。

做业务逻辑迁移,最重要的一点是,要维持原先的产品表现。为了达到这个效果,我们可以考虑很多种技术手段,比如代码重构就是一种最直接的方式。但是,除了代码重构之外,有没有更好的方式?比如重新写一个工程,或者把某些模块作为单独的服务拆分出来?或者说,在当前这个场景下,为什么重构既有代码是最好的解决方式?有什么理由可以论证这一点?这些,都是在准备工作过程中需要思考的问题。

有些时候,为了满足咱们负责人自身的技术信仰和控制欲,重写工程就是一种最完美的手段。但是,重写工程耗时耗人力非常大,并且会改变用户习惯,所以现实上不一定是最好的方法。但如果说,既往工程和某些特定的场景耦合度太高,但代码质量太差,导致代码无法拆分,技术层面上完全不满足要求。这个时候,就可以考虑重写,不仅可以实现效果,也可以解决很多以往的技术问题,一举两得。

拆分服务,也是一个可以选择的举措,但前提是要重构的部分是独立的模块,容易被单独提出来。如果说既往的代码关系繁杂,存在很多潜规则,内部之间存在很多一时半会不能厘清的依赖,那么在业务逻辑升级期间,同时盲目拆分服务,也是具有风险的,所以一个合适的举措是先重构既有代码,再在重构的基础上去拆。此外,拆分服务本身也会引入额外的服务架构复杂度,所以一定要明确拆分服务可以解决的问题,比如说加快部署速度,减少非核心模块对L0服务带来的影响,都可以成为拆分服务带来的价值。

所以最终,业务逻辑迁移,还是必然会走到代码重构环节。那么重构要怎么做?怎么样能够保证重构先后,用户体验不受影响?有一个合适的思路是,通过配置开关,控制业务逻辑走到既往的链路,还是升级后的链路。当然在此之前,我们需要了解整个代码的脉络,业务链上每一个环节的职责,然后需要对每个环节构造测试用例,什么场景测什么,以便在重构时候可以随时验证。对于配置的开关,也不单纯是一个true-or-false的粒度,粒度可以设置的更细,更加倾向于一个灰度filter的设计——在业务逻辑的前置判断中,如果灰度则走新的逻辑,没有被白就是走老的逻辑。通过开关机制,我们可以兼容业务迁移过程的各类中间态,从而满足用户无感的需要。

这里需要注意的一点是,由于中间态的存在,那么在内测和灰度过程中,势必有很多需求需要双写到老的逻辑和新的逻辑。多人开发场景下,如果团队内部没有对齐这个口径,那么就会有新老逻辑效果不一致的风险。要解决这个问题,就需要保证团队内部对这件事情也能达成一些共识,尤其是需要同步这次迁移对于团队内成员做开发工作的影响。通过减少口头上的信息差,从而减少代码上的信息差。

之后是迁移的执行。大规模的业务逻辑迁移总是有风险的,因此从产品角度,对核心用户同步风险,做公告周知,对所有用户同步迁移事项以及需要改变的用户习惯,都是一个责任人需要做的事情。在迁移实操方面,也需要做到有内测、灰度放量、全量放量的过程,好比说涉及到数据迁移,放量可以遵循10%->30%->60%的原则,策略方面可以根据用户的体量和不同业务的数据存储量来决定具体放量的内容,这样就兼顾数据迁移的效率和安全性。

当然,比起对外周知风险,对内也需要做好稳定性保障,保障业务逻辑迁移过程中风险尽量减少。首先,我们可以通过一系列业务监控和服务监控来做一个大致的把握,比如业务指标方面观察事务成功/错误率,事务/结果量级的变化,服务监控关注latency、错误日志、错误请求、panic崩溃以及cpu/memory之类通用容器的监控。其次,对于业务效果,我们也可以在某些走新业务逻辑的case里,同时灰度一些用户无感的老业务逻辑流程,做一下abdiff,从而直观对比最终的迁移效果。通过这些手段,就可以在线上迁移之前,尽可能在线下发现更多的问题,减少线上风险。

最后一点,就是大规模的迁移,最好是和原来的效果保持一致,原则上尽量不要引入其他业务机制层面的的革新。用户对于产品的玩法是丰富多样的,甚至比产品更了解产品,比如游戏,玩家的攻略能力永远领先于游戏策划,玩家发现bug的能力永远领先于游戏测试。迁移过程本身就可能会改变很多用户习惯,所以如果迁移之后,还顺带做一些机制上的革新,那就有违背用户习惯的风险,最终就会导致产品表现不符合预期。如果一定要在迁移期间做一些机制上的变动,那么在线下就需要做充分的用户行为调研,否则建议是在迁移之后,根据用户具体的反馈,再选择性下手。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/48276.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

优选算法之滑动窗口(下)

目录 一、水果成篮 1.题目链接:904.水果成篮 2.题目描述: 3.解法(滑动窗口) 🍁算法思路: 🍁算法流程: 🍁算法代码1(使用容器): …

数模·插值和拟合算法

插值 将离散的点连成曲线或者线段的一种方法 题目中有"任意时刻任意的量"时使用插值,因为插值一定经过样本点 插值函数的概念 插值函数与样本离散的点一一重合 插值函数往往有多个区间,多个区间插值函数样态不完全一样,简单来说就…

C的预编译指令

预编译指令 #include对于形如 #include "demo.h" 的指令&#xff1a;对于形如 #include <demo.h> 的指令&#xff1a; #define简单宏替换带参数的宏 #ifdef, #ifndef, #if#pragma#error#line 在C语言中&#xff0c;预编译指令用于在编译之前进行代码的预处理。…

etcd磁盘空间故障处理办法

查看etcd状态 etcdctl --cacert=/etc/kubernetes/ssl/ca.crt --cert=/etc/kubernetes/ssl/etcd_server.crt --key=/etc/kubernetes/ssl/etcd_server.key --endpoints=https://10.10.10.31:1159,https://10.10.10.32:1159,https://10.10.10.33:1159 endpoint status --write-…

【系统架构设计 每日一问】二 MySql主从复制延迟可能是什么原因,怎么解决

主从复制的架构设计如下图所示&#xff1a; 同步原理 具体到数据库之间是通过binlog和复制线程操作的&#xff1a; Master的更新事件(update、insert、delete)会按照顺序写入bin-log中。当Slave连接到Master的后,Master机器会为Slave开启&#xff0c;binlog dump线程,该线程…

24、获取NCL色标并将其保存为Excel文件

文章目录 1. 前言2. 代码 1. 前言 在数据可视化的世界里&#xff0c;色彩不仅仅是视觉的盛宴&#xff0c;更是信息的传递者。NCL&#xff08;The NCAR Command Language&#xff09;色标&#xff0c;作为气象和环境科学领域的瑰宝&#xff0c;以其丰富的色彩组合和科学的编排&…

Linux指令ros学习python深度学习bug学习笔记

## 这个文件是关于ros、linux指令&#xff0c;pytorch、python、onnx和相关problem的一些笔记 ### ROS && linux **find: 在当前路径或指定的路径下递归地搜索文件或目录&#xff0c;并可以根据不同的条件进行过滤和匹配。** find -name *.py find /home/dai/bev_…

H3CNE(计算机网络的概述)

1. 计算机网络的概述 1.1 计算机网络的三大基本功能 1. 资源共享 2. 分布式处理与负载均衡 3. 综合信息服务 1.2 计算机网络的三大基本类型 1.3 网络拓扑 定义&#xff1a; 网络设备连接排列的方式 网络拓扑的类型&#xff1a; 总线型拓扑&#xff1a; 所有的设备共享一…

Vue3 --- 路由

路由就是一组key-value的对应关系&#xff1b;多个路由&#xff0c;需要经过路由器的管理。 1. 基本切换效果 安装路由器 npm i vue-router /router/index.ts // import { createRouter, createWebHistory } from vue-router import Home from /components/Home.vue import…

Python面试整理-字典和集合的操作

在Python中,字典(dictionary)和集合(set)是两种非常有用的数据结构,用于存储和操作数据集。字典是一种键值对的集合,而集合是一种只包含唯一元素的集合。下面详细介绍它们的常用操作: 字典操作 创建字典 person = {"name": "Alice",

萝卜快跑爆火的背后,美格智能如何助力无人车商业化?

近期&#xff0c;“订单量超过600万单”等夺人眼球的信息&#xff0c;让无人驾驶出租车“萝卜快跑”从江城武汉爆火出圈&#xff0c;在2024年的炎炎夏日为这座大火炉再添了一把火。热度背后&#xff0c;不少地方主管部门&#xff0c;近期也纷纷针对无人驾驶出租车、无人驾驶运输…

基于术语词典干预的机器翻译挑战赛笔记Task2 #Datawhale AI 夏令营

上回&#xff1a; 基于术语词典干预的机器翻译挑战赛笔记Task1 跑通baseline Datawhale AI 夏令营-CSDN博客文章浏览阅读718次&#xff0c;点赞11次&#xff0c;收藏8次。基于术语词典干预的机器翻译挑战赛笔记Task1 跑通baselinehttps://blog.csdn.net/qq_23311271/article/d…

C++树形结构(2 树的直径)

目录 1.定义&#xff1a; 2.直径的性质&#xff1a; 3.树的直径求解方法&#xff1a; 4.直径端点求解方法&#xff1a; 朴素方法&#xff1a; 优化方法&#xff1a; 5.例题&#xff1a; 6.直径公共点&#xff1a; 7.例题&#xff1a; 8.去掉再加上&#xff1a; 9.例…

最新版kubeadm搭建k8s(已成功搭建)

kubeadm搭建k8s&#xff08;已成功搭建&#xff09; 环境配置 主节点 k8s-master&#xff1a;4核8G、40GB硬盘、CentOS7.9&#xff08;内网IP&#xff1a;10.16.64.67&#xff09; 从节点 k8s-node1&#xff1a; 4核8G、40GB硬盘、CentOS7.9&#xff08;内网IP&#xff1a;10…

【极客日常】Golang一个的slice数据替换的bug排查

上周某天下班前&#xff0c;接到同事转来一个bug要排查&#xff0c;症状是代码重构之后某些业务效果不符合预期&#xff0c;由于代码重构人是笔者&#xff0c;于是blame到笔者这边。经过10min左右的排查和尝试后&#xff0c;解决了这个问题&#xff1a;既往逻辑没有改动&#x…

框架使用及下载

Bootstrap5 安装使用 | 菜鸟教程 (runoob.com) https://github.com/twbs/bootstrap/releases/download/v5.1.3/bootstrap-5.1.3-dist.zip&#xff08;下载链接&#xff09; Staticfile CDN&#xff08;html的所有框架合集&#xff09; 直接在w3cschool里面看参考文件进行搜索自…

时间序列问题解题(基于深度学习)(Datawhale AI 夏令营)

一&#xff0c;解题步骤 时间序列问题是指基于时间顺序的数据进行分析和预测的问题。在深度学习的背景下&#xff0c;常用的模型包括循环神经网络&#xff08;RNN&#xff09;&#xff0c;长短期记忆网络&#xff08;LSTM&#xff09;和门控循环单元&#xff08;GRU&#xff0…

RHCSA —— 第八节 (编辑器、编辑命令等)

Vi/vim编辑器 vim 编辑器 就是相当于在windows中创建一个记事本&#xff0c;一个word文档里面进行编辑所需要的内容。在linux中编辑文本文件&#xff0c;包括但不限于编辑源代码、配置文件、日志文件等文件内容。 三种模式 这是在编辑器中存在三种模式&#xff1a;命令模式、…

vue中的some方法使用@1@

1.Vue中的some方法是一个数组方法&#xff0c;用于检测数组中是否至少有一个元素满足指定条件。它的用法和作用类似于JavaScript中的Array.prototype.some()方法。 2.在Vue中&#xff0c;使用some方法可以对数组进行条件判断&#xff0c;以确定数组中是否存在满足条件的元素。…

[经验] 驰这个汉字的拼音是什么 #学习方法#其他#媒体

驰这个汉字的拼音是什么 驰&#xff0c;是一个常见的汉字&#xff0c;其拼音为“ch”&#xff0c;音调为第四声。它既可以表示动词&#xff0c;也可以表示形容词或副词&#xff0c;意义广泛&#xff0c;经常出现在生活和工作中。下面就让我们一起来了解一下“驰”的含义和用法。…