大型网站架构的发展演变过程
大型網站架構的發展演變過程
?
?原文地址
什么是大型網站
如何定義一個網站是不是大型網站,一般我們會從兩個緯度去考衡,訪問量以及數據量,二者缺一不可。
我們以javaweb為例,來搭建一個簡單的電商系統,從這個系統中來看系統的演變歷史;要注意的是,接下來的演示模型,關注的是數據量、訪問量提升,網站結構發生的變化, 而不是具體關注業務功能點。其次,這個過程是為了讓大家更好的了解網站演進過程中的一些問題和應對策略。
假如我們系統具備以下功能:
用戶模塊:用戶注冊和管理
商品模塊:商品展示和管理
交易模塊:創建交易及支付結算
?
架構的發展演變過程
?
階段一 ?單應用架構
網站的初期也可以認為是互聯網發展的早起,我們經常會在單機上跑我們所有的程序和軟件。
把所有軟件和應用都部署在一臺機器上,這樣就完成一個簡單系統的搭建,這個時候的講究的是效率
單體架構的缺陷
1.復雜性高 整個項目包含的模塊非常多,模塊的邊界模糊,依賴關系不清晰,代碼質量參差不齊,整個項目非常復雜。每次修改代碼都心驚膽戰,甚至添加一個簡單的功能,或者修改一個BUG都會造成隱含的缺陷。 2.技術債務逐漸上升 隨著時間推移、需求變更和人員更迭,會逐漸形成應用程序的技術債務,并且越積越多。已使用的系統設計或代碼難以修改,因為應用程序的其他模塊可能會以意料之外的方式使用它。 3.部署速度逐漸變慢 隨著代碼的增加,構建和部署的時間也會增加。而在單體應用中,每次功能的變更或缺陷的修復都會導致我們需要重新部署整個應用。全量部署的方式耗時長、影響范圍大、風險高,這使得單體應用項目上線部署的頻率較低,從而又導致兩次發布之間會有大量功能變更和缺陷修復,出錯概率較高。 4.擴展能力受限,無法按需伸縮 單體應用只能作為一個整體進行擴展,無法結合業務模塊的特點進行伸縮。 5.阻礙技術創新 單體應用往往使用統一的技術平臺或方案解決所有問題,團隊的每個成員都必須使用相同的開發語言和架構,想要引入新的框架或技術平臺非常困難。 由于單體架構的缺陷日益明顯,所以越來越多的公司采用微服務架構范式解決上面提到的單體架構中的問題。 不同于構建單一、龐大的應用,微服務架構將應用拆分為一套小且互相關聯的服務。?
?
階段二 應用服務器和數據庫服務器分離
?
隨著網站的上線,訪問量逐步上升,服務器的負載慢慢提高,在服務器還沒有超載的時候,我們應該做好規劃,提升網站的負載能力。假如代碼層面的優化已經沒辦法繼續提高,在不提高單臺機器的性能,增加機器是一個比較好的方式,投入產出比非常高。這個階段增加機器的主要目的是講web服務器和數據庫服務器拆分,這樣不僅提高了單機的負載能力,也提高了容災能力
?
?
?
階段三 ?應用服務器集群-應用服務器負載告警,如何讓應用服務器走向集群
?隨著訪問量的繼續增加,單臺應用服務器已經無法滿足需求。在假設數據庫服務器還沒有遇到性能問題的時候,我們可以增加應用服務器,通過應用服務器集群將用戶請求分流到各個服務器中,從而繼續提升負載能力。此時多臺應用服務器之間沒有直接的交互,他們都是依賴數據庫各自對外提供服務
?
架構發展到這個階段,各種問題也會慢慢呈現
用戶請求由誰來轉發到具體的應用服務器
用戶如果每次訪問到的服務器不一樣,那么如何維護session
?
?
?
階段四 ?數據庫壓力變大,數據庫讀寫分離
架構演變到這里,并不是終點。上面我們把應用層的性能拉上來了,但是數據庫的負載也在慢慢增大,那么怎么去提高數據庫層面的負載呢?有了前面的思路以后,自然會想到增加服務器。但是假如我們單純的把數據庫一分為二,然后對于后續數據庫的請求,分別負載到兩臺數據庫服務器上,那么一定會造成數據庫不統一的問題。所以我們一般先考慮讀寫分離的方式
這個架構的變化會帶來幾個問題
主從數據庫之間的數據同步 ; 可以使用mysql自帶的master-slave方式實現主從復制
對應數據源的選擇 ; 采用第三方數據庫中間件,例如mycat
?
?
階段五 ? 使用搜索引擎緩解讀庫的壓力
數據庫做讀庫的話,嘗嘗對模糊查找效率不是特別好,像電商類的網站,搜索是非常核心的功能,即便是做了讀寫分離,這個問題也不能有效解決。那么這個時候就需要引入搜索引擎了
使用搜索引擎能夠大大提高我們的查詢速度,但是同時也會帶來一些附加的問題,比如維護索引的構建。
?
?
?
階段六 ?引入緩存機制緩解數據庫的壓力
隨著訪問量的持續增加,逐漸出現許多用戶訪問統一部分內容的情況,對于這些熱點數據,沒必要每次都從數據庫去讀取,我們可以使用緩存技術,比如memcache、redis來作為我們應用層的緩存;另外在某些場景下,比如我們對用戶的某些IP的訪問頻率做限制,那這個放內存中又不合適,放數據庫又太麻煩,這個時候可以使用Nosql的方式比如mongDB來代替傳統的關系型數據庫
?
?
階段七 ?數據庫的水平/垂直拆分
我們的網站演進的變化過程,交易、商品、用戶的數據都還在同一個數據庫中,盡管采取了增加緩存,讀寫分離的方式,但是隨著數據庫的壓力持續增加,數據庫的瓶頸仍然是個最大的問題。因此我們可以考慮對數據的垂直拆分和水平拆分
垂直拆分:把數據庫中不同業務數據拆分到不同的數據庫
水平拆分:把同一個表中的數據拆分到兩個甚至跟多的數據庫中,水平拆分的原因是某些業務數據量已經達到了單個數據庫的瓶頸,這時可以采取講表拆分到多個數據庫中
?
?
?
階段八 ?應用的拆分
?隨著業務的發展,業務越來越多,應用的壓力越來越大。工程規模也越來越龐大。這個時候就可以考慮講應用拆分,按照領域模型講我們的用戶、商品、交易拆分成多個子系統。
這樣拆分以后,可能會有一些相同的代碼,比如用戶操作,在商品和交易都需要查詢,所以會導致每個系統都會有用戶查詢訪問相關操作。這些相同的操作一定是要抽象出來,否則就會是一個坑。所以通過走服務化路線的方式來解決
?
那么服務拆分以后,各個服務之間如何進行遠程通信呢?
通過RPC技術,比較典型的有:webservice、hessian、http、RMI等等
前期通過這些技術能夠很好的解決各個服務之間通信問題,but,互聯網的發展是持續的,所以架構的演變和優化還在持續。
?
?
?
總結
我們通過這個例子來講解了電商網站的架構演進。我要強調一下,這個架構的演進不是某個網站真實的例子,實際上是通過這樣一個演進過程給大家帶來一個全局的觀念和感受。以及給大家在后續課程學習過程中的一些思路。
如何把單擊擴展到分布式
前面我們講到了馮.諾依曼模型,計算機一共由5個部分組成,從用戶角度來看,分布式系統就像一臺超級計算機。理論上也應該由輸入、輸出、運算、存儲和控制這5部分組成。
輸入設備的變化
在分布式系統架構中,輸入設備可以分兩類,第一類是互相連接的多個節點,在接收其他節點傳來的信息作為該節點的輸入;另一種就是傳統意義上的人機交互的輸入設備了
輸出設備的變化
輸出和輸入類似,也有兩種,一種是系統中的節點向其他節點傳輸信息時,該節點可以看作是輸出設備;另一種就是傳統意義上的人際交互的輸出設備,比如用戶的終端
控制器的變化
在單機中,控制器指的是CPU中的控制器,在分布式系統中,控制器主要的作用是協調或控制節點之間的動作和行為;比如硬件負載均衡器;LVS軟負載;規則服務器等
運算器
在分布式系統中,運算器是由多個節點來組成的。運用多個節點的計算能力來協同完成整體的計算任務
存儲器
在分布式系統中,我們需要把承擔存儲功能的多個節點組織在一起,組成一個整體的存儲器;比如數據庫、redis(key-value存儲)
轉載于:https://www.cnblogs.com/-wenli/p/10956930.html
《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀總結
以上是生活随笔為你收集整理的大型网站架构的发展演变过程的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: I am too vegetable t
- 下一篇: @RequestMapping中meth