前言
只有光頭才能變強。
文本已收錄至我的GitHub倉庫,歡迎Star:https://github.com/ZhongFuCheng3y/3y
這本書買了一段時間了,之前在杭州沒帶過去,現在讀完第三章,來做做筆記
這本書前三章都在科普和回顧中間件/分布式的基礎,講得非常通俗易懂。在之前已經我寫過基礎分布式相關文章,大家可以先去看看:
一、為什么分布式?
在之前的文章(外行人都能看懂的SpringCloud,錯過了血虧!)也提過為什么要分布式:
- 模塊之間獨立,各做各的事,便於擴展,復用性高
- 高吞吐量。某個任務需要一個機器運行10個小時,將該任務用10台機器的分布式跑(將這個任務拆分成10個小任務),可能2個小時就跑完了
在書上給出的觀點:
- 升級單機的處理能力的性價比越來越低,單機的處理能力存在瓶頸
- 分布式系統更加穩定和可用(單機掛了就掛了,分布式掛了一般還有備用/不至於整個鏈路全掛)
1.1 大型網站架構演進過程
其實在沒接觸過分布式之前,在逛論壇的時候,經常會出現一些看起來很牛逼的詞,諸如”讀寫分離“、”分庫分表“、”主從架構“、”負載均衡“、”單點故障“等等名詞,就覺得很高大上。下面我就稍微順着”大型網站架構演進過程“來講解一下這些詞
在我們最開始接觸Java項目的時候,一般來說是單機的(數據庫、Web服務器都是同一台機器)
網站對外開放以后,訪問量增大,服務器的壓力也隨之提高。此時,我們最簡單的做法就是可以將數據庫和應用分開,這樣可以緩解一下當前系統的壓力
應用服務器的壓力繼續增大,我們可以把應用服務器做成集群(說白了,就是加了台機器)
加了台應用服務器以后,就出現新的問題了:
- 用戶請求的時候,走哪台服務器啊?
- Session是依賴單台服務器的,那Session怎么搞?
解決用戶走哪台服務器,我們就在用戶請求到達應用服務器之前,加了一個”負載均衡器“,這個”負載均衡器“說白了就寫了用戶請求會到哪台應用服務器的邏輯
- 比如說,一個用戶請求過來,負載均衡器指派這個請求到服務器A。另一個用戶請求過來,負載均衡器指派這個請求到服務器B。這樣就平攤了請求— 這種方式就叫做輪詢
- ...策略還有很多種,就看你想怎么實現了,反正這個邏輯的代碼放在負載均衡器上。
而Session的問題,我之前寫什么是單點登錄(SSO)已經講過了,一般來說我們可以將Session保存在Redis上就行了。
隨着業務的發展,我們的數據量和訪問量都在增長,現在有不少的業務都是讀多寫少的,對於這種業務也是會直接反應到數據庫上。
於是,我們可以增加一個讀庫。寫入的操作走服務器C的MySQL,讀取的操作走服務器D的MySQL。這樣就實現了讀寫分離。
一般來說,我們的寫庫也叫做主庫,讀庫也叫做從庫,在互聯網架構中,這叫做主從架構,比如常見的架構:一主多從(詳細的參考資料:如何給老婆解釋什么是 Master-Slave)
針對讀多寫少的業務,我們還有優化策略,引入搜索引擎和緩存。
- 搜索引擎也相當於一個讀庫,使用搜索引擎的倒排表方式,能夠大大提升檢索的速度
- 緩存則將熱數據放入內存中,如果查詢的數據在緩存中存在,則直接返回
搜索引擎和緩存的參考資料:
注:這里說的索引和緩存就未必特指ES和Redis,比如緩存我也可以用本地緩存而不一定是Redis的。這里用Redis和ES只是我畫圖方便。
繼讀寫分離之后,數據庫還是遇到了瓶頸,此時我們就可以采用分庫分表策略了:
- 垂直拆分— 不同的業務數據分到不同的數據庫
- 水平拆分— 將同一張表的數據拆分到不同的數據庫中(原因是這張表的數據量/更新量太大了)
注:單表行數超過500萬行或者單表容量超過2GB才推薦進行分庫分表(如果預計三年都達不到這個數據量,不要在創建表的時候就分庫分表!) —《阿里巴巴 Java開發手冊》
在數據存儲方面,除了關系型數據庫之外,如果有別的業務場景,可能還需要引入分布式存儲系統
- 分布式文件系統
- 分布式Key-Value系統
- 分布式數據庫
數據庫問題解決之后,應用也面臨着挑戰(應用的功能會越做越多,應用也隨之越做越大),為了不讓應用持續變大,這就需要把應用拆開,從一個應用變為兩個/多個應用。
不同功能/模塊之間的調用不再單純通過本機調用,引入了遠程的服務調用。
某個應用只有一台機器上運行着,如果這台機器上出現了問題,導致這個應用無法運行,這就叫單點故障。
最后
這本書《大型網站系統與Java中間件》的前三章主要是鋪墊什么是中間件、什么是分布式(從單機演進到分布式的過程)以及講述了網站的架構演進過程,剩下的是回顧一些基礎。比如說:
- bio/nio/aio
- HTTP/Session
- JVM
- Java多線程以及並發的基礎知識
- JUC包下的常見類
這些我都曾經多多少少都做過筆記,不妨在我的公眾號下找找相關的文章。總的來說,還是讀得很過癮的!后面讀完下面的章節,我會繼續分享,敬請期待。
樂於輸出干貨的Java技術公眾號:Java3y。公眾號內有200多篇原創技術文章、海量視頻資源、精美腦圖,關注即可獲取!
覺得我的文章寫得不錯,點贊!