- 论坛徽章:
- 2
|
6楼
发表于 2014-06-23 18:14
1.“虚幻”的架构常常让人觉得它有很多玄妙之处,也许是因为它难以落在纸上,那架构到底是什么?它的主要表现形式是什么?有人说是图,您赞成吗?
架构是中大型项目中各个实体的组织结构,它本不应该虚幻或者玄妙,但是因为它不像算法,更不像代码,你很难用数学精确地证明“最优”架构,也不能用丰富的经验保证“完美”架构。架构之所以飘忽,是因为现实的残酷,是因为需要考虑的变量太多。如果你假定大量变量永远不变,那这个架构缺乏灵活性,如果你假定只有很少变量永远不变,那这个架构又变得复杂而且多出很多边界条件。
我不赞成架构用“图”来表示。虽然我们看到的很多架构是用图来展现的,但是用图来表示架构就将架构局限为了一种表面的形式。我去年参加sacc 2013的时候,就有很多架构为了画图而画图。本来是简单直接的优良架构,为了能在“图表”上显得高大上,硬是把一个模块拆成多个,一条连接拆成多条。这种图/PPT导向的架构设计,就如果设计模式导向的代码开发一样。
我认为,架构的体现是一种天然的、符合直觉的体现。大部分时候你甚至不应该感受到它带来的约束。对于功能纯粹单一的项目,揉成一团的组织并不一定是坏的架构,对于功能繁复的项目,架构的组成也一定应该是独立自治的模块以最少的连接组成的。
总之:不要过早优化,也不要惧怕演进
2. 架构是一个过程,而非一个结果,真正的架构师会投入到系统的内在结构、规律、原则和逻辑的过程中,美丽的架构都有哪些特性?请举出一些架构案例。
架构是持续演进的过程,没有最好的架构,只有最适合的架构。功能和需求并不是一成不变的,那么架构也应该随之演进。拿捏好架构的“活在当下”和“拥抱变化”是架构师是否优秀的重要考察能力。
架构师需要从一团乱麻中将功能和逻辑逐渐分离开来,优良的架构一般具有以下特点:
(1) 模块职责清晰明确。每个模块的功能都是纯粹的,也不会有多个模块实现相同的功能。模块的内部逻辑应该尽可能少地暴露出来。
(2) 模块间调用简明,符合相同的规范。横向的调用依赖平台无关的接口(非计算密集需求应考虑RESTful接口),纵向的调用使用形式一致的API。只要接口不变,模块的内部变动应该对接口无感知。
(3) 模块内部的子模块设计。模块划分的层次并不是只有一层,当模块变复杂时,一个模块也可能变成多个模块。在对单个模块进行设计时,同时也要把整个模块当作系统来考虑。
以OpenStack的演进为例。OpenStack在早期版本中就十分注重逻辑的划分,nova、swift本身都是自治可自由替换的模块,它们提供相似的RESTful接口。nova内部的nova-image, nova-network, nova-volume也随着系统的复杂性提高,非常轻便地就从nova中分离出来形成新的一级模块。
3.优秀的架构师需要当架构师创建软件系统的架构时,重点应该关注什么?
(1) 扩展能力。最好能平行扩展,即在设计时要尽量保证无状态和状态的中央控制。
(2) 容灾能力。要保证服务的7x24小时运行,可以参照zookeeper和s3等系统。数据的冷热备份更是重中之重。
(3) 模块的划分与模块间的通信。模块的可替换。
(4) 收集一切可用数据。
(5) 不要重复造轮子。积极融入生态环境。
(6) 架构到代码都要清晰、直接、可读。
4.双十一的秒杀战役中,一个购物网站要在一天处理完成超过1亿笔的交易,淘宝网采用什么技术架构来实现网站高负载?
首先是对web服务功能的分离:接入功能、逻辑调度功能、数据服务
然后分别对这几个部分进行细化的设计。
接入上使用lvs等负载均衡工具,将涌入的流量分摊到海量的逻辑服务器
逻辑服务器无状态,只对请求进行处理,更新数据服务,反馈请求结果。逻辑服务器可能也划分成了多种功能纯粹的服务,通过message queue或类似的方式来解耦。
数据服务包括经过精心优化的MySQL/Oracle数据库,以及memcache等缓存服务
5.对于Web服务器来说,不管是Apache、IIS还是其它的Web服务器,图片是最消耗资源的,对社交媒体尤其如此,从国外的Facebook和Twitter,到国内的微博微信,这些大型网站在图片处理上采用了什么策略?
对于流量小、用户少的web服务来说,把图片和静态文件当作同一种资源处理即可。一量流量上来了,图片往往就成为整个系统的瓶颈。
在海量服务上,图片服务独立成单独的服务一般是靠这几个角度来优化组合的:
(1) 后端存储/文件系统层面,使用大量的后端存储来模拟成一个巨大的存储器,每个图片保留多份,防止部分存储崩溃,同时也可以做到就近读取。有些公司甚至开发专有的文件系统来索引图片文件。比如淘宝的tfs的目录结构只有一层,即目录下就是所有的淘宝图片文件。
(2) 后端缓存,对于热点图片缓存起来,用于快速读取图片信息。
(3) cdn前端缓存,建立cdn节点,用户甚至可以直接在家门口就获取到图片,对系统负载完全无压力。
(4) 图片压缩。减少图片尺寸,使用更节约的图片压缩算法。 |
|