如何设计可落地的重构技术方案——理论篇

简介: 如何设计可落地的重构技术方案——理论篇

一、 写在前面

最近重构项目比较多,写了好几个系统重构方案,很多朋友问,写重构技术方案,有没有什么套路或者框架,都需要做哪些调研和准备工作,这篇文章就重点聊一聊,如何设计可落地的重构方案。


二、重构有没有套路

有套路,多年重构经验表明,我重构已经形成了自己的一套固定模式,然后在这套模式之上,根据业务场景不断的变通,可以说,重构是经验的积累。所以在设计重构方案阶段,就能够避免一些后续的坑。当然也不能完全避坑,因为总有你没有考虑到的地方,这个时候我们要做的,就是如何把风险降到最低,这个也是重构方案的一部分(灰度方案)。


三、什么是重构

想必每一个技术开发都深有感触,很多人到一个新的团队,都会吐槽原来的代码写得乱,扩展性难,历史包袱重。想要重构,却不知道如何下手;也有一些说要重构,但是很多在我看来对于重构没有一个正确的认识。

下面我说几点解释一下:

1. 重构不是重写

做过开发的同学都知道,重写很简单,按照产品的需求,实现需求就好了,没有历史包袱。但是重构是在原有的基础上改,有很多限制性,大框架不能改,对外接口不能变,存储结构设计限制等等。


2. 不要轻易批判前人的代码

大家要相信一点,存在即合理,原来这么设计,一定有它的原因。可能当初调用量不大,可能当初业务场景限制,可能当初资源限制等等,你没有经历过,就不能感同身受。所以不要轻易去批判, 既然直到现在,这个业务场景还在迭代,甚至要面临重构,至少说明该业务场景,甚至是商业场景是成功的。


3. 重构方案先行,落地可分期进行

有时候,我们面临的系统大庞大,历史包袱重,不知道从何处下手,或者说做完重构需要很长的时间。即便是这样,我们的方案也一定是设计完备的(甚至要和产品沟通以后可能增加的业务场景),不仅要考虑到如何解决现在的问题,还要考虑到之后的扩展性问题,然后再任务拆分,分期进行,一期做哪些,二期做哪些。另外一期重构时间不宜过长,要考虑到投入产出比问题。


4. 不要过度设计,不要为了重构而重构

有时候,我们通过调整参数,调优就能解决的问题,就不需要大动干戈。重构一定是在最后一环,万不得已的情况下进行的。例如: 1、性能瓶颈,无法扩展,2、无法满足现在的业务迭代


四、 写重构技术方案需要做哪些调研

调研可以说是写重构技术方案非常重要的一个环节,往往能够避免很多不必要的坑。


1. 历史痛点在哪里

我们先要通过一定手段,比如:压测,监控等等, 先找到影响原来性能和问题的原因是什么,痛点是什么。只有知道原来的痛,才能知道如何对症下药。


2. 调研新的技术方案

例如原来的存储用的Redis,现在想引入Mysql,那么Mysql能不能支持现在的业务场景(可能需要通过写demo压测),它又有哪些优势(和原来对比)。亦或者本次要引入新的组件,那么组件可能选择性有很多,选择哪一种比较合适需要有横向对比等等。


3. 梳理业务&影响范围

例如需要梳理出所有的对外接口,这些接口目前线上的高峰期QPS,RT,995耗时是多少,都有哪些调用方。目前系统相关的表是否是独立可控的,SQL语句都需要汇总统计(这个主要是分库分表的时候考虑,因为要考虑到SQL拆分,分库分表的ShardingKey 和 分库分表之后的查询问题)


五、设计技术方案

  1. 先画出整体架构图[重构前(可选)、重构后],再画出核心流程图
  2. 表结构设计(分库分表),分表情况下要根据目前线上使用场景对分表shardingKey做一个离散度分析。


六、设计灰度方案

技术方案明确之后,再考虑如何灰度,按流量灰度,还是城市,还是开关控制。


七、核对方案

调研阶段梳理的对外接口派上用场了,需要针对每一个对外接口,job脚本,consumer任务等,标注重构改造方案。这个过程也会发现一些细节上的问题,从而完善技术方案。


八、数据校验方案

  1. 可以利用目前线上请求的log,流量回放的方式请求新接口,然后对比一下返回数据是否和老的一致。
  2. 如果对表结构有改造,需要对比新老数据是否一致(排除不需要对比字段)
  3. 灰度阶段可以同时请求新老接口,对比返回数据是否一致。


九、任务拆分

对本次改造需求进行拆分,一期做哪些列举出来 和 二期大概规划。


十、技术方案评审

可以先组内小范围评审,先解决内部可能存在的问题。内部沟通完之后,再组织跨部门技术评审会议。


十一、总结

这篇文章主要讲一下写重构技术方案理论篇,很多都是大家知道的一些道理,但是我想说,这其中有很多细节需要确认,还需要和产品,或者其他组同学沟通。方案是否可落地,除了经验之外,还需要各种测试和调研。

下一篇文章将给大家讲一讲重构技术方案——实战篇,以我们线上真实重构——乘客排队系统重构场景为例,我是如何一步步写重构技术方案以及后续如何落地的。

欢迎关注、不定期分享原创文章。

相关文章
|
5月前
|
存储 缓存 NoSQL
概念、场景技术方案选择的理解
概念、场景技术方案选择的理解
25 0
|
7月前
|
存储 NoSQL 关系型数据库
重构之道:揭秘大规模系统重构的经验与挑战
重构之道:揭秘大规模系统重构的经验与挑战
162 2
|
11月前
|
算法 数据挖掘 计算机视觉
模型落地困难?看看这个如何解决PTQ的振荡问题(二)
模型落地困难?看看这个如何解决PTQ的振荡问题(二)
160 0
|
11月前
|
机器学习/深度学习 算法 计算机视觉
模型落地困难?看看这个如何解决PTQ的振荡问题(一)
模型落地困难?看看这个如何解决PTQ的振荡问题(一)
133 0
|
11月前
|
存储 数据可视化 架构师
「方案架构」“解决方案架构”日常思维
「方案架构」“解决方案架构”日常思维
|
敏捷开发 架构师 算法
重新审视演进式设计
重新审视演进式设计
重新审视演进式设计
|
数据采集 存储 编解码
在架构师的角度去看大型网站架构面临的挑战:技术架构的基本思路
技术架构的基本思路 技术架构既要清晰地划分功能模块或子系统,又要对整个网站系统的技术逻辑有清晰的认知。庞大的技术架构确实会让人望而却步,架构设计也变得无从入手。 如果把一个庞大的技术架构分成独立的几部分,然后再逐一深入的话,那么一个庞大的技术架构也不是不可理解的
|
敏捷开发 架构师 项目管理
架构师才能看懂的大型网站架构面临的挑战:业务架构的基本思路
业务架构的基本思路 大型网站系统有很多功能,一次性明确所有的功能需求并设计出一个庞大的业务架构是一件费力不讨好的事情。因为在项目前期,难免会忽视一些琐碎功能,而随着开发的进行,也会有很多新的想法产生,基本上不会存在完全按照最初的业务架构设计完成的软件产品。因此,业务架构不仅要做到“规整功能模块,厘清产品业务逻辑”,更重要的是如何做到“有规划性地应对项目过程中的需求变更”。
|
设计模式 JSON 测试技术
项目重构演进之路
项目重构演进之路
556 0
|
存储 监控 安全
【组装式架构设计】“有机”架构思维的探寻-交付那些事
软件架构本身是一个宏大的概念或命题,但历经过往种种,开始有些思考在脑海中,挥之不去,在此整理出来,和大家一道探寻,这是一篇关于“类比”的探寻。
512 0
【组装式架构设计】“有机”架构思维的探寻-交付那些事