談談網站架構設計開發的一些來龍去脈

威靈頓發表於2017-12-19

這篇就當成最近研究網站架構問題的一個小小的總結記錄,當然肯定不全面,這個領域很大的。後面如果有新的認知,繼續補充說明。但是核心的概念和基本原理搞明白就好辦,剩下的就是工具應用和開發細節問題了。不過,“細節出魔鬼”,可別以為架構師的活好做。

架構這個問題怎麼出現的?

當然是資訊社會從單機時代推進到網路時代的產物。單機時代,大家一般買臺PC,裝個Windows,自己搗鼓著玩。各種應用基本都是隔離的。如果你想傳輸資料,軟盤、燒錄光碟、拷貝硬碟…因為即便後來有了點網路應用,幾十K的網速你還能傳啥呢。所以那個時候,應用軟體、遊戲等等基本都是軟盤/光碟發行,網路還指望不上。

這個時代的軟體系統也很粗糙,哪裡談的上架構思想,單機能正常跑就不錯了,知足吧。後來有點進步,出現所謂“C/S”、“B/S”架構的應用模式,還處於原始階段。

架構思維和相關技術,是跟著網路時代的迅猛發展到來的。網速開始提升,大量的網民出現,海量的資訊開始上網,各種網路應用迅速發展,網遊、電商等等。最近10年,移動端風生水起,原本的桌面作業系統成了終端的一種,不再是主角。外部環境的變化和需求,催生了相關技術的發展。原本的單機應用,紛紛轉移到網路,再延伸到手機端。Windows應用時代的開發技術,明顯不夠了。以前的程式,裝到機器上,如果出現崩潰、效能差,還可能是本機環境/硬體問題導致的,軟體就你一個人用,跟別人無關。可是網站面向全世界,最少面向一個國家的網民開放,運營的好,就是巨量的使用者在使用,如果癱瘓大家都不能開啟,影響巨大。在系統設計、開發裡面,這種情況下要考慮的問題是跟前面的時代截然不同的。

即使是手機應用程式,後面基本還是網站相關的技術在支撐,因為要跟Web整合。全靠自己自定義協議和模式?哪裡有使用已有的成熟工業技術來的可靠,開發的快,擴充套件還容易。

我看到的架構知識和技術,大半來自於流量巨大的大型網站,特別是電商網站。這其實很容易理解的。電商這些年發展的非常快,網站經常搞促銷、秒殺。這些活動,給網站系統帶來極大的挑戰,壓力很大,相關的開發人員經過反覆探索,總結出了很好的知識。阿里巴巴雙11的零點那一瞬間的流量,足以擊垮任何未經精心準備的系統。熱門產品的秒殺,瞬間的流量也十分的巨大。海量資料、高併發需求,是很典型的特徵。這個時候,別指望什麼單機的效能可以解決多少問題了,無論什麼軟體/硬體,上限很快就到了,向上擴充套件單機處理效能是不行的。

怎麼辦?谷歌怎麼幹的?難道谷歌搞了幾個巨無霸伺服器做搜尋服務?沒用的,它早就發現行不通。其它場景也是類似的道理。

網站架構核心的理念是什麼?

其實我覺得並不複雜,核心性質的東西大都是很簡單的。

架構的理念,就是不斷找到系統的瓶頸和弱點,採用分而治之、快取、非同步等手段逐漸化解,並平衡處理系統各項要求(效能、安全、可用性、伸縮性、擴充套件性…)的過程。由此形成了架構。

很好理解,就是:兵來將擋,水來土掩。架構必須做設計規劃,你必須得懂得要做什麼。但是又不能過度設計,不必也不能完全抄襲大網站的做法,要適合自己。“淘寶就是這麼做的!” – 你不是淘寶,你也不是谷歌。業務需求變化快,留個適度冗餘就夠了,不然會很浪費資源。架構是隨著業務變的,如果沒業務需要你變個啥。

單機思維要徹底拋棄才行。使用者瀏覽器訪問網站頁面,從開啟網址,到最後看到結果,中間是一個較長的操作鏈條。通常的訪問順序是這樣:瀏覽器發出請求->DNS解析域名->瀏覽器連線伺服器->伺服器訪問資料庫->伺服器計算資料結果->返回資料給瀏覽器。 文章其實就是從每個鏈條裡面做。每個不同的動作,都有增加擴充套件、分解流量的機會,於是乎,架構產生,系統開始膨脹起來了。

DNS解析域名,可以智慧化解析到不同的地域,不同的伺服器區域,就近分配計算資源。

瀏覽器連線伺服器,可以使用負載均衡、反向代理等技術,接入伺服器叢集,把訪問分散到不同的裝置上,卻可以返回同樣的結果。

伺服器訪問資料庫,可以根據資料庫讀多寫少的現象,做讀寫分離。還可以採用NoSQL應用,快取熱點資料,可以分割業務區塊,緩解資料庫訪問的壓力。再後面還可以做訪問代理,資料儲存叢集化。

伺服器計算資料結果,可以採用合適的語言和技術,適度快取資料。可以採用訊息佇列、RPC,非同步處理,平滑訪問洪峰。

返回資料給瀏覽器,系統可以加CDN,靜態資源就近訪問。可以大力使用瀏覽器快取手段,規避不需要的更新和訪問需要。

看吧,每項事務,後面都是一堆學問,都是非常專業的工作。由此才需要各類專業人才通力合作完成。當然,因為IT產業的發展,每個鏈條都有不錯的資源/專業服務商/軟體包/工具鏈/中介軟體產品,開發出來供選擇使用。具體在需要的時候,研究使用細節、如何搭配就可以了。

好多地方,是需要的時候再用。好多的事情,不遇到你也想不出關鍵點在什麼地方,坑在哪裡,所以坦然接受吧。

網站架構的常見演化路徑是什麼?

用圖表示比較理想,這裡直接抄來吧,圖片來自李智慧的書《大型網站技術架構-核心原理與案例分析》。注意,它的變化不是固定的,千萬別死板的套用,因為它是電商的,它的演化過程、設計不一定適合你的應用,要學會靈活應對。

1、初始階段的網站架構

enter image description here

2、應用服務和資料服務分離

enter image description here

3、網站使用快取

enter image description here

4、應用伺服器叢集部署

enter image description here

5、資料庫讀寫分離

enter image description here

6、網站使用反向代理和CDN加速訪問

enter image description here

7、使用分散式檔案和分散式資料庫系統

enter image description here

8、使用NoSQL系統和搜尋引擎

enter image description here

9、應用拆分

enter image description here

10、分散式服務

enter image description here

網站架構常用的工具包是什麼?

實際上要根據需求和業務特性進行適當的選擇,這些工具包都是為了解決具體問題而開發的。但是通常用的產品,基本都是Linux平臺上的開源產品,很多中介軟體/工具包使用Java開發 – 它是常青樹是有原因的。但中小型網站使用PHP也很多,因為資料的量級內還足夠處理,開發又方便,成本更低。一些產品使用很廣泛,比如NoSQL類的Redis,已經幾乎成了架構標配,甚至一開始就可以用它快取系統的熱點資料,減少資料庫訪問和計算。

其它工具包,在需要的時候去找合適的採用。

隨著資訊化社會的發展進步,新的產品/應用還會出現,系統的架構還會進一步演化,適應需求。

作者部落格

相關文章