序言

对一个程序员来说,世界上最痛苦的事情是什么呢?

有的人会说:编码的时候产品改需求!

有的人会说:看别人不知所云的代码!

有的人会说:定位一个百年不遇千年难寻的线上不定时偶尔出现的bug!

有的人会说:找不到女(男)朋友!

。。。。。。。。。。。。。。。。。。。。。。。。。。

但我要说,这些痛苦其实都不算什么,要么是多花点时间去解决(比如说改需求、看代码),要么是多花点心思(比如说找另一半、定位疑难bug),而我接下来说的这个事情才是最痛苦的,既要说得动老板,也要镇得住同行;既要技术攻关,又要协调资源;既要保证业务正常发展,又要在指定时间内完成目标。。。。。。总之就是十八般武艺要样样精通。

这个事情就是“架构重构”,比“架构重构”还要痛苦的就是“边做业务边架构重构”!我们的产品形象的形容为“给飞驰的法拉利跑车换引擎”,为何这样说呢?

首先:业务不能停,不能为了架构重构而终止业务的开发,将法拉利停下来换引擎,别人都跑远了;

其次:业务不能出问题,不能因为架构重构导致业务无法运行,法拉利修出问题跑不了,别人也跑远了;

第三:要根本解决问题,而不是修修补补,不是给法拉利引擎加点油,清洁一下就可以了,而是要换上新的引擎。

巧合的是,我加入UC后到现在已经做了3个系统的架构重构了(戏称“救火队长”),而且每个系统的特点都不一样,过程中各种各样的问题都遇到过,坑也踩过,也积累了一些经验。接下来就给大家分享一下。

【有的放矢】

我接手的第一个系统是一个后台系统,负责管理整个阿里游戏的游戏相关的数据(以下简称M系统),重构的主要原因是因为系统耦合了P业务独有的数据和所有业务公用的数据,导致可扩展性比较差。其大概架构如下:

举一个最简单的例子:数据库中的某张表,一部分字段是所有业务公用的“游戏数据”,一部分字段是“P业务系统”独有的数据,开发的时候如果要改这张表,代码和逻辑都很复杂,改起来效率很低。

针对M系统存在的问题,我们的重构目标就是将游戏数据和业务数据拆分,解开两者的耦合,使得两个系统都能够独立快速发展。

重构的方案如下:

重构后的效果非常明显,重构后的M系统和P业务后台系统每月上线版本数是重构前的4倍!

我接手的第二个系统,是负责游戏接入的核心系统(以下简称S系统)。S系统是游戏接入的核心系统,一旦S系统故障,大量游戏玩家就不能登录游戏,而S系统并不具备多中心的能力,一旦主机房宕机,整个S系统业务就不可用了。其大概架构如下,可以看出数据库主库是全局单点,一旦数据库主库不可用,两个集群的写业务都不可用了:

针对S系统存在的问题,我们的重构目标就是实现双中心,使得任意一个机房都能够提供完整的服务,在某个机房故障的时候,另外一个机房能够全部接管所有业务。

重构方案如下:

重构后系统的可用性从3个9提升到4个9,重构前最夸张的一个月有4次较大的线上故障,重构后虽然也经历了机房交换机宕机、运营商线路故障、机柜断电等问题,但对业务都没有什么大的影响。

我接手的第三个业务系统,是属于创新业务(以下简称X业务)。由于是创新业务,之前的业务快速尝试和快速发展期间,怎么方便怎么操作,怎么快速怎么做,系统设计并未投入太多精力和时间,很多东西都塞到同一个系统中,导致到了现在已经改不动了,做一个新功能或者新业务,需要花费大量的时间来讨论和梳理各种业务逻辑,一不小心就踩个大坑。X系统的架构如下:

X系统的问题看起来和M系统比较类似,都是可扩展性存在问题,但其实根本原因不一样:M系统是因为耦合了不同业务的数据导致系统可扩展性不足,而X系统是因为将业务相关的所有功能都放在同一个系统中,导致系统可扩展性不足;同时,所有功能都在一个系统中,也可能导致一个功能出问题,导致整站不可用。比如说某个功能把数据库拖慢了,整站所有业务跟着都慢了。

针对X系统存在的问题,我们的重构目标是将各个功能拆分到不同的子系统中去,降低单个系统的复杂度。重构后的架构如下(仅仅是示例,实际架构远比下图复杂):

重构后各个系统之间通过接口交互,虽然看似增加了接口的工作量,但整体来说,各系统的发展和开发速度比原来快了很多,系统也相对更加简单,也不会出现某个子系统有问题,所有业务都有问题。

这三个系统重构的方案,现在回过头来看,感觉是理所当然的,但实际上当时做分析和决策的时候,远远没有这么简单。

以M系统为例,当时我们接手后遇到的问题有很多,例如:

  1. 数据经常出错;
  2. M系统是单机,单机宕机后所有后台操作就不能进行了;
  3. 性能比较差,有的操作耗时好久;
  4. 界面比较丑,操作不人性化;
  5. 历史上经过几手转接,代码比较混乱;
  6. 业务数据和游戏数据耦合,开发效率很低。。。。。。

从这么多问题中识别出重构的目标,并不是一目了然的;而如果想一下全部解决所有的这些问题,人力和时间又不够!

所以架构重构首要的任务是从一大堆纷繁复杂的问题中识别出真正要通过架构重构来解决的问题,集中力量快速解决,而不是想着通过架构重构来解决所有的问题。否则的话,就会陷入人少事多头绪乱的情况,团队累死累活弄个大半年,最后发现好像什么都做了,但每个问题都依然存在。尤其是对于刚接手一个新系统的架构师或者技术主管来说,一定要控制住“新官上任三把火”的冲动,避免摊大饼式或者运动式的重构和优化,谨记“步子大了会扯到蛋”的教训 !

那原来发现的那些问题怎么办呢?当然不能放任不管。以M系统为例,我们在重构完成后,又启动了多个优化的项目去优化这些问题,但此时的优化主要是团队内部完成即可,和其它团队没有太多关联,优化的速度是很快的。如果没有重构就进行优化的话,每次优化都要拉一大堆关联业务的团队来讨论方案,效率非常低下!

============================================================================================

本文原创发表于CSDN和云栖社区,转载请注明出处:

CSDN:给飞驰的法拉利换引擎 - 谈边做业务边做架构重构(1)——有的放矢

云栖:给飞驰的法拉利换引擎 - 谈边做业务边做架构重构(1)

给飞驰的法拉利换引擎 - 谈边做业务边做架构重构(1)——有的放矢相关推荐

  1. 联想童夫尧:韬光养晦、空中换引擎,加速企业级市场增长

    ​2018年初,Gartner发布了全球及中国的IT支出预测:2018年全球IT支出预计将达3.7万亿美元,较2017年增长4.5%:中国在2018年对技术产品和服务的总支出会增长6.7%,超过2.6 ...

  2. 朱晔的互联网架构实践心得S1E6:给飞机换引擎和安全意识十原则

    本文有两个部分,先介绍一下给飞机换引擎这个事情我的一些经验,因为篇幅较短然后介绍一下安全意识方面的一些心得. 给飞行中的飞机换引擎 所谓给飞行中的飞机(或飞驰的汽车)换引擎说的是我们需要对一个正在飞速 ...

  3. 给行驶中的飞行器换引擎?应用现代化是怎么做到的

    点击蓝字关注 了解更多 给行驶中的飞行器换引擎?简直就是Mission Impossible!但实际上,今天企业的数字化转型就是在完成这项看似不可能完成的任务,而且必须出色地完成.给行驶中的飞行器换引 ...

  4. 浅谈 MVC、MVP 和 MVVM 架构模式

    2019独角兽企业重金招聘Python工程师标准>>> 谈谈 MVX 中的 Model 谈谈 MVX 中的 View 谈谈 MVX 中的 Controller 浅谈 MVC.MVP ...

  5. 张小龙谈如何做将产品做简单转自雷锋网

    编者按:张小龙某次在腾讯内部讲课的内容.商业价值主笔夏勇峰/整理 完整内容如下: more 今天从一个小故事开始讲:为什么苹果的手机只有一个按钮? (台下:我觉得对于用户来说,只有一个按钮不会有太多的 ...

  6. 《浅谈12306核心模型设计思路和架构设计》阅读有感

    <浅谈12306核心模型设计思路和架构设计>阅读有感 12306的业务复杂度远远比淘宝天猫这种电商网站要复杂.一般的电商网站,购买都是基于商品的概念,每个商品有一定量的库存,用户的购买行为 ...

  7. 量身定制规则引擎,适应多变业务场景

    为什么80%的码农都做不了架构师?>>>    规则引擎适合于做业务规则频繁变化的场景,我们的业务在应用过程中,也经常要处理大量的业务规则,当然,也希望能有一套规则引擎来支撑,这样是 ...

  8. 浅谈大型网站之负载均衡架构

    转载自 浅谈大型网站之负载均衡架构 概念 负载均衡,英文名称为Load Balance,其意思就是分摊到多个操作单元上进行执行,例如Web服务器.FTP服务器.企业关键应用服务器和其它关键任务服务器等 ...

  9. 游戏引擎除了开发游戏还能做什么?

    近几年,国内游戏市场有了爆发性的增长,随着电竞手游层出不穷.职业玩家不断壮大,游戏开发和 "Unity&虚幻引擎"成为很多人茶余饭后讨论的话题,越来越多年轻人想要学会这项技 ...

最新文章

  1. Socket网络协议之二
  2. 奇异值的物理意义是什么?
  3. mysql pl安装教程_ubuntu 16 mysql安装包安装 (推荐在线安装)
  4. java 压缩字节流_java 压缩 字节流 ,C#解压的问题
  5. (实模式+保护模式)模式切换的过程步骤(代码+文字解析)
  6. Django+Jquery+Ajax+验证码登录案例
  7. 大华的支持rtmp推流吗_RTSP安防摄像机(海康大华宇视等)如何推送到RTMP流媒体服务器进行直播...
  8. (85)FPGA面试题-FIFO深度计算
  9. 在linux环境获取pcie卡信息,如何Linux下得到CPU、内存及PCI信息
  10. 剑指Offer——重建二叉树
  11. 刻意玩具教具化没用,童心制物如何让孩子真正玩出名堂
  12. 树的计数 + prufer序列与Cayley公式(转载)
  13. 关于onselect与onchange的介绍
  14. js 区分中英文输入法(如中英文括号)
  15. 编程训练4-统计单词平均长度
  16. 【Error】初始化ant design pro项目时遇到“pro 不是内部或外部命令”
  17. BugKu -- never give up
  18. iOS应用架构谈 网络层设计方案--RTNetworking
  19. Tcp、select函数实现在线词典(C语言)
  20. 电脑开机黑屏一串英文_电脑开机黑屏,还出现一串英文字母。

热门文章

  1. mysql最新高可用_MySQL高可用方案介绍
  2. linux如何查看入口地址,宝塔Linux面板安全入口地址忘了(方法一)
  3. 国外本科liuxue生未毕业学历认证,看这里
  4. 敏涵控股集团向夏邑县第一中学捐赠图书
  5. javascript集合的使用 new Set()使用
  6. 2字节char转16进制unsigned char或者int
  7. VsCode Eslint 代码检测工具
  8. C#--DataGridView(干货版)
  9. Nginx中location、proxy_pass后方加不加斜杠/的区别
  10. qq互动视频页面加载失败_若腾讯针对某短视频和社交媒体(如抖音等头条系平台),彻底封屏,该怎么办...