这个问题,我刚刚看到另一个小伙伴也问了,已经回答过了,所以复制过来了,我觉得这个问题我们用一辆新旧车打比方最合适了,假如你有一辆旧车(老旧架构)。 如果边造轮子边优化呢,就像是你这辆车有些零件坏了或者不太好使,你就一个一个地去换更好的零件来让车能接着好好开。这样做的好处是车子(系统)一直能跑,不会一下子就瘫在那儿,业务不会受到太大的影响。而且你在换零件(优化)的过程中,还能慢慢了解这辆车(架构)到底是咋回事,不至于手忙脚乱。不过呢,这也有个麻烦的地方,就是你换来换去,可能最后发现这些新零件和旧零件拼在一起,还是有点小毛病,而且可能因为一直修修补补,有些地方还是挺乱的。 要是直接重构,就像是你不要这辆旧车了,重新造一辆新车。这样做如果成功了,那车(系统)就会非常棒,很符合现在的需求,而且也很整齐干净。但是风险也大啊,你在造车(重构)的时候,车肯定是开不了的(系统可能得停摆一段时间),这对业务影响就很大。而且造车的时候你要是有个小失误,说不定整辆车都报废了(重构失败)。 所以到底是边造轮子边优化还是直接重构,得看这辆车(老旧架构)现在有多破。要是还能开,业务也还能勉强维持,那可以先边造轮子边优化;要是这辆车已经破得不行,老是出大问题,业务都快进行不下去了,那可能就得咬咬牙直接重构了。
在对老旧架构升级,同时保证服务连续性且应对新需求时,需充分规划与评估,建立备份与回滚机制。采用迭代式升级,保持团队沟通与协作,确保每次迭代后的系统稳定。测试环节至关重要,需全面覆盖各种场景。同时,关注性能与稳定性,管理风险,确保数据安全。升级后,还需进行必要的培训,建立知识传递机制,并搭建监控体系,实时监测系统状态,及时发现并优化问题,保障系统持续稳定运行。整个过程需细心谨慎,确保服务不中断,满足新需求。
旧架构的升级也要想清楚核心的目的是什么,需要度量出来,例如:稳定性的收益、迭代的效率、成本等等,这样才能争取一定的技术债务重构时间获取项目上人力资源的支持。
其次老架构升级特别容易出现稳定性问题和质量问题和兼容性问题,绞杀者或者修缮者模式都是常见的架构平滑升级的手段,过程中做好回归测试、性能测试,以及契约测试。
多写测试案例。如果单元测试不多或根本没有,就多增加单元测试,再写代码,这样代码改起来比较有把握。
另外,可以同时改造系统架构。比如对于Web应用来说,以前的系统是用PHP开发的,可以把一些API请求分流到Go语言开发的新系统上去,只要做好Session共享,其他的CURD请求其实很容易在新系统中实现。
做好监控、灰度。
确实是个比较困难的问题。个人建议是串行进行,一次只干一件事,这就要看重构升级的选择时机。找一个合适的时机进行重构升级,先暂停新需求,可监控、可灰度、可回滚,等完成升级后再接新需求。
不然在升级过程中接新需求,新旧两边都要兼容,而且也容易出错。
个人观点,欢迎讨论。