平臺網(wǎng)站架構(gòu)設(shè)計(jì)的經(jīng)驗(yàn)之談

2022-03-22    分類: 網(wǎng)站建設(shè)

從架構(gòu)設(shè)計(jì)師的角度來看,架構(gòu)就是一套構(gòu)建系統(tǒng)的準(zhǔn)則。通過這套準(zhǔn)則,我們可以把一個復(fù)雜的系統(tǒng)劃分為一套更簡單的子系統(tǒng)的集合,這些子系統(tǒng)之間應(yīng)該保持相互獨(dú)立,并與整個系統(tǒng)保持一致。而且每一個子系統(tǒng)還可以繼續(xù)細(xì)分下去,從而構(gòu)成一個復(fù)雜的企業(yè)級架構(gòu)。

一 選擇技術(shù)方案和物理架構(gòu)

如何選擇技術(shù)方案和物理架構(gòu),對很多剛接觸平臺網(wǎng)站研發(fā)的人來說這可能是個頭疼的問題。這些問題的源頭很簡單就是能否提高開發(fā)效率,使平臺具有高性能高負(fù)載性。就我遇到的常見的有這么幾個問題:

a) 開發(fā)語言和數(shù)據(jù)庫

一說到開發(fā)語言和數(shù)據(jù)庫,很多人便開始做語言的比較,最常見的爭論有:“asp.net和java哪個好”,“解釋性語言和編譯性語言哪個好”等。我個人覺的最關(guān)鍵是你和你的團(tuán)隊(duì)最擅長的開發(fā)語言和數(shù)據(jù)庫是哪個,古語有云:“工欲善其事,必先利其器!”,趁手的開發(fā)語言和數(shù)據(jù)庫有助于事半功倍。試想如果你選擇了一個并不很熟悉的語言,也許這個語言和數(shù)據(jù)庫在基礎(chǔ)性能上的確比你掌握的語言好,但是在研發(fā)過程中學(xué)習(xí)曲線肯定長。而且遇到問題的時候因?yàn)椴皇煜さ脑颍速M(fèi)更多的時間去尋找解決方法,而且找到的方法不一定是最好的,說不定還不如你自己用熟悉的語言解決來的快。

也許有朋友會說:“這幾種開發(fā)語言和數(shù)據(jù)庫我都熟悉”,那么就要看你對這幾種開發(fā)語言和數(shù)據(jù)庫的熟悉程度了,對各種開發(fā)語言和數(shù)據(jù)庫的特性了解的越深入,越有助于提高開發(fā)效率。而且目前主流的開發(fā)語言和數(shù)據(jù)庫都提供性能調(diào)優(yōu),只有深入了解了開發(fā)語言和數(shù)據(jù)庫的特性和原理,那么性能調(diào)優(yōu)就很容易。

個人覺的重要的就這兩點(diǎn),開發(fā)效率和性能。

b) 成熟框架還是自己實(shí)現(xiàn)

目前主流的開發(fā)語言的使用者中有很多前輩都提供了他們自己總結(jié)實(shí)現(xiàn)的框架,比如JAVA中的“S-S-H”組合,PYTHON的DJANGOO等。我個人的一些經(jīng)驗(yàn)是,盡量使用開源的成熟框架,因?yàn)槠脚_研發(fā)初期使用成熟的開源框架,能提高開發(fā)效率,并且在質(zhì)量上有保證。我曾經(jīng)接手過一個平臺的改版,框架是前面開發(fā)人員自己寫的,里面的一些設(shè)計(jì)思想不是很成熟,導(dǎo)致平臺在負(fù)載增高后性能很差,整改起來很麻煩,只能一點(diǎn)一點(diǎn)的分離出來,耗費(fèi)時間和經(jīng)歷。

有的朋友可能會問什么才是成熟的框架,個人總結(jié)的幾點(diǎn):

1 能提供使用指南,比如 COOKBOOK, USE GUIDE等。有這些提供,那么入門使用變的容易,也方便維護(hù),而且有助于深入了解其特性和原理。

2 有官方支持,比如官方討論社區(qū),郵件列表等,并且有BUG收集處理機(jī)制。有句話叫大樹底下好乘涼,有了官方支持,當(dāng)使用過程中遇到問題的時候,直接就可以通過查找前人的使用心得和問題來解決問題,遇到BUG的時候,提交上去,也能找到解決之法。

3 官方在不斷的更新發(fā)布穩(wěn)定版本。這一點(diǎn)很重要,官方如果及時幫你解決目前已知的或者未知的BUG,那么對使用者來講,就沒什么后顧之憂了,如果官方停止更新了,那么我建議還是早點(diǎn)換下家吧,因?yàn)槿绻@個框架好,那么肯定會越來越好,官方也會不斷的更新它。還有就是穩(wěn)定永遠(yuǎn)是第一位,可以在不影響生產(chǎn)環(huán)境的情況下進(jìn)行無縫升級更新。

4 身邊使用者很多,經(jīng)常能看到相關(guān)的討論或者總結(jié)。目前很多成熟框架都是國外開發(fā)者發(fā)布的,如果使用者E文不好也是個討厭的事情,那么如果身邊有很多同樣的使用者和很多討論,那么對于使用者來說是種福音,共同探討和學(xué)習(xí)。

那么除此之外最好是開源的框架,平臺初期訪問量不大,因此對性能的要求不高,成熟的框架的使用都不會出現(xiàn)什么問題。當(dāng)訪問量急劇增高之后,那么性能要求也變高,一些框架中隱藏的問題也因此出現(xiàn)。這時候如果是開源的框架,使用者可以深入了解它的源代碼,洞悉其實(shí)現(xiàn)機(jī)制,根據(jù)自己的實(shí)際情況進(jìn)行調(diào)優(yōu)。如果不是那么使用者也只能改變方向去解決問題,條條大路通羅馬。

c) web server/db server/cache server 相關(guān)

在架構(gòu)設(shè)計(jì)中web server/db server/cache server是很重要的一點(diǎn),我個人覺的這一塊必須是使用具有前瞻性,易配置,能監(jiān)控和維護(hù)的產(chǎn)品,總結(jié)的幾點(diǎn):

1 豐富和深入的配置選項(xiàng)。如果能提供豐富和深入的配置選項(xiàng),那么在安全和性能調(diào)整上可以很方便的進(jìn)行操作,并且不中斷實(shí)際的生產(chǎn)環(huán)境。

2 基于高并發(fā)模型。比如這幾年熱門的基于epoll的nginx,可以有效的減少連接處理時間,增大同時并發(fā)數(shù)。

3 支持負(fù)載均衡和請求分發(fā)。當(dāng)平臺的訪問量增高之后,單臺服務(wù)器肯定是很難支撐,這時候就需要增加服務(wù)器來分擔(dān)壓力,這時候server的負(fù)載均衡和請求分發(fā)就很重要了。

4 高效的緩存機(jī)制。高效的緩存機(jī)制可以幫助平臺提高負(fù)載能力,減少重復(fù)資源的讀取和處理時間。比如用于小文件緩存的SQUID,VARNISH,用于數(shù)據(jù)庫緩存的memcached等。

5 實(shí)時的狀態(tài)監(jiān)控機(jī)制。實(shí)時的監(jiān)控狀態(tài)報告,可以有助于平臺維護(hù)人員迅速了解平臺性能運(yùn)行狀況,根據(jù)狀況進(jìn)行調(diào)整。

如果是開源的那就更好了,可以深入了解其源代碼,并根據(jù)自己的實(shí)際需要進(jìn)行配置和定制。

d) 操作系統(tǒng)

選擇合適的操作系統(tǒng),個人覺的最主要是穩(wěn)定安全,易管理和維護(hù),易監(jiān)控。穩(wěn)定安全的操作系統(tǒng)一般官方會持續(xù)的發(fā)布補(bǔ)丁和新版本,解決BUG和漏洞等。并且官方或者第三方會不斷的提供新的管理維護(hù)監(jiān)控工具,并且能讓管理維護(hù)人員通過編寫腳本來維護(hù)管理。而且合適的操作系統(tǒng)能讓研發(fā)人員充分利用其特性,發(fā)揮平臺的大性能。

f) 物理架構(gòu)

這里的物理架構(gòu)是指服務(wù)器的搭建方式。有的朋友可能資源有限只有一臺服務(wù)器,有的朋友資源充分有十幾臺服務(wù)器或者更多,我個人覺的這都不是問題。平臺初期的話,我想大部分訪問量都不高,web server/db server/cache server放在一臺服務(wù)器上都沒問題。但是自己心里最好能預(yù)估一下這個平臺會發(fā)展到什么樣的規(guī)模,在做架構(gòu)設(shè)計(jì)的時候,按照事先預(yù)估的來決定怎么做物理架構(gòu),并為以后的架構(gòu)升級做準(zhǔn)備。說到這里,想到前百度架構(gòu)師雷鳴說過的一句話,當(dāng)你的會員數(shù)達(dá)到目前的5倍或10倍的時候,架構(gòu)就要升級。

二 平臺研發(fā)

前期做好了技術(shù)方案,就進(jìn)入到實(shí)質(zhì)研發(fā)過程中來了,個人感覺平臺網(wǎng)站的研發(fā)有別于傳統(tǒng)的IT項(xiàng)目研發(fā),因?yàn)橐郧熬褪强蛻?需求分析人員/美工之間進(jìn)行交涉,而現(xiàn)在平臺網(wǎng)站研發(fā)會多接觸一個角色叫產(chǎn)品,產(chǎn)品決定了最后的平臺網(wǎng)站是什么樣的,有什么功能,每個功能的流程和用例是什么樣子的,也就是原型設(shè)計(jì)。并且在研發(fā)人員實(shí)現(xiàn)之后,還要由測試人員進(jìn)行測試。

在上述過程中,產(chǎn)品會經(jīng)常要求研發(fā)人員:“某某功能是這樣的,你趕快給我實(shí)現(xiàn)并解決。這個功能不對,要改。那個功能出現(xiàn)問題,要改”,而研發(fā)人員可能正在忙著其他功能的實(shí)現(xiàn),于是很容易產(chǎn)生沖突。在此我推薦使用敏捷開發(fā)方式,設(shè)立短的發(fā)布周期進(jìn)行迭代開發(fā),產(chǎn)品提出來的問題統(tǒng)一在一個周期內(nèi)解決,到下一個周期一起發(fā)布,到下一個周期再進(jìn)行下一周期的功能改進(jìn)和BUG修正。并使用JIRA這種成熟的項(xiàng)目管理系統(tǒng)進(jìn)行管理,為以前的更改留下歷史,總結(jié)經(jīng)驗(yàn)。

那么在正常的研發(fā)過程中,特別是團(tuán)隊(duì)研發(fā),我個人覺的需要注意的幾點(diǎn):

1 合適的開發(fā)工具。還是那句話“工欲善其事,必先利其器!”,使用合適的開發(fā)工具和插件,能提高開發(fā)效率,節(jié)省開發(fā)成本。團(tuán)隊(duì)使用統(tǒng)一的開發(fā)工具,可以減少出錯的幾率,防止版本沖突等。

2 如何控制代碼質(zhì)量。因?yàn)閳F(tuán)隊(duì)里大家的水平有高有低,所以團(tuán)隊(duì)研發(fā)的時候,需要去建立固定的開發(fā)規(guī)范,比如:“命名規(guī)范”,“代碼包引用規(guī)范等”。當(dāng)某個人解決某個功能的時候,為了確保代碼質(zhì)量和減少出錯幾率,最好能畫出流程圖和配上設(shè)計(jì)意圖說明,來進(jìn)行討論確定,同時也可以幫助新人快速成長。

3 需要引入新框架。有時候,某個成員會覺的某某框架的新特性非常好用或者非常合適手頭的問題,那么就想引入這個新框架,我的建議,在充分了解的基礎(chǔ)上來決定,不能因?yàn)槟硞€特性而引入一堆用不到的特性,那樣會讓項(xiàng)目代碼顯的冗余。

4 知識總結(jié)和培訓(xùn)。當(dāng)某個成員遇到問題,并解決后或者學(xué)習(xí)到新東西的時候,不妨拿出來大家一起探討一下,說不定就有助于提高平臺的性能,為大家提供更好的設(shè)計(jì)思路。

三 架構(gòu)優(yōu)化

“過早優(yōu)化是萬惡之源”,所以關(guān)于架構(gòu)優(yōu)化,我放在研發(fā)完成并上線之后來講。個人覺的沒有百分百可用的架構(gòu),得看你實(shí)際的業(yè)務(wù)流程和運(yùn)行情況來進(jìn)行優(yōu)化。當(dāng)你運(yùn)行了一段時間后,收集到一定的數(shù)據(jù),找出性能的弱點(diǎn)后進(jìn)行針對性調(diào)整和優(yōu)化,當(dāng)平臺的負(fù)載強(qiáng)度達(dá)到一定程度,就得立即著手做架構(gòu)升級。

有的朋友會問,有時候網(wǎng)站就是莫名其妙的變慢,但是不知道從何下手怎么辦,或者憑經(jīng)驗(yàn)改改這個改改那個選項(xiàng),好了一點(diǎn)但好的不徹底。我的經(jīng)驗(yàn)是從數(shù)據(jù)開始,從最外圍開始畫圈,找到源頭。先從外圍開始收集日志,比如access_log訪問日志或sql_log數(shù)據(jù)庫操作日志,找出訪問最多的10條日志和執(zhí)行時間最長的10條日志,然后根據(jù)日志去反查到底是什么引起的操作,然后一條條的解決。如果解決不了,那么就考慮重構(gòu)。其他問題解決方式跟這個差不多,就不贅述了。從我自己已有的經(jīng)驗(yàn)來看,往往就是因?yàn)閹讉€功能點(diǎn)的惡化,引起了整體的性能變差。

所以在研發(fā)的時候,功能點(diǎn)的實(shí)現(xiàn)要好好考慮,前端部分,頁面,圖片等的大小和有效緩存,后端的局部數(shù)據(jù)和全局?jǐn)?shù)據(jù)的緩存高效利用,數(shù)據(jù)庫層SQL語句盡量避免跨表查詢,數(shù)據(jù)庫索引的利用等。

四 其他相關(guān)

存儲

當(dāng)平臺網(wǎng)站的訪問量不斷增長的同時,數(shù)據(jù)也會跟著不斷的增長,所以早期做好數(shù)據(jù)如何存儲的方案非常重要。

現(xiàn)在比較常見的是HASH URL,根據(jù)文件名的HASH來選擇存儲不同的目錄,比如20091014131213_abc.xxx 那么就存儲到 2009/10/14/a/20091014131213_abc.xxx這樣的目錄下,方便以后根據(jù)目錄來劃分服務(wù)器。

搜索

當(dāng)平臺網(wǎng)站的訪問量不斷增長的同時,數(shù)據(jù)搜索也變成了一個問題??隙ㄓ信笥褧f,直接數(shù)據(jù)庫模糊查詢有什么問題,你試想當(dāng)你的數(shù)據(jù)表里有幾百萬數(shù)據(jù)你用 select * from table where title like '%key%' 沒法用索引,那就是全表掃描,拿得花多少時間,一個人查詢還沒問題,那幾百個呢,那你的平臺不就歇菜了。還好現(xiàn)在已經(jīng)有了成熟方案Lucene,只要按照它提供的接口去實(shí)現(xiàn),你就可以使用。

本文名稱:平臺網(wǎng)站架構(gòu)設(shè)計(jì)的經(jīng)驗(yàn)之談
分享網(wǎng)址:http://www.bm7419.com/news2/144902.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站策劃、小程序開發(fā)、網(wǎng)站維護(hù)、響應(yīng)式網(wǎng)站、App設(shè)計(jì)、全網(wǎng)營銷推廣

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

成都app開發(fā)公司