系统架构设计经验分享

本人做为一位web工程师,着眼最多之处莫过于 性能与架构,本次幸得参与sd2.0大会,得以与同行普遍交流,于此二方面,有些心得,不敢独享,与众博友分享,本文是此次参会与众同撩交流的心得,有兴趣者能够查看视频
架构设计的几个心得:
一,不要过设计:never over design
这是一个经常被说起的话题,可是只要想一想你的架构里有多少功能是根本没有用到,或者最后废弃的,就能明白其重要性了,初涉架构设计,每每倾向于设计大而化 一的架构,但愿设计出具备无比扩展性,能适应一切需求的增长架构,web开发领域是个很是动态的过程,咱们很难预测下个星期的变化,而又须要对变化作出最 快最有效的响应。。
ebay的工程师说过,他们的架构设计历来都不能知足系统的增加,因此他们的系统永远都在推翻重作。请注意,不是ebay架构师的能力有问题,他们 设计的架构老是创建旧版本的瓶颈上,但愿经过新的架构带来突破,然而新架构带来的突破老是在很短的时间内就被新增需求淹没,因而他们不得不又使用新的架构。
web开发,是个很是敏捷的过程,变化随时都在产生,用户需求变幻无穷,许多方面偶然性很是高,较之软件开发,但愿用一个架构规划之后的全部设计,是不现实的
二,web架构生命周期:web architecture‘s life cycle
既然要杜绝过设计,又要保证必定的前瞻性,那么怎么才能找到其中的平衡呢?但愿下面的web架构生命周期可以帮到你所设计的架构须要在1-10倍的增加下,经过简单的增长硬件容量就可以胜任,而在5-10倍的增加期间,请着手下一个版本的架构设计,使之能承受下一个10倍间的增加。
google之因此可以称霸,不彻底是由于搜索技术和排序技术有多先进,其实包括baidu和yahoo,所使用的技术如今也已经大同小异,然而,google能在一个月内经过增长上万台服务器来达到足够系统容量的能力确是很难被复制的。

三,缓存:Cache
空间换取时间,缓存永远计算机设计的重中之重,从cpu到io,处处均可以看到缓存的身影,web架构设计重,缓存设计必不可少,关于怎样设计合理的缓 存,jbosscache的创始人,淘宝的创始人是这样说的:其实设计web缓存和企业级缓存是很是不一样的,企业级缓存偏重于逻辑,而web缓存,简单快 速为好。。
缓存带来的问题是什么?是程序的复杂度上升,由于数据散布在多个进程,因此同步就是一个麻烦的问题,加上集群,复杂度会进一步提升,在实际运用中,采用怎样的同步策略经常须要和业务绑定。
老钱为搜狐设计的帖子设计了链表缓存,这样既能够知足灵活插入的须要,又可以快速阅读,而其余一些大型社区也常常采用类此的结构来优化帖子列表,memcache也是一个经常用到的工具
钱宏武谈架构设计视频  http://211.100.26.82/CSDN_Live/140/qhw.flv
Cache的经常使用的策略是:让数据在内存中,而不是在比较耗时的磁盘上。从这个角度讲,mysql提供的heap引擎(存储方式)也是一个值得思考的方法,这种存储方法能够把数据存储在内存中,而且保留sql强大的查询能力,是否是一箭双雕呢?
咱们这里只说到了读缓存,其实还有一种写缓存,在之内容为主的社区里比较少用到,由于这样的社区最主要须要解决的问题是读问题,可是在处理 能力低于请求能力时,或者单个但愿请求先被缓存造成块,而后批量处理时,写缓存就出现了,在交互性很强的社区设计里咱们很容易找到这样的缓存
四,核心模块必定要本身开发:DIY your core module
这点咱们是深有体会,钱宏武和云风也都有谈到,咱们常常倾向于使用一些开源模块,若是不涉及核心模块,确实是能够的,若是涉及,那么就要当心了,由于当访 问量达到必定的程度,这些模块每每都有这样那样的问题,固然咱们能够把问题归结为对开源的模块不熟悉,可是无论怎样,核心出现问题的时候,不能彻底掌握其 代码是很是可怕的
五,合理选择数据存储方式:reasonable data storage
咱们必定要使用数据库吗,不必定,雷鸣告诉咱们搜索不必定须要数据库,云风告诉咱们,游戏不必定须要数据库,那么何时咱们才须要数据库呢,为何不干脆用文件来代替他呢?
首先咱们须要先认可,数据库也是对文件进行操做。咱们须要数据库,主要是使用下面这几个功能,一个是数据存储,一个是数据检索,在关系数据库中,咱们其实很是在意数据库的复杂搜索的能力,看看一个统计用的tsql就知道了(不用仔细读,扫一眼就能够了)
select c.Class_name,d.Class_name_2,a.Creativity_Title,b.User_name,(select count(Id) from review where Reviewid=a.Id) as countNum from Creativity as a,User_info as b,class as c,class2 as d where a.user_id=b.id and a.Creativity_Class=c.Id and a.Creativity_Class_2=d.Id
select a.Id,max(c.Class_name),(max(d.Class_name_2),max(a.Creativity_Title),max(b.User_name),count(e.Id) as countNum from Creativity as a,User_info as b,class as c,class2 as d,review as e where a.user_id=b.id and a.Creativity_Class=c.Id and a.Creativity_Class_2=d.Id and a.Id=e.Reviewid group by a.Id ..............................................
咱们能够看出须要数据库关联,排序的能力,这个能力在某些状况下很是重要,可是若是你的网站的常规操做,全是这样复杂的逻辑,那效率必定 是很是低的,因此咱们经常在数据库里加入许多冗余字段,来减少简单查询时关联等操做带来的压力,咱们看看下面这张图,能够看到数据库的设计重心,和网站 (指内容型社区)须要面对的问题实际是有一些误差的
一样其余一些软件产品也遇到一样的问题因此具我了解,有许多特殊的运用都有本身设计的特殊数据存储结构与方法,好比有的大型服务程序采起树形数据存储结构,lucene使用文件来存储索引和文件。
从另一个角度上看,使用数据库,意味着数据和表现是彻底分离的(这固然是经典的设计思路),也就是说当须要展现数据时,不得不须要一个转 换的过程,也能够说是绑定的过程,当网站具有必定规模的时候,数据库每每成为效率的瓶颈,因此许多网站也采用直接书写静态文件的方法来避免读取操做时的绑 定
这并非说咱们从今天起就能够把咱们亲爱的数据库打入冷宫,而是咱们在设计数据的持久化时,须要根据实际状况来选择存储方式,而数据库不过是其中一个选项
六,搞清楚谁是最重要的人:who's the most important guy
在用例需求分析的时候经常讲到涉众,就是和你的设计息息相关的人,在web中咱们必定觉得最重要的涉众莫过于用户了。,在一个传统 的互动社区开发中,最重要的东西是内容,用户产生内容,因此用户就是上帝,至于内容挑选工具,不就是给坐我后面三排的妹妹们用的吗?凑或行了,实在有问题 我就在数据里手动帮你加得了。。这大概是眼下许多小型甚至中型网站技术人员的广泛想法。钱宏武在他的讲座里谈到了这个问题:实际上网站天天产生的内容很是 的多,普通人是不可能看完的,而编辑负责把精华的内容推荐到首页上,因此不少用户读到的内容其实都依赖于编辑的推荐,因此设计让编辑工做方便的工具也是非 常重要,有时甚至是最重要的。
七,不要执着于文档:don't be crazy about document
web开发的文档重要吗?什么文档最重要?个人见解是web开发中交流>文档,
如今大的软件公司比较流行的作法是:
注重产品设计文档,在这种方法里,产品文档很是详尽,而且没有歧义,开发人员基于设计文档开发,测试人员基于设计文档制定测试方案,任何新人均可以经过阅读产品设计文档来了解项目的概况。
而web项目从概念到实现的时间是很是短的,并且越短越好,而且因为变化迅速,要想写出完整的产品和需求文档是几乎不可能的,大多数状况是 等你写出完备的文档,项目早就是另一个样子,可是没有文档的问题是,若是团队发生变化,添加新成员怎样才能了解软件的结构和概念呢,一种是每一个人都了解 软件的整个结构,除非你的团队总体消失,不然任何一我的都可以担当培养新人的责任,这种face2face交流比文档有效率不少。
因而就有了前office开发者,现任yahoo中国某产品开发负责人的刘振飞所感受到的落差,他说,咱们的项目是吵出来的,我听完会心一笑
八,团队:team
不要专家团队,而要外科手术式的团队,你的团队里必定要有清道夫,须要有弓箭手,让他们和项目一块儿成长,才是项目负责人的最大成就
总结:
0)架构是一种权衡
1)web开发的特色是是:没有太复杂的技术难点,一切在于迅速的把握需求,其实这正式敏捷开发的要旨所在,一切均可以很是快速的创建,很是快速的重构,咱们的开发工具,底层库和框架,包括搜索引擎和web文档提供的帮助,都提咱们供给了敏捷的能力。
2)此外,相应的,最有效率的交流方式必须留给web开发,那就是face2face(面对面),不要太担忧你的设计不能被完备的文档所保留下来,他们会以交流,代码和小卡片的方式保存下来。
3)人的因素会更加剧要,不管是对用户的需求,仍是开发人员的素质。
另:有关web效率,有著名的14条规则,由yahoo性能效率小组所总结,并广为流传。业已出现相关插件(YSlow),针对具体网页按彼规则评分,此次该小组负责人Tenni Theurer也受邀来到这次大会,我把Tenni×××(以前真的没有想到她是个女孩,而且如此年轻)和她的团队的14 rules列在下面。
Make Fewer HTTP Requests
Use a Content Delivery Network
Add an Expires Header
Gzip Components
Put CSS at the Top
Move Scripts to the Bottom
Avoid CSS Expressions
Make JavaScript and CSS External
Reduce DNS Lookups
Minify JavaScript
Avoid Redirects
Remove Duplicate Scripts
Configure ETags
Make Ajax Cacheable
经过安装firebug和YSlow这两个firefox插件(请注意要先安装firebug再安装yslow,下载后拖动到firefox里便可)咱们能够看到你的网页根据下面的规则的评分,这是我在博客园博客首页的评分截图,上面D表示总分,下面是单项评分,A最好F最差,不知道还有没有G
相关链接
yahoo性能团队:http://developer.yahoo.com/performance/
相关文章
相关标签/搜索