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

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
云数据库 RDS MySQL,高可用系列 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
相关文章
|
存储 SQL 关系型数据库
如何设计可落地的重构技术方案——理论篇
如何设计可落地的重构技术方案——理论篇
306 0
|
2月前
|
机器学习/深度学习 人工智能 监控
提升软件质量的关键路径:高效测试策略与实践在软件开发的宇宙中,每一行代码都如同星辰般璀璨,而将这些星辰编织成星系的过程,则依赖于严谨而高效的测试策略。本文将引领读者探索软件测试的奥秘,揭示如何通过精心设计的测试方案,不仅提升软件的性能与稳定性,还能加速产品上市的步伐,最终实现质量与效率的双重飞跃。
在软件工程的浩瀚星海中,测试不仅是发现缺陷的放大镜,更是保障软件质量的坚固防线。本文旨在探讨一种高效且创新的软件测试策略框架,它融合了传统方法的精髓与现代技术的突破,旨在为软件开发团队提供一套系统化、可执行性强的测试指引。我们将从测试规划的起点出发,沿着测试设计、执行、反馈再到持续优化的轨迹,逐步展开论述。每一步都强调实用性与前瞻性相结合,确保测试活动能够紧跟软件开发的步伐,及时适应变化,有效应对各种挑战。
|
3月前
|
测试技术 持续交付 UED
软件测试的艺术与科学:平衡创新与质量的探索在软件开发的波澜壮阔中,软件测试如同灯塔,指引着产品质量的方向。本文旨在深入探讨软件测试的核心价值,通过分析其在现代软件工程中的应用,揭示其背后的艺术性与科学性,并探讨如何在追求技术创新的同时确保产品的高质量标准。
软件测试不仅仅是技术活动,它融合了创造力和方法论,是软件开发过程中不可或缺的一环。本文首先概述了软件测试的重要性及其在项目生命周期中的角色,随后详细讨论了测试用例设计的创新方法、自动化测试的策略与挑战,以及如何通过持续集成/持续部署(CI/CD)流程优化产品质量。最后,文章强调了团队间沟通在确保测试有效性中的关键作用,并通过案例分析展示了这些原则在实践中的应用。
79 1
|
4月前
|
人工智能
就AI 基础设施的演进与挑战问题之通过应用核心概念来优化研发过程的问题如何解决
就AI 基础设施的演进与挑战问题之通过应用核心概念来优化研发过程的问题如何解决
|
5月前
|
敏捷开发 算法 搜索推荐
软件测试的演变:从传统方法到敏捷实践
本文深入探讨了软件测试领域的发展轨迹,从早期以代码为中心的测试方法,到今日强调快速迭代和持续集成的敏捷测试实践。文章通过分析历史数据、行业报告以及权威研究,揭示了测试自动化、跨功能团队合作以及质量保证在现代软件开发中的重要性。进一步地,本文还讨论了如何将科学严谨性融入测试过程,包括采用基于证据的测试策略、利用统计方法评估软件质量,并提出了逻辑严密的测试案例设计原则。
|
6月前
|
机器学习/深度学习 人工智能 jenkins
从传统到自动化:软件测试的进化与实践
在数字化转型的浪潮中,软件测试经历了从手工测试到自动化测试的重大变革。本文将探讨这种转变的背景、具体方法和实践应用,并展望未来可能的发展方向。通过实际案例和技术分析,揭示为何自动化测试成为现代软件开发不可或缺的一部分。
|
敏捷开发 架构师 算法
重新审视演进式设计
重新审视演进式设计
重新审视演进式设计
|
SQL 前端开发 安全
【测开方法论】如何简单的对测试平台进行底层重构 ?
【测开方法论】如何简单的对测试平台进行底层重构 ?
|
机器学习/深度学习 存储 数据采集
3个因素看透 AI 技术架构方案的可行性
人工智能这几年发展的如火如荼,不仅在计算机视觉和自然语言处理领域发生了翻天覆地的变革,在其他领域也掀起了技术革新的浪潮。无论是在新业务上的尝试,还是对旧有业务对改造升级,AI 这个奔涌了 60 多年的“后浪”,正潜移默化的影响着我们传统的技术架构观念。
839 0
3个因素看透 AI 技术架构方案的可行性