作者 曹亚孟
前言
架构师是个无趣的工作
老僧三十年前未参禅时,见山是山,见水是水。
及至后来,亲见知识,有个入出,见山不是山,见水不是水。
而今得个休歇处,依前见山只是山,见水只是水。
参禅的三重境界在IT技术圈同样适用,初学者感叹每个产品都如此精妙绝伦,追逐着最强的IDE;老司机喜欢自比管乐指点江山,嘲讽着最好的语言;当一切回归平淡,搞IT就是一份思想延伸和语言翻译工作;其中技术架构师就是一份古朴甚至无趣的工作。
我将架构师的工作总结出五条核心道理,这五条经验简单直白又深奥通透,算是对我十二年IT工作的一个总结。
配图说明:架构技术像机器人哄小孩一样简单
1. 需求优化最重要
少查少写少依赖,Less is more
一个IT系统是多角色多模块分层分级的,像OSI模型上层应用简单依赖下层支撑,SOA设计中同级角色也只看对方的接口。
各角色分工明确方便快速实现业务,但是给架构优化也埋下大坑,底层的盲目支撑是巨大资源浪费,平级调度协作也没任何弹性。前端一个小逻辑需求会导致后端大规模联动,不同服务也没权限理解对方的内存数据,各个角色的工程师都只看自己的工作范围,这是正常又无奈的现状。
我们要搞架构设计最重要的就是砍需求,将上层应用的需求优化删减,让同级的业务能容错。上层需求优化,即前端对后端少输入少查询多容错,而同级容错可以看做应用间的需求优化,比如两个服务可以幂等重试就是好解耦,而A系统会等B系统等到死锁就是架构悲剧。
某电商ERP系统的用户点一次查询按钮,后台系统就锁库查询一次;实操过程中系统越慢用户就重复点查询按钮,而并行查询越多后台速度就更慢。这种环境要搞架构优化,首先要理解自然人并不要求实时数据,ERP客户端限制每15秒才能点一次查询按钮,在Web接入层限制每个Session每分钟只能查询一次,还可在数据库链接类库上做一层控制策略。
多媒体服务工程师最好的情人节礼物会是一个完美的播放器;它可以自助容错选择CDN,可以主动预缓存下一分钟的点播内容,可以完成私有解密编码工作,可以和广告系统解耦独立加载,可以在卡顿时更换线路和存储日志,广告日志和卡顿日志都低速适时后台上传。
配图说明:抓住核心诉求,不该要的东西都不要
2.群集设计通用规则
前端复制后端拆,实时改异步,三组件互换
前端复制后端拆,实时改异步,IO-算力-空间可互换——要做架构就要上群集,而群集设计调优翻来覆去就是这三板斧:
前端是管道是逻辑,而后端是状态是数据,所以前端复制后端拆。前端服务器压力大了就多做水平复制扩容,在网站类应用上,无状态-会话保持-弹性伸缩等技术应用纯熟。后端要群集化就是多做业务拆分,常见的就是数据库拆库拆表拆键值,服务拆的越散微操作就越爽,但全局操作开销更大更难控制。
实时改异步是我学的最后一门IT技术,绝大部分“实时操作”都不是业务需求,而是某应用无法看到后端和Peer状态,默认就要实时处理结果了。CS模式的实时操作会给支撑服务带来巨大压力,Peer合作的实时操作可能会让数据申请方等一宿。架构师将一个无脑大事务拆分成多个小事务,这就是异步架构,但拆分事务就跟拆分数据表一样,拆散的小事务需要更高业务层级上做全局事务保障。
在群集性能规划中,网络和硬盘IO+CPU算力+磁盘和内存空间是可以互换的,架构师要完成补不足而损有余的选型。比如数据压缩技术就是用算力资源来置换IO和空间,缓存技术是用空间和IO来缓解算力压力,每个新选型都会带来细节上的万千变化,但每种变化都是符合自然规律有章可循的。 一个经典微机系统就是中央处理器+主存储器+IO设备,这几个概念居然和群集性能规划是一一对应。
配图说明:架构常见技巧就像空中华尔兹一样自然优雅
3. 理解硬件天性
角色选型时要看硬件的天然特性
别让硬盘扛性能,别让内存保持久,别让网线扛稳定。
架构层软件技术已经足够成熟,所谓技术选型不如说是适应场景;在做具体角色选型时,最深度也最易忽视的原则是顺应硬件天性。
我的精神导师说过,如果一个服务依赖硬盘,那这个服务就不适合扛性能压力。我经常将读写引到/dev/shm;SSD盘让很多细节调优聊胜于无,还让Fat32枯木逢春;个别队列和分布式存储在意硬盘的性能力,但都是应用了顺序读写内容,且不介意磁盘空间浪费。
别让内存扛持久和别让网线扛稳定,听起来很简单,但新手程序员总会犯低级错误,而犯错早晚要还技术债。常规例子就是看新手程序是否有捕获各种异常的习惯,举个争议性例子,某些云服务设计者尝试给一个进程映射和绑定持久文件系统,请问一段内存如何绑定一块硬盘?
配图说明:谈到天性,我总是想起流畅奔跑的小波妞
4. 数据的产生和消失
数据不会凭空产生,但会凭空消失
数据不会凭空产生,计算机或者自输入设备获取数据,或者自其他数据源导入数据,而且原始数据的转化规则也要人类来定义。我们要便捷轻巧安全可靠的获取数据,就要选好数据源,保障好传输路径,定义好数据变换规则。
在一个数据生命周期内,为了防止数据全部或部分凭空消失,数据的容错校验、关联复原、冷热备份和安全删除都要考虑到位。
在生僻业务的规划实施过程中,没人告诉我们该有哪些服务,我们只能靠摸透一个又一个访问逻辑图和数据生命周期,来摸索群集内有哪些角色和依赖关系。
架构师的核心技能包括画好访问逻辑和数据流量图,因为问题现状描述清楚了,问题就解决了一多半了。一个好的业务访问逻辑图,不仅仅是几个圈圈几条线连起来,其信息量大到包罗访问过程的所有元素,也要详略得当高亮关键点。
配图说明:咦?数据被拿走了。是啊,拿走了,好巧,我们不要做点什么吗?
5. 各环节都不可盲信
容灾设计中都尽人事和听天命
整个IT系统中就没有可靠的组件,架构师既不能盲目信任撞大运,又不能无限冗余吓唬自己,而是在尽人事和听天命之间做好权衡。比如TCP就是要建立可靠链接,而现在做性能优化的时候,大家又嫌TCP太过笨重了。
业务应用不可靠,如果该应用能快速重建也不阻塞其他应用,月级偶发的内存泄漏和意外崩溃都是可以接受的。支撑性服务不可靠,对于大部分业务,预估一年都不丢一次数据,SLA能到99.95%就可以了。操作系统故障崩溃,现在商用系统内核都很稳定,一般故障都出在硬件驱动兼容性上,或者有些照本宣科的傻瓜乱改默认参数。网络不稳定,内网通用的技术方案很成熟,少提复杂需求内网就能很稳定,我们最烦的是单条网线处于半死不活状态;IDC的外网SLA默认就是3个9,所以我说支撑性服务能到99.95%就已经很可靠了。硬件不稳定,大部分架构师根本不懂硬件,只要不出硬件批次故障,架构师就可以将单点硬件和系统、服务绑在一起做可靠性设计。人力误操作,我们招不到不出故障的人,我自己达不到不出错的标准。只要员工没有恶意破坏,出了大范围故障就是群集健壮性设计不到位,别让操作工给技术总监和架构师顶包。监控和备份是运维的职责,但架构师需要帮忙确认目的正确性,别备份了半天废数据,监控只看telnet80。配图说明:干活的角色和捣乱的角色一样多,甚至更多
结束语
架构之术繁琐,架构之道浅显
本文讲的是架构工作的“道”,对与架构之“术”并不提及。不同的业务系统的架构之术完全不同,能拿来汇总借鉴的只有这几条简单的道理。
如果一个架构师只是炫耀具体优化架构的手法,却闭口不谈选型的道理,他们其实是在简单用公司业务尝试赌博。
如果我们有架构之道做思想支撑,即使接手全新业务类型,庖丁可以解牛也可以杀猪,我们一样能游刃有余心里不慌。我曾经接手三种生僻晦涩的业务,按照本文的原理去拆解和规划,就没有什么特别难的。
配图说明:心里不慌就飞起来吧!