# [併發系統架構淺談](https://weekly.howie6879.com/2) ## 應對高流量的選擇 ### 擴展 #### 垂直擴展 - 更貴的硬體 #### 水平擴展 - 更複雜的架構 ### 快取 | 類型 | 回應時間 | | :-: | :-----: | | L1 Cache | 0.5 ns | | L2 cache | 7 ns | | Main Memory reference | 100 ns | | 使用 Zippy 壓縮 1 KB 檔案 | 10,000 ns | | 使用 1 Gbps 網路傳送 1 KB 檔案 | 10,000 ns | | 從 memory 讀取 1 MB 檔案 | 250,000 ns | | 從 SSD 讀取 1 MB 檔案 | 1,000,000 ns | | 硬碟查找 | 10,000,000 ns | ### 異步 ## 追求的方向 ### 高效能 ### 高可用 ### 可擴展 ## DB ### Connection Pool - 如果當前連接數小於最小連接數,則創建新的連接處理數據庫請求 - 如果連接池中有空閒連接則覆用空閒連接 - 如果空閒池中沒有連接並且當前連接數小於最大連接數,則創建新的連接處理請求 - 如果當前連接數已經大於等於最大連接數,則按照配置中設定的時間等待舊的連接可用 - 如果等待超過了這個設定時間則向用戶拋出錯誤。 ![JDK Thread Pool](https://hackmd.io/_uploads/ry5-wk4Y6.png) ### 主從讀寫分離 適用讀多寫少的業務場景 ![讀寫分離](https://hackmd.io/_uploads/SywiOkEKp.png) #### 主從複製 將資料從主庫同步到從庫的方法。 ![主從異步複製](https://hackmd.io/_uploads/S1yb_1EFT.png) #### 如何讓開發可以對存取主庫或從庫的變化無感 - TDDL - Cobar - Mycat - DBProxy ## 快取 適用讀多寫少,且最好業務性質盡可能存在會盡可能關注新的資料而少存取舊資料的特性。(比如 Threads、IG) ### Cache Aside ![更新 Cache 策略](https://hackmd.io/_uploads/BygqF1EKT.png) ![問題點](https://hackmd.io/_uploads/rJBqKJEFp.png) ![Cache Aside](https://hackmd.io/_uploads/BJ9cF14Ka.png) ![Cache 寫入應遠快於對 DB 的寫入,因此不容易發生](https://hackmd.io/_uploads/Bk3yqkEKp.png) - Read/Write Through - Write Back ### 快取穿透 - 回種空值 - 布隆過濾器 ## [資料來源](https://zq99299.github.io/note-architect/hc/)