【转】技改之路:从单块应用到微服务,我的血泪总结

技改是技术改造的简称,是技术的蜕变。技术改造,对于公司和技术人员而言都非常难得,参与者多,主导者少。我有幸前后主导过3次OTA系统的技改,规模有大有小,每次环境和问题虽不一样,但还是有套路可循。

《技改之路》少讲技术多讲路,我们不过多的关注技术细节和中间件的实现,而重点讲述技术改造的过程和思考,以下是本次分享的Topic:

  • 系统背景
  • 前期工作
  • 技改实施
  • 总结

1

系统背景

1、技术规模

公司

  • 国内领先的B2B机票分销平台
  • 资本原始积累,财务良好,一直盈利

系统规模

  • 200+应用
  • 100+库,1万+表

研发规模

  • 开发人员200人左右
  • 服务器有200台左右

此案例是一个中等规模的电子商务公司,老板白手起家,资本原始积累,现在赚钱的互联网公司很少哦。公司从2006年的几个研发人员,到技改前的200个左右研发人员,业务发展良好,是国内领先的B2B机票分销平台,互联网名声虽不大,但处于闷声发大财的状态。

公司之前尝试过2次系统重建,请了一批批的牛人,前后经历过4年。公司消耗大,但都以失败告终。此案例是我本人的第2次技改,效果不错,整体进展顺利,团队技术水平也有1~2个档次的提升,算是比较成功的实践。另外,因为案例过于真实,有些UML会打上马赛克,请多谅解。

2、单块应用

3、主要问题

  • 单块应用,该合并的没有合并,该拆开的没有拆开,单个体量不合理,主平台体量太大,其它又过小;
  • 技术过旧:使用7年以前的技术,主平台采用单块应用,且体量过大,无法整体更新维护;
  • 多版本共存:版本混乱,只敢添加,不敢修改;
  • 整个系统非常脆弱,问题多,访问量一大就挂;
  • 管理问题:发布困难、测试困难、修改困难、排错困难。

前期工作

1、架构部组建

成立架构部:

  • 内招几名老程序员,外招几个架构师

培养:

  • 内部走出去,提高眼界;外部牛人请进来,落地了解历史和业务

制度:

  • 项目管理+知识分享: JIRA+WIKI
  • 团队建设、技术分享、工程师文化

2、总体规划

架构是演化出来的还是设计出来的?对于创业场景,创业本身就是在未知中寻找机会,将不清楚变为清楚,系统的架构自然是演化出来的,而对于技术改造或Google搜索等复杂工程场景,系统的架构当然要精心策划。

公司电商系统总体架构,我们整整花了1个多月的时间,对项目做了总体的规划,然后对内宣讲推广,让每一个参与者了解自已的目标和价值。不手握地图,你怎知站对了位置!

3、中间件构建

我们构建的中间件有:

job / redis / center Log /业务监控 metrics / dashboad /调试工具 windbg / rabbitMQ / ORM 工具 dapper / MongoDB / jetermclient /公共类库 jFX / zookeeper / openTSDB / HBase / searcher 工具 solr /元数据管理 DDM / DLL 管理 nuget /自动发布 Jenkins /微服务架构 JSOA /

中间件是应用系统的基础设施,是应用的装备和工具。农村建住房是一块砖一块砖的往上垒,城市建大house则是先打地基,然后再建主框架,最后才是垒砖,所以 中间件的建设是大中型系统建设的前提。

以上中件间的构建过程贯穿于整个技改的生命周期,每一个中间件可能需要花1~2个月,它们大部分都基于开源。请关注上面的顺序,直面当前的问题,按需快速构建和推动。虽然使用开源,但中件间的引进和改造有自已的一套流程:调查 => 试用 => 选型 => 深入研究 => demo => wiki => 分享推广 => 业务系统试用 => 改进完善 => 大规模推广。

中间件的构建和增加,不仅对当前业务系统影响较小,还可以解决一部分业务难题,减轻数据库的压力。同时它还有利于建立技术氛围和分享机制。一支有激情、爱技术的研发团队,对技改的具体实施是非常重要的。

3

技改实施

1、数据库改造

当面对100个多库时,我认为系统架构师关注到数据库级别即可,建库拆库。数据库按模块整体迁移,其实并没有想象中那么难,理想情况下只需修改数据库的链接,而对于表和字段的优化,可由应用架构师或技术主管,以SOA收口或应用重构来实现。

数据库如何做到可伸缩,可大可小方便拆分呢,思考如下:

  1. 上图从内往外看,一个框即可以是一个库,也可以是一个模块,还可以是一个表,根据当前业务规模和系统复杂度来实现;
  2. 我们的大实体关系图具体为:产品、用户、订单、结算、基础设施。它们早期可以是一个库,里面有5个模块,中期可以分为5个库,后期则可以更底级别分为更多的库;
  3. 命名规范:数据库名:业务线缩写+库名;模块名:参考大E-R图+专业词汇缩写;表名:模块缩写+表名;自增编号:表名+ID;
  4. 模块内可多表联接,模块间减少联接,数据库间不允许联接;
  5. 每一个数据库有且仅有一个Owner组,原则上只允许一个团队才能Create,其它团队访问需要分级控制,L1为接口,L2为只读库,L3为直接读写“写库”。

数据库规划

数据库是整个信息系统中生命周期最长、最难修改的部分。所以让时间来解决时间的问题,要加强设计,具体实施过程如下:

  1. 在地图即总体架构文档推广后,我们就新建立了一批库,这在早期还遭到DBA的抱怨;
  2. 新增相关库后,新表按新规则创建,特殊情况走特珠审批;
  3. 去SP去关联,让数据库减少计算,回归存储本质;
  4. 数据库拆分,改表改字段,采用模块整体迁移或应用重构;
  5. 一年后,再去看数据库,发现在没有特别立项和驱动的情况下,已接近一半的表在新库中。

数据变迁

状态图是数据的变迁,是数据与行为的互动,数据的变化会引起行为的变化,行为的变化会产生数据的不同。上图是国内的订单状态变迁图,它的价值不仅属于数据库层,还在于SOA服务化和核心业务流程。

2、服务改造

服务是动词,是行为或活动的抽象,它的价值在于业务逻辑或行为的重用,具体实施过程如下:

  1. 服务列表和服务协议,在设计阶段使用Excel表格;
  2. 统一Request/Response规范;
  3. 服务实现,因没有直接可见的业务价值输出,最好以工单或项目来落地;
  4. 服务治理,早期没有工具时,使用WIKI做简单管理,后期使用专业的服务治理工具。

领域模型

没有领域图的架构设计都是耍流氓,我们画领域图的架构师是2位老员工,没有多少高大上,甚至于他们之前没有画过UML,但我们的状态图和领域模型都是出自他们之手。 其实画领域图的关键是懂事物本身,并知道它们的关系。 我们的领域图与业务模型中的5大业务流程一一对应,包括:预订流程,订单处理流程,产品供应流程,财务结算流程,账户管理流程。

微服务

 我们的微服务JSOA V2.0是基于ServiceStack当时最新的版本号4.0.50实现的,它本身支持轻量级协议和Metadata,以及Swagger,是微服务的一种架构实现。另外,它还可以再扩展以API Gateway的方式实现Open API。

微服务MSA与我们之前的SOA、ESB有什么区别呢?

  • ESB有总线和聪明的管道管理能力;
  • SOA弱化了中间的管道和总线,强化了两端;
  • 微服务MSA使用通用的轻量级协议和更加web化(RESTFUL)。

3、应用架构改造

系统是什么?系统=元素+关系。应用架构是什么?应用架构=应用+架构。应用就是系统的最小单元,应用分级和应用编号则构成了应用关系即应用的架构,它有利于应用的管理、交互和追踪。应用分为产品线,子系统和应用3级,每一级编号为2位,如100206。应用要从用户的视角出发,先有用户,然后有应用功能,这样才是以用户为中心去构建系统。

4、组织架构微调

组织架构没有最佳实践,只有适合于自已当前的选择,以下是组织架构与技术架构对齐方面的思考:

  1. 艺术与工程相关分离:UED;
  2. 软件开发与硬件相分离:运维;
  3. 技术研发与业务研发相分离:架构部;
  4. 需求,实施,验收相分离:每业务线分产品组、开发组、测试组;
  5. 开发按业务职责相分离:预订组、产品组、订单组;
  6. 专业技术委员会制:测试、产品、开发、轮流主持,设委员长;

总结

1、过程总结

  1. 第一步总体规划:手握地图,明确路线;
  2. 第二步数据库:建库拆库,去join去SP;
  3. 第三步中间件:按需构建,先增加常用;
  4. 第四步服务:技改=工单,有业务价值输出;
  5. 第五步应用:拆应用,建门户Portal,重构应用;
  6. 第六步组织架构微调:组架技术与组织架构对齐,技改之后调整;
  7. 第七步固化:框架化,自动化,管理过程工具化如DevOps。

2、经验感悟

  • 从服务入手是错的,从数据库或中间件入手是正确的。服务属于高级阶段,方便行为的重用,是深层次优化,但太慢了;
  • 从当前问题或故障入手,要先灭火,逆向分析dump工具很重要;
  • 历史要尊重,早期不可做大的改动,不能过多地影响现有业务。建议只做加法,建新库和新中间件,这样就不会有太多阻力和负担;
  • 一般不能全部重建,除非系统较小,系统规模大时只能拆分后分步重构;
  • 技术并不是技改过程中最复杂的,人和事及关系才是麻烦的部分,历史问题的后面是人;
  • 每次环境和问题都不一样,要有准备脱一层皮的心态。

3、通盘无妙招

技改是大折腾,于公司于个人而言都是,小改怡情,大改伤身,我们应该避免大的技术改造,但此现象又比较常见,特别是业务发展快的创业公司。所以真正高手下棋,应该是通盘无妙招,让正确的事情很容易发生,基于自然的演化来实现技术的演进。

怎样才能通盘无妙招,系统良性长久的发展?我们需要两个力量,一个是技术,一个是业务,如果只重视业务,而很容易在技术上积劳成疾,如果完全技术驱动,则又容易忘记业务目标。所以它们应该相伴相生,共同发展,在大的技术改造实施之后,在框架和流程相对固化后,小的技术重构项目应该长期存在,这样才能良性循环,让系统进入自然演进的状态。

5

互动问答

问题:请问张老师如果再来一次技改你会怎么做?在你做过的技改过程中你觉得你最大的收获是什么?觉得做的不好的又是什么?

这个问题非常好,为了更好回答您的问题,我简单介绍一下本人的3次技改经历。我的第1次技改是重建,项目从10月份到第二年8月,历史10个月,可以说是技术成功项目失败。第2次技改是重构,只管技术,少管人和业务,整体效果好,可以归结为成功。第3次技改还是重构,既管技术又管人,且业务处于高速发展期,资源少,可以总结为技术与业务相伴相生,技术效果一般。

如果以后还有机会,自已就不再直接负责了,实在是太累,从内外各招几个架构师,并按上面的工作流程和方式,然后把握好技术与业务的关系和资源占用即可。回到具体问题:

  • 如果再来一次,我会多参考第2次技改经验,即PPT分享的过程总结;
  • 技改后的收获是脱胎换骨,技术和管理都有很大提升;
  • 不好的地方:要更多的关注业务,以及平衡好业务与技术的关系。

问题:单块应用向微服务迁移时,平滑过渡有什么技巧?如何解决分布式事务一致性呢?还有关于微服务持续交付、测试、监控(语义监控)方面有落地工具吗?

  1. 平滑过渡的技术:直面当前系统的问题,不断有价值输出,然后参考上面的过程总结,先规划,然后中间件和数据库,最后是服务和应用;
  2. 分布式事务一致性:使用替代方案,如最终一致;
  3. 落地工具:MSA与SOA的治理没有本质差别,还是 DevOps / Trace / Metrics /,我们使用的是 ServiceStack / JMetrics / CenterLog / Jenkins /。

问题:如果旧有模块关联复杂,又影响现有系统性能,相关开发人员流失,不好梳理,改造有风险,重写老板不答应,该如何取舍呢?

  • 旧有模块关联复杂,又影响现有系统性能:先灭火解决当前故障, 逆向分析dump工具;
  • 相关开发人员流失:引进中件间,建立分享机制和学习型团队,讲技改总体规划,让每个人了解自已的价值和目标;
  • 不好梳理,改造有风险:内招几个老员工成为应用架构师;
  • 重写老板不答应:有业务价值输入,技改==工单或项目,借助业务项目来实现技改。
时间: 2024-10-12 20:13:54

【转】技改之路:从单块应用到微服务,我的血泪总结的相关文章

拆分:分解单块系统——《微服务设计》读书笔记

通常,我们可能已有有一个巨大的单块系统,如何实现微服务,我们需要把它分解. 从哪里开始拆分:接缝 接缝:从接缝处可以抽取相对独立的一部分代码,对这部分代码的修改不会影响系统的其他部分.这些接缝就可以作为服务的边界. 那如何识别出接缝呢?我们可以使用前面所提到的限界上下文,也可通过程序中的命名空间来帮助我们,也可以通过工具来帮助我们,如structure101这样的工具来可视化包之间的依赖. 杂乱依赖的根源:数据库 为什么这么说?因为,通常情况下,我们在业务层的代码已经通过分层组织到相应的包中了,

转:Stack Overflow通过关注性能,实现单块应用架构的扩展能力

原文来自于:http://www.infoq.com/cn/news/2015/07/scaling-stack-overflow 在New York QCon 2015大会上,David Fullerton 深入解析了如何使用C#/ MS SQL支撑Stack Overflow网站的单块应用架构,这个网站每月处理40多亿的用户请求.Fullerton 认为,关注性能就可以几乎免费地使网站具备应付高并发的扩展能力:同时,通过减少对外部服务的调用,SOA开销(SOA tax) 得以避免. Full

RAID5单块和多块硬盘故障如何恢复

RAID5是比较常见的磁盘阵列,具有比较高的容错能力,深得大家喜爱.虽然raid5容错性很高,但是也有遇到故障的时候,下面给大家分享遇到raid5单块和多块硬盘的故障如何恢复和硬盘数据恢复方法. RAID5单块硬盘故障恢复方法: 单个硬盘失效,我们通过热插拔拔下来再插上去.如热插拔没用在进入RAID配置界面,将该硬盘进行ForceOnLine操作.还可以通过更换其它硬盘插槽,切记不要打乱磁盘顺序.如果上面操作不能解决问题,尝试将该硬盘格式化后插入,然后使用ReBuild操作.在这过程中可能会遇到

RAID5容量计算方式:单块磁盘容量*(n-1)

RAID 5因为要容错.并行读取,就是少一个盘符的容量(容错备份用了),话说RAID 0更是减少一半盘符容量.具体的懒得自己打了,copy过来了:RAID5的可用磁盘数为:n-1.也就是说磁盘做RAID5后系统可使用容量为:单块磁盘容量*(n-1)所以你4块盘的RAID5,可用容量为:500G*(4-1)=1500G=1.5T RAID5把数据和相对应的奇偶校验信息存储到组成RAID5的各个磁盘上,并且奇偶校验信息和相对应的数据分别存储于不同的磁盘上,其中任意N-1块磁盘上都存储完整的数据,也就

单块读

什么是单块读? 顾名思义,就是单个块单个块得读,等待事件表现为db file sequential read: 单块读有哪些情况? 大部分索引扫描是单块读(除index fast full scan),rowid回表是单块读,undo里读数据是单块读,行迁移行链接是单块读,读取段头是单块读,读边界块是单块读. 现在就来探讨下undo里读数据是单块读的情况: --session1: SQL> begin 2 for x in 1..1000000 loop 3 update t set id=99

买单侠微服务的API网关演化之路

伴随着买单侠业务的快速发展,能够支持独立开发.独立部署.独立扩展的微服务在秦苍得到了广泛应用和蓬勃发展,短短3年左右时间,已经发展到了300+个微服务,并且还在快速增长中. 研发逐渐意识到伴随着微服务规模化的增长,必需要重视微服务的基础设施建设(API网关.服务注册中心.调用链跟踪等)才能保持开发效率和产品的质量. API网关作为访问微服务的大门, 是访问后台服务的入口,作为最常用的基础服务之一,其重要性不言而喻.在买单侠微服务的发展道路上,经过了以下摸索发展阶段,希望能给规模化应用微服务的攻城

三层应用与单块架构

1.1 三层应用架构的发展 1.1.1 三层应用架构的发展 层能够被单独构造 每层具有区别其他层的显著特点. 层与层之间能够相互链接,互相支撑,相互作用,相互协作,从而构成一个整体, 层的内部可以被替换成其他可工作的部分,但对整体影响不大 1.1.2 什么是三层架构 三层架构通常包括表示层,业务逻辑层以及数据访问层. 表示层 表示层部分通常指当用户使用应用程序时,看见的,听见的,输入的或者交互的部分.    业务逻辑层 业务逻辑层部分是根据用户输入的信息,进行逻辑计算或者业务处理的部分.  数据

(转)微服务框架落地实践之路

http://www.primeton.com/read.php?id=2276&his=1 一.微服务架构产生的背景 近十年中,互联网给我们生活带来了翻天覆地的变化,消费者的生活方式日益数字化,人们可以在任何时间.任何地点利用网络进行购物体验,运用社交媒体进行自我表达,企业也在运用多种技术手段,发挥数字化潜力,改善客户联系,促进企业业务模式的转型.在这种背景下,互联网也好,传统企业也罢,都面临一个共同的需求:面对快速变化的需求,面对业务模式的升级,如何构建出灵活的,可扩展,可重用的系统? 前几

从 Spring Cloud 开始,聊聊微服务架构实践之路

[编者的话]随着公司业务量的飞速发展,平台面临的挑战已经远远大于业务,需求量不断增加,技术人员数量增加,面临的复杂度也大大增加.在这个背景下,平台的技术架构也完成了从传统的单体应用到微服务化的演进. 系统架构的演进过程 单一应用架构(第一代架构) 这是平台最开始的情况,当时流量小,为了节约成本,并将所有应用都打包放到一个应用里面,采用的架构为 .NET SQL Server: 表示层:位于最外层(最上层),最接近用户.用于显示数据和接收用户输入的数 据,为用户提供一种交互式操作的界面,平台所使用