我们在实际开发系统的过程当中,很有可能会遇到需要进行系统重构升级的情况,需要重构的原因可能是之前的设计不合理,导致现在维护起来非常的困难,也有可能是现在的业务发展非常迅速,需要进行分库分表了又或者之前用的是单机的本地的文件存储,现在需要用到统一的网络存储。总而言之,就是当初的系统设计已经不符合现在发展需要了,需要进行重构和升级。
而这其中会可能会涉及到代码逻辑的变更,数据存储的变更(如DB或者文件存储等)或者第三方接口的变更。在这样一个新旧的切换过程当中,怎么样才能让用户无感知,平稳地进行过渡?
有人说可能说可以停服,然后迁数据,迁完后切新逻辑,然而先不说会有一段不可接受的不可用时间,就说在迁移过程中,我们如何保证能一次迁移成功呢?再退一步,就算数据迁移成功了,但是如果代码逻辑有漏洞,我们又该如何快速回退到旧版本呢?这可不单单是切回旧代码就好了,要知道这段时间可能产生了新版本的数据,这些新数据可也要迁回旧版本。
重构升级系统的过程可能会遇到这么多问题,那我们有什么办法可以平稳且用户无感知地完成系统升级吗?今天就给大家提供一个通用的系统重构升级的框架。里面很多具体的逻辑得按不同系统的实际情况来,但是整体思路却是通用且可靠的。
我们先来模拟一个简单的场景,并看看实际情况中应该如何操作。
假设我们一开始有个users
表存储学生数据,表结构以及一些数据如下:
后面随着业务发展,我们需要记录学生的语文成绩,然后我们在users
表加了score
字段,如下
过一段时间我们发现又需要记录数学分数了,后面还可能需要记录英语分数等等。这时候不可能一次次加字段,现有的表设计又极不满足我们的需求,所以只好对现在的系统进行重构升级了。我们想用两个表来存数据:
students
表
mark表
这时候我们会面临几个问题:
如何来升级呢?
```
if($is_dev){
//新逻辑:如增删改查students表和mark表
}else{
//旧逻辑:如增删改查users表
}
```
```php
//新写入逻辑:如增删改students表和mark表
//旧写入逻辑:如增删改users表
if($is_dev){
//新读取逻辑:如查students表和mark表
}else{
//旧读取逻辑:如查users表
}
```
users
表的数据迁到students
表和mark
表users
表和students
表、mark
表的数据进行对账,如果有数据不一致的情况,说明我们之前双写的时候有遗漏的地方,需要补全,如果没有不一致,说明我们写入的地方都已经对齐了,现在新旧数据是已经能一直保持一致了,那下面就是切读的地方了。```php
//新写入逻辑:如增删改students表和mark表
//旧写入逻辑:如增删改users表
//新读取逻辑:如查students表和mark表
```
```php
//新写入逻辑:如增删改students表和mark表
//新读取逻辑:如查students表和mark表
```
完成之后我们的系统就平稳的完成迁移了。
整个过程可能看起来很繁琐,没关系,我们一步一步来分析其必要性。
可以看到,上面的系统升级重构的思路是比较细致的,但是确实是非常平稳,且不需要停服就能完成升级,即使系统非常的复杂,升级重构的逻辑和存储结构大变样也能适用。当然在实际过程中大家也可以根据实际情况(小系统小改动)进行一些步骤的合并或者缩短时间。
领取专属 10元无门槛券
私享最新 技术干货