《大型網站系統與Java中間件》讀書筆記(上)

前言

只有光頭才能變強。

文本已收錄至個人GitHub倉庫,歡迎Star:https://github.com/ZhongFuCheng3y/3ygit

這本書買了一段時間了,以前在杭州沒帶過去,如今讀完第三章,來作作筆記github

豆瓣評分

這本書前三章都在科普和回顧中間件/分佈式的基礎,講得很是通俗易懂。在以前已經我寫過基礎分佈式相關文章,你們能夠先去看看:數據庫

1、爲何分佈式?

在以前的文章(外行人都能看懂的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多篇原創技術文章、海量視頻資源、精美腦圖, 關注便可獲取!

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

以爲個人文章寫得不錯,點

相關文章
相關標籤/搜索