重构之道:揭秘大规模系统重构的经验与挑战

本文涉及的产品
RDS MySQL DuckDB 分析主实例,基础系列 4核8GB
RDS MySQL DuckDB 分析主实例,集群系列 4核8GB
RDS Agent(兼容OpenClaw),2核4GB
简介: 重构之道:揭秘大规模系统重构的经验与挑战

一、前言

这篇文章总结了我在多年负责大规模复杂系统重构中的经验。距离我上一次写浅谈这些年做过的千万级系统重构的文章已经过去近两年,回顾这段时间,我也在不断进步、摸索,并对架构进行了优化,同时也参与了一些新的重构项目。本文将再次总结我在这些项目中的经验分享!


二、那些年、重构之路

项目 公司 时间 投入人力 技术栈 项目亮点 相关链接
千万级订单重构 公司A 201606~201609 10人 PHP/Redis/RabbitMQ/
MongoDB/MariaDB
自研PSF框架,分片1024库,订单表重新设计,数据双向同步,接口按流量灰度化,订单表和冗余表的分片设计,数据汇总采用MariaDB多源复制架构 https://www.admin5.com/article/20160705/673189.shtml
亿级影像存储重构 公司B 201805~201807 3人 Java/c/Redis/MySQL/ 存储与活动/赛事分离,分512个库,根据图片MD5 % 512 分片, 数据库集群分为2组(0~255, 256 ~ 511),自研人脸识别引擎,识别精度80% 可惜这个时候还没有开始写文章,所以没有链接
订单分库分表重构 公司C 202107~202108 4人 Java/RocketMQ/MySQL/ES 分8个库,256张表,按用户 user_id % 256 分片,分为8组(0~31, 32 ~63 …. 224 ~ 255) ,重构后系统可支撑每天2亿订单,写RT约2ms,读RT约1ms, 重构性能提升10倍,实际已突破每天2500万订单,系统整体突破15W/QPS 浅谈订单重构之路
围栏系统重构 公司C 202205 2人 Java/MySQL 支持水平扩展,性能提升40倍,建设空间索引,大幅减少部署机器数量 性能提升40倍——线上真实重构案例分享
乘客排队系统重构 公司C 202206 2人 Java/MySQL/Redis 排名与存储分离,使用MySQL进行分表,支持无限制排队和灵活的挑单策略 线上真实排队系统重构案例分享——实战篇
关联网络-图数据库系统重构 公司D 202306~202308 4人 Java/Mysql/NebulaGraph
/RocketMQ/Kafka/Hbase
使用NebulaGraph替代OrientDB作为图数据库存储,将原来Scale语言改造为Java,支持图数据库水平扩展,服务具备弹性伸缩能力 图数据库系统重构之路:从OrientDB迁移到NebulaGraph 真实案例分享


三、什么是重构之道


1、重构的原则

  • 重构不等于重写,而是基于原有业务系统的基础上进行改造,需尽量保持对外接口不变和业务逻辑的稳定性,并且需要平滑过渡。
  • 不要为了重构而重构,需明确重构的目的并且能解决当前问题以及未来可能出现的瓶颈。
  • 重构需要站在前人的肩膀上,尊重历史架构的合理性,同时遇到问题要用开放的态度去解决。
  • 细节决定成败,在重构过程中要对可能出现的问题保持警惕,不要抱有侥幸心理。

2、为什么要重构

  • 性能瓶颈:原有数据库量太大,或服务无法满足当前业务发展的需求,并且可能通过加机器资源都无法解决。
  • 解耦:例如,需要将单体架构拆分为微服务来降低耦合性,系统发版互相影响。
  • 局限性:原有架构存在诸多限制并且当前无法解决等问题。

注:只有明确了痛点所在并且新方案能够全面解决问题,同时考虑到未来潜在的瓶颈,并给出相应的解决方案,才会是最佳的重构策略。

3、重构的套路

在进行重构时,需要考虑以下几个关键因素。之前我也在重构系列文章中介绍过重构的相关内容。

  • 灰度方案:确定何处执行灰度以及如何实施。
  • 双写方案:判断何时需要进行双写操作,如何实现双写(接口层、MQ异步写入、监听binlog等)。
  • 数据同步方案:确定是否需要进行数据同步,全量和增量数据如何实现。
  • 改造方案:确保不会破坏原有的业务流程,解决数据分片(分库分表)后的查询问题。
  • 回滚方案:通过配置中心开关控制,能够快速回滚到之前的版本。
  • 数据对比方案:在数据库层面和接口层面如何进行数据对比。


四、总结

重构的魅力在于它能够挑战技术人员的极限,并且会遇到各种未知的问题,因为老系统往往承载着很多的历史包袱和未知问题

相关实践学习
阿里云图数据库GDB入门与应用
图数据库(Graph Database,简称GDB)是一种支持Property Graph图模型、用于处理高度连接数据查询与存储的实时、可靠的在线数据库服务。它支持Apache TinkerPop Gremlin查询语言,可以帮您快速构建基于高度连接的数据集的应用程序。GDB非常适合社交网络、欺诈检测、推荐引擎、实时图谱、网络/IT运营这类高度互连数据集的场景。 GDB由阿里云自主研发,具备如下优势: 标准图查询语言:支持属性图,高度兼容Gremlin图查询语言。 高度优化的自研引擎:高度优化的自研图计算层和存储层,云盘多副本保障数据超高可靠,支持ACID事务。 服务高可用:支持高可用实例,节点故障迅速转移,保障业务连续性。 易运维:提供备份恢复、自动升级、监控告警、故障切换等丰富的运维功能,大幅降低运维成本。 产品主页:https://www.aliyun.com/product/gdb
相关文章
|
微服务
微服务迁移模式之Martin Flower绞杀者模式
绞杀者模式(Strangler Pattern)是一种非常流行的从单体系统向微服务迁移的策略,其主张通过用新服务替换特定功能来将单体系统逐步转换为微服务,一旦新服务已经能够代替原有旧有功能,就将原有功能组件绞杀(即彻底停用)。
3501 1
微服务迁移模式之Martin Flower绞杀者模式
|
SQL 关系型数据库 MySQL
将MySQL 数据迁移到 PostgreSQL
将MySQL 数据迁移到 PostgreSQL 可以采用以下步骤: 安装 PostgreSQL 数据库:首先,需要安装 PostgreSQL 数据库。可以从官方网站(https://www.postgresql.org/)下载最新版本的 PostgreSQL,并根据官方指南进行安装。 创建 PostgreSQL 数据库:在 PostgreSQL 中创建与 MySQL 数据库相对应的数据库。可以使用 pgAdmin 或命令行工具(如 psql)来创建数据库。例如,如果在 MySQL 中有一个名为 "mydb" 的数据库,那么可以在 PostgreSQL 中创建一个具有相同名称的数据库。 导
6215 0
|
7月前
|
人工智能 Java Nacos
基于 Spring AI Alibaba + Nacos 的分布式 Multi-Agent 构建指南
本文将针对 Spring AI Alibaba + Nacos 的分布式多智能体构建方案展开介绍,同时结合 Demo 说明快速开发方法与实际效果。
5000 96
|
前端开发 easyexcel Java
Java+EasyExcel实现文件导入导出,导入导出如此简单
项目中需要Excel文件的导入与导出Excel并下载,例如,导入员工信息,导出员工信息,手动输入比较繁琐,所以本篇博文教大家如何在Java中导入Excel文件与导出Excel文件
16152 3
Java+EasyExcel实现文件导入导出,导入导出如此简单
|
开发者
如何画业务架构图
如何快速上手画业务架构图
13868 2
|
12月前
|
JSON 安全 数据可视化
Elasticsearch(es)在Windows系统上的安装与部署(含Kibana)
Kibana 是 Elastic Stack(原 ELK Stack)中的核心数据可视化工具,主要与 Elasticsearch 配合使用,提供强大的数据探索、分析和展示功能。elasticsearch安装在windows上一般是zip文件,解压到对应目录。文件,elasticsearch8.x以上版本是自动开启安全认证的。kibana安装在windows上一般是zip文件,解压到对应目录。elasticsearch的默认端口是9200,访问。默认用户是elastic,密码需要重置。
6084 0
|
消息中间件 NoSQL Kafka
订单超时取消的11种方式(非常详细清楚)
订单超时取消的11种方式(非常详细清楚)
9328 6
订单超时取消的11种方式(非常详细清楚)
|
Java 中间件 调度
SpringBoot整合XXL-JOB【03】- 执行器的使用
本文介绍了如何将调度中心与项目结合,通过配置“执行器”实现定时任务控制。首先新建SpringBoot项目并引入依赖,接着配置xxl-job相关参数,如调度中心地址、执行器名称等。然后通过Java代码将执行器注册为Spring Bean,并声明测试方法使用`@XxlJob`注解。最后,在调度中心配置并启动定时任务,验证任务是否按预期执行。通过这些步骤,读者可以掌握Xxl-Job的基本使用,专注于业务逻辑的编写而无需关心定时器本身的实现。
4912 10
SpringBoot整合XXL-JOB【03】-  执行器的使用