阿里毕玄:系统设计之解决核心问题的设计

本文涉及的产品
传统型负载均衡 CLB,每月750个小时 15LCU
EMR Serverless StarRocks,5000CU*H 48000GB*H
应用型负载均衡 ALB,每月750个小时 15LCU
简介: 作者结合cases来讲讲解决核心问题的设计这个环节,回顾自己的cases,犯了不少的错误,也碰到了非常多复杂的权衡选择的状况,才逐渐更加明白一个架构师应该具备的一些能力。

作者:毕玄   
文章来源:微信公众号HelloJava

继前面的系统建设的目的、可衡量的目标,达成目标的核心问题后,进入到解决核心问题的设计环节了,技术人员其实最擅长的是直奔这个主题,而且估计更期盼的也是这篇,有些时候会导致跳过前面的目的、目标环节,导致最终做出来的系统要么没贴合业务挑战,要么嘛偏离了做这个系统的初衷,所以我仍然强烈建议做系统设计的同学不要着急,一步一步来。

继续结合自己的cases来讲讲解决核心问题的设计这个环节,回顾自己的cases,犯了不少的错误,也碰到了非常多复杂的权衡选择的状况,才逐渐更加明白一个架构师应该具备的一些能力。

HSF的设计

HSF在设计之初要解决的第一个核心问题就是做一个易用,能支撑每天上亿次服务调用的服务方式的RPC框架。

易用这点在第一个版本犯了错,不过还好是第一个版本,否则纠正错误的代价会无比巨大,那个版本里,如果要把一个spring的bean发布为HSF服务,或者调用一个HSF服务,需要写一个文件,在文件里描述发布的服务和调用的服务,并且在这个文件放在jboss的某个目录里,这个方式看起来对在写代码的过程中完全没有侵入,但导致的巨大问题是这文件放在哪里写,写完后部署的阶段怎么自动放到对应的目录去,在第二个版本里才把这个调整为用一个Spring Bean的方式来做服务的发布和调用,尽管这一定程度导致了业务代码需要有对HSF的明显的依赖,但对维护、部署等都变的很标准,所以从这里可以看到,设计是全方位的,要考虑到的不仅仅是怎么实现,还有别人怎么用,运行、维护阶段又是怎么样的。

HSF犯的第二个错,就是在能支撑每天上亿次服务调用的RPC框架这点上,是给我自己代码生涯最大的教训,甚至彻底改变了我之后做设计时的技术选型风格,在做HSF之前,我从来没做过一天访问量超过100w的系统,完全搞不清一个每天上亿次的系统到底有什么不同,HSF最早的版本在通讯框架上选择了JBoss-Remoting,原因也其实比较简单,因为我们用的Web容器是JBoss,结果这个版本在一个非常重要的系统上线时,出现了严重的故障,导致了整个网站的响应速度都变的很慢,当时查了几乎整整一天都没查出原因到底是什么,后来回滚恢复,所以可以肯定是HSF上线造成的,等到回滚后的一个星期内才查出原因,是因为JBoss-Remoting在调用远端时,默认的超时时间为60s,而我们后端的那个系统在处理某些服务的时候会特别慢,进而导致了共用的处理线程池满了,所以整个网站的表现就变慢了,这次问题让我彻底明白了访问量大的系统最重要的是对整个系统的处理过程要非常的清楚,因为在访问量大的情况下,一些小的问题有可能会放大成很大的问题,进而到故障,所以访问量大的系统对技术的可控性要求是极高的,这也是最大的不同,可控性并不代表一定要完全自己写,但要求如果用到开源的东西,要对开源的东西的代码逻辑非常熟悉,为了解决上面的问题,HSF基于Mina写了一个自己版本的通讯框架,自己来处理连接方式、线程池等,后面在做各种HSF改造,以及其他技术改造时,基本都遵循了技术可控性这个原则。

在前面核心问题那篇里也讲到,HSF在设计时其实核心问题提炼的就是有问题的,导致了后面在负载均衡、服务化后问题排查这两点上出现了严重的返工现象,而这些本其实都可以避免,就像现在再去做服务化框架的人基本都不会犯这样的错了。

在负载均衡这点上,在早期版本里,是通过硬件负载均衡设备来做的,这里造成了好几个问题,一是需要先配置要调用的服务的vip地址,当然,这可以通过一个中央的配置服务器之类的方式,第二个是HSF采用的是长连接的方式,通过vip去连接后端的一个集群时,这里会出现非常麻烦的问题,例如后端集群发布重启,很有可能就会造成连接的极度不均衡,进而导致故障。

除了上面两个问题后,还有一个触发HSF去做改造的原因是当时的硬件负载设备出现了流量跑满的现象,而这是必须要经过的一个点,会造成全站全部崩溃,不希望在未来系统中有个这么大的高风险的集中点,再加上上面的两个问题,决定做彻底的改造,于是HSF开始设计了目前看起来在服务框架体系中非常经典的软件方式的服务注册、发现和寻址的结构。
image.png

在负载均衡这件事上,现在回顾也可以看出这个仍然是当初对一个访问量巨大的系统考虑不够全面造成的。

在服务化后会带来的排查问题这点上,当初设计的时候更是完全没有考虑到,导致了后面排查问题效率低、人力投入大等等问题,后来为了解决这个问题,学习了Google家Dapper的思想,但花了很长时间这东西才真正落地。

除了上面这些外,HSF其实还有各种设计问题,例如最早的通讯协议里竟然是没有版本号的,导致后面升级时处理兼容的复杂,又例如更麻烦的一个话题就是在多语言支持上。

HSF作为我第一个真正做的访问量巨大且核心的系统的设计,由于当初的技术功底,犯下了无数错误,导致了N次返工、故障和弥补,当然也让自己得到了很大的成长,这几年回过头想这个问题,越来越觉得必须无比感谢我当时的主管对我巨大的包容和支持,HSF的经历,让我在解决核心问题的设计这个环节上,明白的是作为一个架构师,在技术选型上深厚的技术功底,在整个设计方案上知识的广度,考虑的全面性(从开发态、部署态、运行态和运维态)都是要求极高的。

T4的设计

T4在核心问题的提炼上没有太大的问题,但在怎么解这个问题的设计上那犯下的错误现在来看都是低级到不行。

为了做到在一台机器上能比以前用虚拟机的方式运行更多的应用进程,最早我们采用的方法是各种hack,其实要实现的就是进程级隔离,结果就是hack到了一定程度后,确实勉强能用了,但上线了一些小范围,有了一些用户后,发现我们的hack是很难枚举的,非常痛苦,直到有一天“发现”了LXC,才走对了路线。

除了上面这个选型层面的问题外,T4的过程中还碰到过很多类似的问题,例如用什么方法去控制磁盘空间的限制,最早我们也是用的同样的image的方式,但image的方式对磁盘空间超卖其实是非常不友好的,后来为了把这个方案更换成dir quota的方案,一帮人几乎是连续折腾了一个多月,因为线上已经在运行的要通过cp文件等方法来弄。

HSF的那段看到的很多是在技术深度上的问题,而T4的这段设计,现在回顾最主要的问题是这个技术领域视野的严重问题,所以我认为作为架构师,在相应的技术领域要有足够的视野,一定要知道这个领域的工程界、学术界是什么情况,这样对自己在结合目的、目标以及一些约束条件下做出更合理的技术选型是非常重要的,之前也写过一篇关于如何扩充技术视野的文章。

异地多活的设计

到了做异地多活这个阶段,也许是因为有了前面的一些积累,总结反思,我自己觉得异地多活的设计更多的是选择,至于对错我总体认为还好,所以这里我就讲一些异地多活设计上为了解决核心问题所面临的一些权衡选择,而这也是架构师在做设计上非常重要的一个部分,如何去根据各种约束来做一些方案的权衡选择。

异地多活在核心问题上要解决的是请求封闭、数据一致性这两个关键问题,在为了解决这两个问题的设计上,参考了工程界的一些情况,最后发现我们所面临的状况还是很不一样。

在这里就抛出一些异地多活设计上所面临的选择,我就不去讲我的选择逻辑之类的了,方便大家思考,以及交流探讨。

  1. 流量/数据拆分的规则到底按什么好?买家/卖家/商品?
  2. 分流的规则和数据库分库分表的规则的关系:松耦合 Vs 强绑定?
  3. 数据同步策略的选择:部分 Vs 全量?
  4. 数据一致性的保障,在哪些层面做,CAP?
  5. 部署的选择:两地 Vs 三地,地域的分布选择?
  6. 落地节奏,一年?两年?三年?

关于异地多活设计的文章往上也有很多了,感兴趣的之后也可以去翻翻。

近几年或现在在做的诸如统一调度、云化这些事情暂时还不太适合公开层面来讲,以后有机会了再来讲讲在这些事情上系统设计上的一些状况,所以就以这三个cases来讲讲解决核心问题的设计这个环节。

架构师应具备的能力总结

最后根据目的、可衡量的目标、核心问题提炼、解决核心问题的设计这些环节,总结提炼下我觉得架构师需要具备的能力:

  1. 对业务所面临的挑战的理解,从业务挑战到技术挑战映射的能力,或者说技术抽象的能力;
  2. 知识储备以及考虑的全面性,从开发、部署、运行、维护态;
  3. 技术选型能力,极厚的技术功底,开阔的技术视野;
  4. 在各种约束条件下权衡选择的能力,原则。

所以架构师我觉得绝对不是烂大街的头衔,要做到一个合格的架构师还是相当难的,尤其是工程类型的架构师,需要长期的实战、经验积累。

系统设计一直是我认为最难讲的内容,这个系列的文章能写到现在的第4篇,主要还是因为我在内部尝试做的一个系统设计的培训,非常感谢一帮同学支持了我做这个培训,要不是他们的参与,我觉得不可能写这些文章,也不可能较为体系化的说说系统设计,并且更重要的是让我觉得系统设计这个东西其实还是可以不讲的那么虚的,以及系统设计的技能一定程度上确实也是可以培养的。

这个系列的文章会按照聊聊系统设计的套路来写,写的时候会理论结合实践,实践主要是讲我自己在相应的点上的一些经历:

  1. 系统设计之系统建设的目的
  2. 系统设计之系统建设的目标
  3. 系统设计之达成目标的核心问题
  4. 系统设计之解决核心问题的设计 - 本文
  5. 系统设计之设计原则

作者简介:

IMG_20190813_191335.png

毕玄,2007年加入阿里,一手打造了HSF,十多年来更见证参与了阿里在基础技术上的演进与发展:如淘宝在2007-2009年的分布式应用架构升级、2013-2016年的阿里电商异地多活架构升级等。

相关实践学习
SLB负载均衡实践
本场景通过使用阿里云负载均衡 SLB 以及对负载均衡 SLB 后端服务器 ECS 的权重进行修改,快速解决服务器响应速度慢的问题
负载均衡入门与产品使用指南
负载均衡(Server Load Balancer)是对多台云服务器进行流量分发的负载均衡服务,可以通过流量分发扩展应用系统对外的服务能力,通过消除单点故障提升应用系统的可用性。 本课程主要介绍负载均衡的相关技术以及阿里云负载均衡产品的使用方法。
相关文章
|
存储 分布式计算 架构师
阿里架构师十年开发总结的《分布式系统开发学习笔记》太强了
分布式系统 分布式系统是将多台小型微型机互连组成的一种新型计算机系统。它冲破了传统的集中式单机局面,从分散处理的概念出发来组织计算机系统,具有较高的性能价格比,灵活的系统可扩充性, 良好的实时性、可靠性与容错性等潜在优点,是近几年来计算机科学技术领域中极受重视的新型计算机系统,现已成为迅速发展的一个新方向。
|
架构师 搜索推荐 IDE
架构师13年经验而成的软件平台架构设计与技术管理之道终于曝光了
计算机技术的发展日新月异,市面上软件架构、项目管理、IT技术类书籍层出不穷,从软件专业和技术视角进行阐述的居多,但对技术烂熟于胸,还是无法保证你能成为优秀架构师或驾驭平台的技术负责人。
|
开发框架 负载均衡 安全
闲话SAAS系统设计-概述
闲话SAAS系统设计-概述
293 0
闲话SAAS系统设计-概述
化繁为简!阿里新产亿级流量系统设计核心原理高级笔记(终极版)
不管是初入职场的小菜鸟还是有一些工作年限的老司机,系统设计问题对他们来说都是一大困扰。前者主要是在于面试;面试官来一个如何从零到一设计一个完整的系统?大多数人都会直接懵了,因为系统设计覆盖面广,而网上资料又不能面面俱到,单独背背文章肯定是不行的;后者主要在于晋升;想要从程序员进阶到架构师,系统设计是必须要踏入的一道坎,他对你的技术广度跟深度都会有一定程度的考察。
|
运维 Oracle Java
毕玄:怎么提升写代码的能力
毕玄:怎么提升写代码的能力
110 0
|
程序员
职场人最基础的核心能力是什么
职场人最基础的核心能力是什么
109 0
职场人最基础的核心能力是什么
|
程序员
1分钟了解职场人最基础的核心能力是什么
1分钟了解职场人最基础的核心能力是什么
103 0
1分钟了解职场人最基础的核心能力是什么
|
Go 区块链 数据安全/隐私保护
魔豹联盟2.0系统项目开发技术方案(技术原理成熟方案)
魔豹联盟2.0系统项目开发技术方案(技术原理成熟方案)
241 1
|
消息中间件 存储 缓存
读书笔记 之《软件架构设计: 大型网站技术架构与业务架构融合之道》
帅哥美女,知道你们时间宝贵,那么就由小菜为你读好一本书,读一本好书,取其精华,与你共享~!今天带来的是 《软件架构设计:大型网站技术架构与业务架构融合之道》 的读书笔记
487 0
读书笔记 之《软件架构设计: 大型网站技术架构与业务架构融合之道》
阿里毕玄:聊聊系统设计的套路
系统设计我一直觉得是远比Java编程技能更难多了的培训,很容易变成务虚课,全是一堆理论。从和学员的互动中学习到了很多,对系统设计的一些方法论进行抽象总结,所以我和这些捧场的学员们说其实是我们一起在共创系统设计的课程 。
4184 0