《大型網站系統與Java中介軟體》讀書筆記(上)

Java3y發表於2019-06-10

前言

只有光頭才能變強。

文字已收錄至我的GitHub倉庫,歡迎Star:github.com/ZhongFuChen…

這本書買了一段時間了,之前在杭州沒帶過去,現在讀完第三章,來做做筆記

豆瓣評分

這本書前三章都在科普和回顧中介軟體/分散式的基礎,講得非常通俗易懂。在之前已經我寫過基礎分散式相關文章,大家可以先去看看:

一、為什麼分散式?

在之前的文章(外行人都能看懂的SpringCloud,錯過了血虧!)也提過為什麼要分散式:

  • 模組之間獨立,各做各的事,便於擴充套件,複用性高
  • 高吞吐量。某個任務需要一個機器執行10個小時,將該任務用10臺機器的分散式跑(將這個任務拆分成10個小任務),可能2個小時就跑完了

在書上給出的觀點:

  • 升級單機的處理能力的價效比越來越低,單機的處理能力存在瓶頸
  • 分散式系統更加穩定和可用(單機掛了就掛了,分散式掛了一般還有備用/不至於整個鏈路全掛)

1.1 大型網站架構演進過程

其實在沒接觸過分散式之前,在逛論壇的時候,經常會出現一些看起來很牛逼的詞,諸如”讀寫分離“、”分庫分表“、”主從架構“、”負載均衡“、”單點故障“等等名詞,就覺得很高大上。下面我就稍微順著”大型網站架構演進過程“來講解一下這些詞

在我們最開始接觸Java專案的時候,一般來說是單機的(資料庫、Web伺服器都是同一臺機器)

資料庫、Web伺服器都是同一臺機器

網站對外開放以後,訪問量增大,伺服器的壓力也隨之提高。此時,我們最簡單的做法就是可以將資料庫和應用分開,這樣可以緩解一下當前系統的壓力

資料庫伺服器和應用伺服器分開

應用伺服器的壓力繼續增大,我們可以把應用伺服器做成叢集(說白了,就是加了臺機器)

給應用伺服器加了一臺

加了臺應用伺服器以後,就出現新的問題了:

  • 使用者請求的時候,走哪臺伺服器啊?
  • Session是依賴單臺伺服器的,那Session怎麼搞?

兩個直面而來的問題

解決使用者走哪臺伺服器,我們就在使用者請求到達應用伺服器之前,加了一個”負載均衡器“,這個”負載均衡器“說白了就寫了使用者請求會到哪臺應用伺服器的邏輯

  • 比如說,一個使用者請求過來,負載均衡器指派這個請求到伺服器A。另一個使用者請求過來,負載均衡器指派這個請求到伺服器B。這樣就平攤了請求— 這種方式就叫做輪詢
  • ...策略還有很多種,就看你想怎麼實現了,反正這個邏輯的程式碼放在負載均衡器上。

而Session的問題,我之前寫什麼是單點登入(SSO)已經講過了,一般來說我們可以將Session儲存在Redis上就行了。

解決請求指派和Session的問題

隨著業務的發展,我們的資料量和訪問量都在增長,現在有不少的業務都是讀多寫少的,對於這種業務也是會直接反應到資料庫上。

於是,我們可以增加一個讀庫。寫入的操作走伺服器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多篇原創技術文章、海量視訊資源、精美腦圖,關注即可獲取!

轉發到朋友圈是對我最大的支援!

覺得我的文章寫得不錯,點

相關文章