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

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: 重构之道:揭秘大规模系统重构的经验与挑战

一、前言

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


二、那些年、重构之路

项目 公司 时间 投入人力 技术栈 项目亮点 相关链接
千万级订单重构 公司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
相关文章
|
存储 SQL 关系型数据库
如何设计可落地的重构技术方案——理论篇
如何设计可落地的重构技术方案——理论篇
301 0
|
1月前
|
机器学习/深度学习 人工智能 监控
提升软件质量的关键路径:高效测试策略与实践在软件开发的宇宙中,每一行代码都如同星辰般璀璨,而将这些星辰编织成星系的过程,则依赖于严谨而高效的测试策略。本文将引领读者探索软件测试的奥秘,揭示如何通过精心设计的测试方案,不仅提升软件的性能与稳定性,还能加速产品上市的步伐,最终实现质量与效率的双重飞跃。
在软件工程的浩瀚星海中,测试不仅是发现缺陷的放大镜,更是保障软件质量的坚固防线。本文旨在探讨一种高效且创新的软件测试策略框架,它融合了传统方法的精髓与现代技术的突破,旨在为软件开发团队提供一套系统化、可执行性强的测试指引。我们将从测试规划的起点出发,沿着测试设计、执行、反馈再到持续优化的轨迹,逐步展开论述。每一步都强调实用性与前瞻性相结合,确保测试活动能够紧跟软件开发的步伐,及时适应变化,有效应对各种挑战。
|
5月前
|
设计模式 算法 C语言
技术进步与个人成长:从代码到思维的演变
技术不仅塑造了我们的工作方式,更深刻地影响了我们的思维模式。本文探讨了在编程实践中,个人技术能力和思维方式如何相互影响和提升,重点讨论了一些关键的经验和感悟,以及这些经历对职业发展的深远影响。
54 0
|
4月前
|
敏捷开发 算法 搜索推荐
软件测试的演变:从传统方法到敏捷实践
本文深入探讨了软件测试领域的发展轨迹,从早期以代码为中心的测试方法,到今日强调快速迭代和持续集成的敏捷测试实践。文章通过分析历史数据、行业报告以及权威研究,揭示了测试自动化、跨功能团队合作以及质量保证在现代软件开发中的重要性。进一步地,本文还讨论了如何将科学严谨性融入测试过程,包括采用基于证据的测试策略、利用统计方法评估软件质量,并提出了逻辑严密的测试案例设计原则。
|
5月前
|
机器学习/深度学习 人工智能 jenkins
从传统到自动化:软件测试的进化与实践
在数字化转型的浪潮中,软件测试经历了从手工测试到自动化测试的重大变革。本文将探讨这种转变的背景、具体方法和实践应用,并展望未来可能的发展方向。通过实际案例和技术分析,揭示为何自动化测试成为现代软件开发不可或缺的一部分。
|
6月前
|
敏捷开发 持续交付 开发者
拥抱变化:软件开发中的敏捷思维与持续学习
【4月更文挑战第30天】 在快速迭代的软件开发领域,"敏捷"不仅是一套方法论,更是一种哲学。本文将深入探讨敏捷软件开发背后的核心原则及其对开发者心态的影响,特别强调持续学习的重要性。我们将剖析如何在不断变化的技术环境中保持适应性和竞争力,并提出策略以促进个人和团队的成长。文章旨在为读者揭示那些成功适应行业变革、不断提升技术栈并保持职业生涯活力的专业开发者所遵循的实践方法。
|
敏捷开发 架构师 算法
重新审视演进式设计
重新审视演进式设计
重新审视演进式设计
|
敏捷开发 架构师 项目管理
架构师才能看懂的大型网站架构面临的挑战:业务架构的基本思路
业务架构的基本思路 大型网站系统有很多功能,一次性明确所有的功能需求并设计出一个庞大的业务架构是一件费力不讨好的事情。因为在项目前期,难免会忽视一些琐碎功能,而随着开发的进行,也会有很多新的想法产生,基本上不会存在完全按照最初的业务架构设计完成的软件产品。因此,业务架构不仅要做到“规整功能模块,厘清产品业务逻辑”,更重要的是如何做到“有规划性地应对项目过程中的需求变更”。
|
SQL 前端开发 安全
【测开方法论】如何简单的对测试平台进行底层重构 ?
【测开方法论】如何简单的对测试平台进行底层重构 ?
|
数据可视化 架构师 前端开发
复杂性应对之道 - 领域建模
复杂性应对之道 - 领域建模
复杂性应对之道 - 领域建模