架构师成长指南

架构师的职责是设计一个信息系统的架构,设计过程需要将系统分解为很多个不同的部分,定义各个子系统之间的通信接口,以及各个子系统的技术选型。

要成为一个架构师,就需要对设计一个信息系统的各种子系统有所了解。这样才能在面对新的项目时,使用各个组件如同积木一般,选择最合适的部分来搭建信息系统。如下分为几个大的组成部分:

1. 通信协议

各个子系统之间要进行通信,必须要选择一种或多种通信协议,现代比较常见的都是基于HTTP的协议。更早期,为了追求性能,有过一些基于TCP协议的实现。建议还了解下CORBA等RPC方式。了解更多协议对于学习安全也有很大帮助,比如MySQL和PostgreSQL的协议都有安全的设计。

2. 序列化

系统之间通过网络传输,或者存储到文件时,肯定只有一种格式,就是字符串。要将复杂的数据结构与字符串之间进行转换,就需要用到序列化。简单的序列化如JSON和XML,稍微复杂些的有protobuf、thrift等。需要了解所有这些序列化方式之间的优势和劣势。比如JSON和XML只能用于传递数据,而protobuf与thrift还可以用来做RPC协议。至少要确保每种序列化方式都自己尝试过hello world。

3. 数据库

要形成自己的数据库选取风格,就需要先对自己常用的数据库有足够深入的了解。对于关系式数据库,除了一般的Create、Query、Delete、Update操作外。还需要能自行建立索引,数据库的平行扩展,了解如何进行性能调试。以及了解常见查询操作的性能级别,常见的查询性能瓶颈点。一个较好的例子是 “SELECT COUNT(*) FROM table WHERE dt_create-86400>NOW();” 。

4. 存储

存储分为几种类型。NAS等各家产品有所不同,大多是通过NFS来访问的,这个不必多讲。问题是NAS的价格很高,而且在去IOE的趋势中很多人也不愿意再用。所以经常会有基于文件系统建立小规模存储的需求。要关注的点主要就是每个目录下的文件数不应该太多,当一个目录下文件数(实际是inode数量,包括文件和目录)超过1000时,性能就很差了。所以建议的做法是将一个系统中要存储的对象ID做16进制,随后每2位16进制做成一级目录。这样可以确保每个目录下的文件数不会超过256个。现代云计算,如Amazon S3已经把存储的问题解决的很好了,如果可能,尽量用好。

5. 应用框架

此事在各个语言之间各有选择,多注意了解自己关注方向的所有框架的优势和劣势。至少当有个毛头孩子问你为什么不选择某个最新的框架时,要有自己的观点来给出明确的答复。对于常见的框架,十分推荐自己重新实现一个来当作锻炼。实现一个WEB框架,他用了不到200行代码就实现了。

6. 接口

主要是指接口协议,或者RPC协议。系统之间进行RPC调用很常见,注意选择个自己能熟练使用的,并且有所深入研究。并了解其常见的限制。RESTful API就是个比较常见的选择,但是性能并不好。要自己对性能等参数有个量化的了解,而不是简单的一句好或不好。短连接接口在三次握手时是串行操作,要了解其为何耗时。

除了要在如上的各种不可或缺的组成部分中有所了解,还要能清楚的知道一些常用系统模块的原理,并能够很深入的玩起来。几个值得注意的:

1. HTTP服务器:常见的无非是nginx、apache,自己要能进行基本配置,包括静态文件、fastcgi转发等

2. 关系式数据库:常见的如mysql、postgresql、sqlite,自己要对每一种都有深入的了解。自己要做一遍常见操作的性能测试,并能牢记于心。比如sqlite虽然并不需要走网络,但是实际查询性能是很差的。我2008年就发现其 “”共同作用的查询的例子比走网络的mysql还慢了几十倍。

3. NoSQL数据库:memcache、redis、mongodb等,近几年有很多,挨个了解下其实现原理,以及各种常用操作的性能。当有需要时,要随时能拿得出手来用。

4. 云计算平台:几种常见的云计算平台的应用方式要有了解,如Google的资源方式,和Amazon的VPS方式,每种云计算平台往往还会提供一大堆的附加服务,比如可靠数据库,存储,缓存等,也要分别有所了解。

5. 加密/签名技术:常见如truecrypt、openssl、gnu pg、sha1、md5、scrypt等,了解各种加密/签名技术的安全性,字长等,并都能自己做过hello world。

一些网上常见的系统服务形式的架构设计也要仔细了解清楚。一般此类系统的开发人员,往往会通过个人博客,或者一些活动的PPT中进行讲解。仔细找找会有不少收获。值得关注的常见系统架构

1. 博客/论坛:博客和论坛有很多,并且各个网站也都很常用,了解下其原理,最好自己写个练习下。

2. 微博:Twitter/weibo等,涉及到大量的联表查询,需要用多种办法来优化查询性能。

3. 云计算:云计算的几个常见平台的服务提供方式,如Google和Amazon的,如果精力够用最好了解下OpenStack等搭建私有云的方式,总的来说,这是未来的大方向。

4. 视频播放:在网页上播放视频的技术,包括基于Flash和HTML5的,各种浏览器对视频的兼容性等,了解通过ffmpeg将一个视频转换为标准mp4(HTML5可以播放的)的方式和参数

5. CDN:了解应用CDN的方式,包括拆分静态文件的域名,静态文件版本化,Cookie拆分等相关技术

6. OAuth:与其他网站联合认证的方式,有多种,分别了解。

常见的架构设计陷阱:

1. 用户认证:一开始就应该花大精力设计好用户认证系统,包括不要明文存储密码,包括严格限制Cookie和Session的使用,包括用户认证信息的缓存等。如果需要设计一个长期运行的大系统,强烈建议使用签名来保证Cookie的不可伪造,同时常见信息直接存储Cookie,这样可以避免每次Request都访问数据库。

2. 静态文件存储:如果一开始就将静态文件与主站内容混杂在一起,未来就是个灾难,具体参考CDN的应用方式。

上文是我2014年中期写给我之前下属的。既然开了专栏,就作为开篇吧。

来源:知乎 http://www.zhihu.com

作者:gashero

【知乎日报】千万用户的选择,做朋友圈里的新鲜事分享大牛。

点击下载

Advertisements

Tags: