`
longgangbai
  • 浏览: 7355633 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论
阅读更多

本人作为一位web工程师,着眼最多之处莫过于性能与架构,本次幸得参与sd2.0大会,得以与同行广泛交流,于此二方面,有些架构设计的心得,不敢独享,与众友分享,本文是这次参会与众同撩交流的心得.

架构设计的几个心得:


一,不要过设计:never over design

这是一个常常被提及的话题,但是只要想想你的架构里有多少功能是根本没有用到,或者最后废弃的,就能明白其重要性了,初涉架构设计,往往倾向于设计大而化一的架构,希望设计出具有无比扩展性,能适应一切需求的增加架构,web开发领域是个非常动态的过程,我们很难预测下个星期的变化,而又需要对变化做出最快最有效的响应。。

ebay的工程师说过,他们的架构设计从来都不能满足系统的增长,所以他们的系统永远都在推翻重做。请注意,不是ebay架构师的能力有问题,他们设计的架构总是建立旧版本的瓶颈上,希望通过新的架构带来突破,然而新架构带来的突破总是在很短的时间内就被新增需求淹没,于是他们不得不又使用新的架构
web开发,是个非常敏捷的过程,变化随时都在产生,用户需求千变万化,许多方面偶然性非常高,较之软件开发,希望用一个架构规划以后的所有设计,是不现实的

二,web架构生命周期:web architecture‘s life cycle


既然要杜绝过设计,又要保证一定的前瞻性,那么怎么才能找到其中的平衡呢?希望下面的web架构生命周期能够帮到你

architecture_life_cycle

所设计的架构需要在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 ..............................................

我们可以看出需要数据库关联,排序的能力,这个能力在某些情况下非常重要,但是如果你的网站的常规操作,全是这样复杂的逻辑,那效率一定是非常低的,所以我们常常在数据库里加入许多冗余字段,来减小简单查询时关联等操作带来的压力,我们看看下面这张图,可以看到数据库的设计重心,和网站(指内容型社区)需要面对的问题实际是有一些偏差的

database

同样其他一些软件产品也遇到同样的问题所以具我了解,有许多特殊的运用都有自己设计的特殊数据存储结构与方法,比如有的大型服务程序采取树形数据存储结构,lucene使用文件来存储索引和文件

从另外一个角度上看,使用数据库,意味着数据和表现是完全分离的(这当然是经典的设计思路),也就是说当需要展示数据时,不得不需要一个转换的过程,也可以说是绑定的过程,当网站具备一定规模的时候,数据库往往成为效率的瓶颈,所以许多网站也采用直接书写静态文件的方法来避免读取操作时的绑定

这并不是说我们从今天起就可以把我们亲爱的数据库打入冷宫,而是我们在设计数据的持久化时,需要根据实际情况来选择存储方式,而数据库不过是其中一个选项


六,搞清楚谁是最重要的人:who's the most important guy


在用例需求分析的时候常常讲到涉众,就是和你的设计息息相关的人,在web中我们一定以为最重要的涉众莫过于用户了。,在一个传统的互动社区开发中,最重要的东西是内容,用户产生内容,所以用户就是上帝,至于内容挑选工具,不就是给坐我后面三排的妹妹们用的吗?凑或行了,实在有问题我就在数据里手动帮你加得了。。这大概是眼下许多小型甚至中型网站技术人员的普遍想法。钱宏武在他的讲座里谈到了这个问题:实际上网站每天产生的内容非常的多,普通人是不可能看完的,而编辑负责把精华的内容推荐到首页上,所以很多用户读到的内容其实都依赖于编辑的推荐,所以设计让编辑工作方便的工具也是非常重要,有时甚至是最重要的。


七,不要执着于文档:don't be crazy about document


web开发的文档重要吗?什么文档最重要?我的看法是web开发中交流>文档,

现在大的软件公司比较流行的做法是:
注重产品设计文档,在这种方法里,产品文档非常详尽,并且没有歧义,开发人员基于设计文档开发,测试人员基于设计文档制定测试方案,任何新人都可以通过阅读产品设计文档来了解项目的概况

而web项目从概念到实现的时间是非常短的,而且越短越好,并且由于变化迅速,要想写出完整的产品和需求文档是几乎不可能的,大多数情况是等你写出完备的文档,项目早就是另外一个样子,但是没有文档的问题是,如果团队发生变化,添加新成员怎样才能了解软件的结构和概念呢,一种是每个人都了解软件的整个结构,除非你的团队整体消失,否则任何一个人都能够担当培养新人的责任,这种face2face交流比文档有效率很多。

于是就有了前office开发者,现任yahoo中国某产品开发负责人的刘振飞所感觉到的落差,他说,我们的项目是吵出来的,我听完会心一笑


八,团队:team


不要专家团队,而要外科手术式的团队,你的团队里一定要有清道夫,需要有弓箭手,让他们和项目一起成长,才是项目负责人的最大成就

 

总结:

架构是一种权衡

architecture

web开发的特点是是:没有太复杂的技术难点,一切在于迅速的把握需求,其实这正式敏捷开发的要旨所在,一切都可以非常快速的建立,非常快速的重构,我们的开发工具,底层库和框架,包括搜索引擎和web文档提供的帮助,都提我们供给了敏捷的能力。

此外,相应的,最有效率的交流方式必须留给web开发,那就是face2face(面对面),不要太担心你的设计不能被完备的文档所保留下来,他们会以交流,代码和小卡片的方式保存下来

人的因素会更加重要,无论是对用户的需求,还是开发人员的素质。

分享到:
评论

相关推荐

    web架构设计经验分享

    "web架构设计经验分享" 本文将分享web架构设计的经验,总结了五个重要的心得,分别是不要过度设计、web架构生命周期、缓存、核心模块一定要自己开发、合理选择数据存储方式。 首先,不要过度设计是web架构设计的...

    web架构设计经验分享.pdf

    【标题】:“Web架构设计经验分享” 【描述】:本文主要是一位Web工程师在参与某大会后,关于Web架构设计的一些心得体会,重点强调了避免过度设计、理解Web架构生命周期、缓存设计、核心模块自主开发以及合理选择...

    web架构设计经验分享.docx

    在进行Web架构设计时,有几个重要的经验和原则是值得我们深入理解和实践的。首先,我们要避免“过设计”(Never over design)。很多初涉架构设计的工程师往往试图构建一个能够应对所有未来需求的庞大架构,但Web...

    WEB架构设计经验分享

    本人作为一位web工程师,着眼最多之处莫过于性能与架构,本次幸得参与sd2.0大会,得以与同行广泛交流,于此二方面,有些心得,不敢独享,与众博友分享,本文是这次参会与众同撩交流的心得,有兴趣者可以查看视频架构...

    Web前端全栈工程师2023视频课程-视频教程网盘链接提取码下载.txt

    该视频课程旨在为学习者提供全面的Web前端与全栈...学员将深入学习HTML、CSS、JavaScript、React、Node.js等内容,并通过实际项目实战经验,掌握现代Web开发所需的关键技能,助力他们成为全栈工程师。 视频大小:26.1G

    2012 Web_架构师大会资料汇总

    2012年9月13号系统架构师大会的精彩演讲PPT 演讲主题汇总。 站在成功者的角度看问题,学习成功者的实践思想,让我们少走点弯路,可以结合自己平时的工作把经验...于江:运维工程师职业发展路线经验分享-正式1.1.pdf

    IHS+WAS6ND实现多应用服务器集群+多web端口服务器架构配置经验

    本经验分享主要探讨如何使用IBM HTTP Server (IHS) 和 WebSphere Application Server Network Deployment (WAS6ND) 创建一个多应用服务器集群,同时支持多个Web端口的服务器架构。在特定情况下,这种架构能够应对...

    facebook架构设计中文.pdf

    ### Facebook架构设计:数据为核心,平台为桥梁 #### 引言 在当今互联网时代,数据已成为企业竞争力的关键因素。Facebook,作为全球领先的社交网络平台,其成功在很大程度上归因于其精妙的数据架构设计。本书第六...

    WEB设计版精华荟萃

    【标题】"WEB设计版精华荟萃"是一个涵盖了WEB设计领域的综合资源集合,可能是...这个资源包对初学者和经验丰富的WEB设计师来说都是宝贵的,通过学习和实践其中的内容,可以提升设计技能,紧跟WEB设计的最新趋势和技术。

    架构之美(精选版)电子书

    - **专家观点集成**:汇集了多位行业专家的观点和经验分享,为读者提供了宝贵的参考价值。 通过以上知识点的梳理,我们可以看出《架构之美(精选版)》不仅是一本介绍软件架构基础知识的书籍,更是一部集成了实践...

    Tumblr 架构设计

    #### 四、核心工程师视角:布莱克·马西尼的经验分享 布莱克·马西尼(Blake Matheny),作为一位有着丰富经验的分布式系统工程师,在Tumblr的转型过程中扮演了重要角色。他分享了Tumblr如何在海量规模下实现架构...

    web前端.pdf 笔记

    6. **前端实战经验分享**:文档中还包含了丰富的实战经验分享,如作者自身如何从初级前端工程师成长到高级职位,以及带领不同规模前端团队的经验。这部分内容有助于新入行的开发者快速理解行业现状,找准自己的发展...

    高级web前端开发工程师的主要职责模板(合集).docx

    高级Web前端开发工程师是互联网行业中不可或缺的角色,他们主要负责创建和优化Web应用程序的用户界面,以提供高效、响应迅速和高度交互的用户体验。以下是对高级Web前端开发工程师主要职责和要求的详细说明: 1. **...

    网页设计师必看:14个必备Web前端开发速查手册

    - 职业晋升与转型经验分享 14. **未来趋势预测** - WebAssembly技术介绍 - 5G网络下Web应用新机遇 - AI在前端领域的应用探索 #### 详细解读 **1. HTML基础知识** - **HTML结构与语义化标签**:介绍如何使用`...

    Ext.NET Web Application Development

    Ext.NET是一款强大的用户界面库,它基于Microsoft .NET框架,并且兼容ASP.NET Web Forms和ASP.NET MVC架构。本书《Ext.NET Web Application Development》由Anup Shah撰写,由Packt Publishing出版,首次出版于2012...

    架构师之路不读系列

    - **核心内容**:本书详细阐述了分布式服务框架的设计原则和原理,包括服务化架构演进、订阅发布、路由策略、集群容错和服务治理等主题,并结合实际案例分享了作者在分布式服务框架设计和运维方面的经验。...

    Web Operations: Keeping the Data On Time

    本书汇集了一系列的文章与访谈,邀请了包括Theo Schlossnagle、Baron Schwartz和Alistair Croll在内的多位业界资深人士分享他们在网站运维领域的经验教训。通过这些第一手资料,读者可以深入了解网站运维的重要性...

Global site tag (gtag.js) - Google Analytics