一、什么时候需要重构老系统

老系统重构,让大家又喜又悲,喜的是程序员,悲的是业务。

程序员为啥“喜”:多年前的老技术,以及各种历史原因导致的遗留代码、不需要的业务代码混杂在一起,维护起来,那个酸爽,我相信老司机都懂的。

业务为啥“悲”:业务会觉得一堆技术人重心都去发明新轮子,新需求迭代必然受挫。

那什么时候可以进行重构?本着技术需要领先业务“一小步”,综合成本和收益、boss意愿、业务的淡旺季、团队对新框架的掌握熟练度等因素,考虑清楚,方可计划和实施。

为了追赶业务的发展,笔者有幸成功主导过公司几个历史大系统的重构,接下来将讲述一个核心系统的重构之旅。

二、被重构系统的现状

此次重构的系统是10多年前的老系统,简单描述,有如下特征:

  • 单体应用,200多张表,千万级别记录的表上百个,部分表记录已上亿;

  • 要的和不要的业务功能都参杂其中,毕竟那个时候互联网群雄逐鹿,讲究天下功夫,唯快不破,没有严格实施“童子军规”,着实理解;

  • 作为核心系统,外部系统千丝万缕,给人麻麻的感觉。

三、期望达到的目标

  • 不影响业务的正常使用

  • 不影响其他系统的正常调用和运行

  • 技术架构从单体架构升级到微服务架构

因为微服务需要拆分数据库,即从一个大数据库里面,将本系统的表拆到新库,而且此次涉及跨机房(运维哥哥要求的)。

所以,技术上涉及数据迁移并升级,以及系统架构和代码升级两部分。

四、如何去重构

为了达到目标,我的方法如下:

1. 不影响业务的正常使用

即使用新架构,全新开发一个系统,数据库也使用新的(即将数据迁移并表结构升级),老系统和老数据库正常运行,等新系统开发部署好,再直接通过运维切换到新域名即可

2. 不影响其他系统的正常调用

老系统之间交互方式梳理清楚,有两种方式:

1)老接口不变,新系统继续兼容老系统的接口调用,比如是HTTP,Hession,RMI等;

2)其他系统和本系统交互的部分,他们也愿意一起升级,就使用新接口方式,那是最好的,具体看场景

3. 技术架构从单体架构升级到微服务架构

1)数据迁移并升级

由于跨机房,源数据库数据量比较大(几百G),并且新库我们做了部分表结构调整,在保证老数据库不停机的情况下,我们使用了zookeeper+kafka+canal+otter等组件集群方式搭建,分两个阶段完成数据迁移,即存量数据和增量数据两阶段处理。

具体操作的流程图如下:

a:通过dump表打包,节约网络带宽,同时记录dump的位点A,方便后续作为增量的起始点;

b:中间备份库作为一个临时库,和新数据库在同一个服务器,这样DBA在临时库改造大表,不影响业务,改造好了,可以直接剪切到新数据库;如果涉及表拆分和复杂业务逻辑,就需要程序来做存量同步;

c:在存量都搞定后,再做老数据库从位点A到新数据库的同步,无业务逻辑,并且可以直接字段对应进行数据同步,使用otter解决,而有业务逻辑等,则使用canal解析bonlog,将数据存到kafka,再通过程序来消费kafka数据,将处理后的数据写入新数据库;

d:待新老数据库数据保持一致后,上线新应用系统,通过配置中心切数据库,并确保切数据后,数据表无“双写”存在。

值得提醒的是:

a:一般建议重构时,没有绝对把握,尽量不做表结构修改,因为这样需要搭建对系统本身的运转和业务的理解足够深入,至少各个字段的生命周期;

b:需要充分做好源字段和目标字段的仔细梳理和测试,这里有巨大的工作量;

c:有些表数据会有依赖,所以需要注意同步时表的先后顺序;

d:不要低估在大表上加新索引的时间(当然,如果能够提前做数据归档那是最好的)。

2)系统架构和代码升级

微服务我们按照业务功能竖切,以及通用非业务功能的横切,建议初期不要切太细,掌握一个度。

由于我们使用Spring Cloud这一套,网上相关资料都比较齐全,我就不详述了。

在这里,需要重点给大家分享做好系统功能分析,可以按内部和外部两个维度分析:

a:内部分析

  • 内部功能的代码分析

  • 梳理出在使用的表清单和业务逻辑

  • 内部Job,含job调度中心和线上服务器各个用户下的cron job等

  • 中间件的使用:MQ,Redis等

  • 调用第三方的内容:外部翻译接口,支付接口等

b:外部调用分析

  • 日志分析:access log等追踪访问的IP,追溯对应调用方

  • 老数据库表访问来源分析:数据库上加日志分析JDBC直连

  • 其他系统对调用API接口的追踪和梳理等

五、感想

重构老系统,犹如在高速公路上开车换胎:

所以,为了安全起见,建议大家做好以下内容:

  • 事先尽量想明白重构的边界,是部分独立功能重构,还是整个系统重构;

  • 并提前给业务打好预防针,争取上级领导们的大力支持;

  • 并团队自身做好充分准备工作,分析工作,以及其他软技能,比如上下游系统沟通和协调等工作,都尽量做细,正如《孙子兵法》说:知己知彼,百战不殆。

总之,重构开始很兴奋,但走到后面满路荆棘,所以,建议大家必须要有突破黑暗,走向光明的“决心”。佛曰:我不入地狱,谁入地狱?!

作者简介:张雄,14年IT研发及管理经验,目前担任兰亭集势高级研发专家。

往期推荐 

  • 低代码框架X-series应用案例

  • 不止中台:全面的架构演进趋势和方法

  • 微软(中国)公司首席技术官:“无常态”下的新基建与数字化

  • 融云 CTO 杨攀:如何从 0 到 1 开启一段技术创业之旅?

  • 从十四五规划看企业数字化转型(PPT分享)

技术琐话 

以分布式设计、架构、体系思想为基础,兼论研发相关的点点滴滴,不限于代码、质量体系和研发管理。本号由坐馆老司机技术团队维护。

200张表,单表记录过亿,10多年核心老系统的重构之旅相关推荐

  1. 谈一谈仓库表单表设计

    如题"仓库单表设计",只谈一张表. 本来想命题为"浅谈简单仓库的数据库设计"的但发现还是命题太大, 仓库设计,设计的东西太多了,库存,进库,出库,日志,盘点等等 ...

  2. php jq 提交表单验证,jQuery EasyUI 表单 – 表单验证 | 菜鸟教程

    jQuery EasyUI 表单 - 表单验证 本教程将向您展示如何验证一个表单.easyui 框架提供一个 validatebox 插件来验证一个表单.在本教程中,我们将创建一个联系表单,并应用 v ...

  3. HTML 表单-表单域

    表单 表单域 包含了文本框.密码框.隐藏域.复选框.单选框.多行文本框.下拉选择框和文件上传框等. 文本框:属性text,是一种让访问者自己输入内容的表单对象,通常被用来填写单个字或者简短的回答,如姓 ...

  4. mysql如何备份一个表单_Mysql亿级数据大表单表备份

    上一篇Mysql已有亿级数据大表按时间分区,介绍了亿级数据大表如何按时间分区,也留下了一个问题:备份亿级数据大表要耗时多久.本篇将就如何备份亿级数据大表展开讨论. 注意:我这里所说的备份指的是数据从一 ...

  5. 表单提交_django 的ajax提交与表单提交记录

    好记性不如烂笔头: 据说的ajax提交比表单提交要好,可以不用重新刷新页面: 表单提交:MTV模式 # 局部禁用csrf保护 @csrf_exempt def login(request):if re ...

  6. java 自定义表单 动态表单 表单设计器 工作流引擎 flowable

    自定义表单设计模块都有哪些? 1 定义模版:拖拽左侧表单元素到右侧区域,编辑表单元素,保存表单模版 2 表单模版:编辑维护表单模版,复制表单模版,修改模版类型,预览表单模版 3. 我的表单:选择表单模 ...

  7. python开源报表系统_流程设计器、表单设计器和简单报表管理开源OA系统smart-web...

    smart-web2是一套相对简单的OA系统:包含了流程设计器,表单设计器,权限管理,简单报表管理等功能: 系统后端基于SpringMVC+Spring+Hibernate框架,前端页面采用JQuer ...

  8. web前段学习day_01:HTML(学习如何搭建页面结构和内容):文本标签、列表标签、图片标签、超链接、表格、表单表单、分区标签、实体引用

    学习如何构造页面结构和内容 安装HBuilderX 一.HTML 创建第一个HTML页面 写完html后如何测试 写在body中的常见标签有哪些? 注释快捷键 Ctrl+Shift+/ 1.文本相关标 ...

  9. html 重复提交表单,表单重复提交问题的三种解决思路

    前端开发中接触的表单提交还是很多的,有时候如果不对提交事件进行处理的话会遇到重复多次提交. 最近开发遇到一个问题,找了挺久才找到原因解决-_-||,表单一直提交两次,以为是双击重复提交了,就在提交之后 ...

最新文章

  1. 蓝桥杯国赛-数正方形-java
  2. 景观格局动态变化分析方法(基于ArcGIS、Fragstats、ENVI、ERDAS、Patch Analysis for ArcGIS) (2011-03-15 08:07:03)...
  3. java常见类关系(UML建模)
  4. 关于IE控件闪烁解决方案
  5. 迟来总比没有好:SSE或服务器发送的事件现在已在JAX-RS中
  6. 为什么说机器学习不是人工智能?
  7. Java—多线程创建详解
  8. 提高CIFAR-10分类准确度的方法
  9. 【leetcode】Permutations
  10. oracle+gsm安装,针对Oracle的10G版本提升SCOTT为DBA脚本!
  11. php redis decr_Redis在PHP项目中的实际应用场景
  12. java有用还是c有用_这周的有用资源
  13. qqkey获取原理_【逆向】QQkey盗号木马原理分析
  14. 如何轻松查询分析多个快递单号物流到站派件延误件
  15. HttpModule 与 Globle.asax
  16. 电容篇-电容器件工作原理及参数分析理解
  17. 如何将微信电脑图片dat格式文件转换为jpg格式
  18. 机器学习结果指标评估
  19. php免费开发环境搭建,Windows PHP 开发环境搭建
  20. 将Spring Boot应用程序迁移到Java 9-模块

热门文章

  1. 3.用js实现关闭淘宝二维码
  2. php是什么症状脾虚什么症状怎么治,【脾虚的表现】脾虚的症状有哪些-有问必答-快速问医生...
  3. 嵌入式自动判断是否插入网线的几种方法
  4. 【经济学视频课程】需求弹性的推导…
  5. 深度思考故事2:出租司机的经济学
  6. MOOC 程序设计入门 C语言 错题集
  7. 【ReentrantLock】
  8. RHCSA-A2.配置默认软件仓库
  9. Navicat for MySQL 安装(百度云链接)
  10. 2组语法,1个函数,教你学会用Python做数据分析!