本人作為一位web工程師,著眼最多之處莫過(guò)于 性能與架構(gòu),本次幸得參與sd2.0大會(huì),得以與同行廣泛交流,于此二方面,有些心得,不敢獨(dú)享,與眾博友分享,本文是這次參會(huì)與眾同撩交流的心得,有興趣者可以查看視頻
架構(gòu)設(shè)計(jì)的幾個(gè)心得:
一,不要過(guò)設(shè)計(jì):never over design
這是一個(gè)常常被提及的話題,但是只要想想你的架構(gòu)里有多少功能是根本沒有用到,或者最后廢棄的,就能明白其重要性了,初涉架構(gòu)設(shè)計(jì),往往傾向于設(shè)計(jì)大而化一的架構(gòu),希望設(shè)計(jì)出具有無(wú)比擴(kuò)展性,能適應(yīng)一切需求的增加架構(gòu),web開發(fā)領(lǐng)域是個(gè)非常動(dòng)態(tài)的過(guò)程,我們很難預(yù)測(cè)下個(gè)星期的變化,而又需要對(duì)變化做出最快最有效的響應(yīng)。。
ebay的工程師說(shuō)過(guò),他們的架構(gòu)設(shè)計(jì)從來(lái)都不能滿足系統(tǒng)的增長(zhǎng),所以他們的系統(tǒng)永遠(yuǎn)都在推翻重做。請(qǐng)注意,不是ebay架構(gòu)師的能力有問題,他們?cè)O(shè)計(jì)的架構(gòu)總是建立舊版本的瓶頸上,希望通過(guò)新的架構(gòu)帶來(lái)突破,然而新架構(gòu)帶來(lái)的突破總是在很短的時(shí)間內(nèi)就被新增需求淹沒,于是他們不得不又使用新的架構(gòu)
web開發(fā),是個(gè)非常敏捷的過(guò)程,變化隨時(shí)都在產(chǎn)生,用戶需求千變?nèi)f化,許多方面偶然性非常高,較之軟件開發(fā),希望用一個(gè)架構(gòu)規(guī)劃以后的所有設(shè)計(jì),是不現(xiàn)實(shí)的
二,web架構(gòu)生命周期:web architecture‘s life cycle
既然要杜絕過(guò)設(shè)計(jì),又要保證一定的前瞻性,那么怎么才能找到其中的平衡呢?希望下面的web架構(gòu)生命周期能夠幫到你
設(shè)計(jì)的架構(gòu)需要在1-10倍的增長(zhǎng)下,通過(guò)簡(jiǎn)單的增加硬件容量就能夠勝任,而在5-10倍的增長(zhǎng)期間,請(qǐng)著手下一個(gè)版本的架構(gòu)設(shè)計(jì),使之能承受下一個(gè)10倍間的增長(zhǎng)
google之所以能夠稱霸,不完全是因?yàn)樗阉骷夹g(shù)和排序技術(shù)有多先進(jìn),其實(shí)包括baidu和yahoo,所使用的技術(shù)現(xiàn)在也已經(jīng)大同小異,然而,google能在一個(gè)月內(nèi)通過(guò)增加上萬(wàn)臺(tái)服務(wù)器來(lái)達(dá)到足夠系統(tǒng)容量的能力確是很難被復(fù)制的
三,緩存:Cache
空間換取時(shí)間,緩存永遠(yuǎn)計(jì)算機(jī)設(shè)計(jì)的重中之重,從cpu到io,到處都可以看到緩存的身影,web架構(gòu)設(shè)計(jì)重,緩存設(shè)計(jì)必不可少,關(guān)于怎樣設(shè)計(jì)合理的緩存,jbosscache的創(chuàng)始人,淘寶的創(chuàng)始人是這樣說(shuō)的:其實(shí)設(shè)計(jì)web緩存和企業(yè)級(jí)緩存是非常不同的,企業(yè)級(jí)緩存偏重于邏輯,而web緩存,簡(jiǎn)單快速為好。。
緩存帶來(lái)的問題是什么?是程序的復(fù)雜度上升,因?yàn)閿?shù)據(jù)散布在多個(gè)進(jìn)程,所以同步就是一個(gè)麻煩的問題,加上集群,復(fù)雜度會(huì)進(jìn)一步提高,在實(shí)際運(yùn)用中,采用怎樣的同步策略常常需要和業(yè)務(wù)綁定
老錢為搜狐設(shè)計(jì)的帖子設(shè)計(jì)了鏈表緩存,這樣既可以滿足靈活插入的需要,又能夠快速閱讀,而其他一些大型社區(qū)也經(jīng)常采用類此的結(jié)構(gòu)來(lái)優(yōu)化帖子列表,memcache也是一個(gè)常常用到的工具
錢宏武談架構(gòu)設(shè)計(jì)視頻 http://211.100.26.82/CSDN_Live/140/qhw.flv
Cache的常用的策略是:讓數(shù)據(jù)在內(nèi)存中,而不是在比較耗時(shí)的磁盤上。從這個(gè)角度講,mysql提供的heap引擎(存儲(chǔ)方式)也是一個(gè)值得思考的方法,這種存儲(chǔ)方法可以把數(shù)據(jù)存儲(chǔ)在內(nèi)存中,并且保留sql強(qiáng)大的查詢能力,是不是一舉兩得呢?
我們這里只說(shuō)到了讀緩存,其實(shí)還有一種寫緩存,在以內(nèi)容為主的社區(qū)里比較少用到,因?yàn)檫@樣的社區(qū)最主要需要解決的問題是讀問題,但是在處理能力低于請(qǐng)求能力時(shí),或者單個(gè)希望請(qǐng)求先被緩存形成塊,然后批量處理時(shí),寫緩存就出現(xiàn)了,在交互性很強(qiáng)的社區(qū)設(shè)計(jì)里我們很容易找到這樣的緩存
四,核心模塊一定要自己開發(fā):DIY your core module
這點(diǎn)我們是深有體會(huì),錢宏武和云風(fēng)也都有談到,我們經(jīng)常傾向于使用一些開源模塊,如果不涉及核心模塊,確實(shí)是可以的,如果涉及,那么就要小心了,因?yàn)楫?dāng)訪問量達(dá)到一定的程度,這些模塊往往都有這樣那樣的問題,當(dāng)然我們可以把問題歸結(jié)為對(duì)開源的模塊不熟悉,但是不管怎樣,核心出現(xiàn)問題的時(shí)候,不能完全掌握其代碼是非常可怕的
五,合理選擇數(shù)據(jù)存儲(chǔ)方式:reasonable data storage
我們一定要使用數(shù)據(jù)庫(kù)嗎,不一定,雷鳴告訴我們搜索不一定需要數(shù)據(jù)庫(kù),云風(fēng)告訴我們,游戲不一定需要數(shù)據(jù)庫(kù),那么什么時(shí)候我們才需要數(shù)據(jù)庫(kù)呢,為什么不干脆用文件來(lái)代替他呢?
首先我們需要先承認(rèn),數(shù)據(jù)庫(kù)也是對(duì)文件進(jìn)行操作。我們需要數(shù)據(jù)庫(kù),主要是使用下面這幾個(gè)功能,一個(gè)是數(shù)據(jù)存儲(chǔ),一個(gè)是數(shù)據(jù)檢索,在關(guān)系數(shù)據(jù)庫(kù)中,我們其實(shí)非常在乎數(shù)據(jù)庫(kù)的復(fù)雜搜索的能力,看看一個(gè)統(tǒng)計(jì)用的tsql就知道了(不用仔細(xì)讀,掃一眼就可以了)
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 ..............................................
我們可以看出需要數(shù)據(jù)庫(kù)關(guān)聯(lián),排序的能力,這個(gè)能力在某些情況下非常重要,但是如果你的網(wǎng)站的常規(guī)操作,全是這樣復(fù)雜的邏輯,那效率一定是非常低的,所以我們常常在數(shù)據(jù)庫(kù)里加入許多冗余字段,來(lái)減小簡(jiǎn)單查詢時(shí)關(guān)聯(lián)等操作帶來(lái)的壓力,我們看看下面這張圖,可以看到數(shù)據(jù)庫(kù)的設(shè)計(jì)重心,和網(wǎng)站(指內(nèi)容型社區(qū))需要面對(duì)的問題實(shí)際是有一些偏差的
同樣其他一些軟件產(chǎn)品也遇到同樣的問題所以具我了解,有許多特殊的運(yùn)用都有自己設(shè)計(jì)的特殊數(shù)據(jù)存儲(chǔ)結(jié)構(gòu)與方法,比如有的大型服務(wù)程序采取樹形數(shù)據(jù)存儲(chǔ)結(jié)構(gòu),lucene使用文件來(lái)存儲(chǔ)索引和文件
從另外一個(gè)角度上看,使用數(shù)據(jù)庫(kù),意味著數(shù)據(jù)和表現(xiàn)是完全分離的(這當(dāng)然是經(jīng)典的設(shè)計(jì)思路),也就是說(shuō)當(dāng)需要展示數(shù)據(jù)時(shí),不得不需要一個(gè)轉(zhuǎn)換的過(guò)程,也可以說(shuō)是綁定的過(guò)程,當(dāng)網(wǎng)站具備一定規(guī)模的時(shí)候,數(shù)據(jù)庫(kù)往往成為效率的瓶頸,所以許多網(wǎng)站也采用直接書寫靜態(tài)文件的方法來(lái)避免讀取操作時(shí)的綁定
這并不是說(shuō)我們從今天起就可以把我們親愛的數(shù)據(jù)庫(kù)打入冷宮,而是我們?cè)谠O(shè)計(jì)數(shù)據(jù)的持久化時(shí),需要根據(jù)實(shí)際情況來(lái)選擇存儲(chǔ)方式,而數(shù)據(jù)庫(kù)不過(guò)是其中一個(gè)選項(xiàng)
六,搞清楚誰(shuí)是最重要的人:who's the most important guy
在用例需求分析的時(shí)候常常講到涉眾,就是和你的設(shè)計(jì)息息相關(guān)的人,在web中我們一定以為最重要的涉眾莫過(guò)于用戶了。,在一個(gè)傳統(tǒng)的互動(dòng)社區(qū)開發(fā)中,最重要的東西是內(nèi)容,用戶產(chǎn)生內(nèi)容,所以用戶就是上帝,至于內(nèi)容挑選工具,不就是給坐我后面三排的妹妹們用的嗎?湊或行了,實(shí)在有問題我就在數(shù)據(jù)里手動(dòng)幫你加得了。。這大概是眼下許多小型甚至中型網(wǎng)站技術(shù)人員的普遍想法。錢宏武在他的講座里談到了這個(gè)問題:實(shí)際上網(wǎng)站每天產(chǎn)生的內(nèi)容非常的多,普通人是不可能看完的,而編輯負(fù)責(zé)把精華的內(nèi)容推薦到首頁(yè)上,所以很多用戶讀到的內(nèi)容其實(shí)都依賴于編輯的推薦,所以設(shè)計(jì)讓編輯工作方便的工具也是非常重要,有時(shí)甚至是最重要的。
七,不要執(zhí)著于文檔:don't be crazy about document
web開發(fā)的文檔重要嗎?什么文檔最重要?我的看法是web開發(fā)中交流>文檔,
現(xiàn)在大的軟件公司比較流行的做法是:
注重產(chǎn)品設(shè)計(jì)文檔,在這種方法里,產(chǎn)品文檔非常詳盡,并且沒有歧義,開發(fā)人員基于設(shè)計(jì)文檔開發(fā),測(cè)試人員基于設(shè)計(jì)文檔制定測(cè)試方案,任何新人都可以通過(guò)閱讀產(chǎn)品設(shè)計(jì)文檔來(lái)了解項(xiàng)目的概況
而web項(xiàng)目從概念到實(shí)現(xiàn)的時(shí)間是非常短的,而且越短越好,并且由于變化迅速,要想寫出完整的產(chǎn)品和需求文檔是幾乎不可能的,大多數(shù)情況是等你寫出完備的文檔,項(xiàng)目早就是另外一個(gè)樣子,但是沒有文檔的問題是,如果團(tuán)隊(duì)發(fā)生變化,添加新成員怎樣才能了解軟件的結(jié)構(gòu)和概念呢,一種是每個(gè)人都了解軟件的整個(gè)結(jié)構(gòu),除非你的團(tuán)隊(duì)整體消失,否則任何一個(gè)人都能夠擔(dān)當(dāng)培養(yǎng)新人的責(zé)任,這種face2face交流比文檔有效率很多。
于是就有了前office開發(fā)者,現(xiàn)任yahoo中國(guó)某產(chǎn)品開發(fā)負(fù)責(zé)人的劉振飛所感覺到的落差,他說(shuō),我們的項(xiàng)目是吵出來(lái)的,我聽完會(huì)心一笑
八,團(tuán)隊(duì):team
不要專家團(tuán)隊(duì),而要外科手術(shù)式的團(tuán)隊(duì),你的團(tuán)隊(duì)里一定要有清道夫,需要有弓箭手,讓他們和項(xiàng)目一起成長(zhǎng),才是項(xiàng)目負(fù)責(zé)人的最大成就
總結(jié):
0)架構(gòu)是一種權(quán)衡
1)web開發(fā)的特點(diǎn)是是:沒有太復(fù)雜的技術(shù)難點(diǎn),一切在于迅速的把握需求,其實(shí)這正式敏捷開發(fā)的要旨所在,一切都可以非常快速的建立,非常快速的重構(gòu),我們的開發(fā)工具,底層庫(kù)和框架,包括搜索引擎和web文檔提供的幫助,都提我們供給了敏捷的能力。
2)此外,相應(yīng)的,最有效率的交流方式必須留給web開發(fā),那就是face2face(面對(duì)面),不要太擔(dān)心你的設(shè)計(jì)不能被完備的文檔所保留下來(lái),他們會(huì)以交流,代碼和小卡片的方式保存下來(lái)
3)人的因素會(huì)更加重要,無(wú)論是對(duì)用戶的需求,還是開發(fā)人員的素質(zhì)。
另:有關(guān)web效率,有著名的14條規(guī)則,由yahoo性能效率小組所總結(jié),并廣為流傳。業(yè)已出現(xiàn)相關(guān)插件(YSlow),針對(duì)具體網(wǎng)頁(yè)按彼規(guī)則評(píng)分,這次該小組負(fù)責(zé)人Tenni Theurer也受邀來(lái)到此次大會(huì),我把Tenni小姐(之前真的沒有想到她是個(gè)女孩,并且如此年輕)和她的團(tuán)隊(duì)的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
通過(guò)安裝firebug和YSlow這兩個(gè)firefox插件(請(qǐng)注意要先安裝firebug再安裝yslow,下載后拖動(dòng)到firefox里即可)我們可以看到你的網(wǎng)頁(yè)根據(jù)下面的規(guī)則的評(píng)分,這是我在博客園博客首頁(yè)的評(píng)分截圖,上面D表示總分,下面是單項(xiàng)評(píng)分,A最好F最差,不知道還有沒有G :)
文章來(lái)源: http://blog.csdn.net/yizhu2000/archive/2007/12/04/1915554.aspx
相關(guān)連接
yahoo性能團(tuán)隊(duì):http://developer.yahoo.com/performance/
程序開發(fā)是一方面,系統(tǒng)架構(gòu)設(shè)計(jì)(硬件+網(wǎng)絡(luò)+軟件)是另一方面。
中國(guó)的網(wǎng)絡(luò)分南北電信和網(wǎng)通,訪問的ip就要區(qū)分南北進(jìn)入不同的網(wǎng)絡(luò);
然后是集群,包括應(yīng)用服務(wù)器集群和web服務(wù)器集群,應(yīng)用服務(wù)器集群可以采用apache+tomcat集群和weblogic集群等,web服務(wù)器集群可以用反向代理,也可以用NAT的方式,或者多域名解析都可以;
軟件架構(gòu)方面,做網(wǎng)站首先需要很多web服務(wù)器存儲(chǔ)靜態(tài)資源,比如圖片、視頻、靜態(tài)頁(yè)等,千萬(wàn)不要把靜態(tài)資源和應(yīng)用服務(wù)器放在一起;
頁(yè)面數(shù)據(jù)調(diào)用更要認(rèn)真設(shè)計(jì),一些數(shù)據(jù)查詢可以不通過(guò)數(shù)據(jù)庫(kù)的方式,實(shí)時(shí)性要求不高的可以使用lucene來(lái)實(shí)現(xiàn),即使有實(shí)時(shí)性的要求也可以用lucene,lucene+compass還是非常優(yōu)秀的;
不能用lucene實(shí)現(xiàn)的可以用緩存,分布式緩存可以用memcached,如果有錢的話用10來(lái)臺(tái)機(jī)器做緩存,>10G的存儲(chǔ)量相信存什么都?jí)蛄耍蝗绻麤]錢的話可以在頁(yè)面緩存和數(shù)據(jù)緩存上下功夫,多用OSCACHE和EHCACHE,SWARMCACHE也可以,不過(guò)據(jù)說(shuō)同步性不是很好;
然后很重要的一點(diǎn)就是數(shù)據(jù)庫(kù),大型網(wǎng)站要用oracle,數(shù)據(jù)方面操作盡量多用存儲(chǔ)過(guò)程,絕對(duì)提升性能;同時(shí)要讓DBA對(duì)數(shù)據(jù)庫(kù)進(jìn)行優(yōu)化,優(yōu)化后的數(shù)據(jù)庫(kù)與沒優(yōu)化的有天壤之別;同時(shí)還可以擴(kuò)展分布式數(shù)據(jù)庫(kù),以后這方面的研究會(huì)越來(lái)越多;
新聞?lì)惖木W(wǎng)站可以用靜態(tài)頁(yè)存儲(chǔ),采用定時(shí)更新機(jī)制減輕服務(wù)器負(fù)擔(dān);首頁(yè)每個(gè)小模塊可以使用oscache緩存,這樣不用每次都拉數(shù)據(jù);
最后是寫程序了,一個(gè)好的程序員寫出來(lái)的程序會(huì)非常簡(jiǎn)潔、性能很好,一個(gè)初級(jí)程序員可能會(huì)犯很多低級(jí)錯(cuò)誤,這也是影響網(wǎng)站性能的原因之一。
本博客為學(xué)習(xí)交流用,凡未注明引用的均為本人作品,轉(zhuǎn)載請(qǐng)注明出處,如有版權(quán)問題請(qǐng)及時(shí)通知。由于博客時(shí)間倉(cāng)促,錯(cuò)誤之處敬請(qǐng)諒解,有任何意見可給我留言,愿共同學(xué)習(xí)進(jìn)步。