一、高可用
1. 負載均衡、反向代理:
? ? 作用:將全部的網絡請求均衡地分布到其它服務器,合理管理網絡流量。
? ? LVS:軟件負載均衡器;F5:硬件負載均衡器。
? ? Nginx:軟件負載均衡器、反向代理服務器。
2. 隔離:
? ? 作用:將系統或資源分割開,保障服務間的相互不影響和可用性。
? ? 隔離常用手段:
? ? 1.) 線程隔離:核心業務線程池、非核心業務線程池。基于servlet3的線程隔離術,tomcat7之后版本引入了servlet3,它基于NIO能處理更大的并發數。
? ? ? ? * 通過異步化不會獲得更快的響應時間,但提升了整體的吞吐量和更高的靈活性,根據業務重要性進行分級,對不同的線程池進行監控、運維和降級等處理。
? ? 2.) 進程隔離:拆分多個子系統來實現物理隔離。
? ? 3.) 集群隔離:部署多個服務集群(常規服務分組,秒殺服務分組)
? ? 3.) 機房隔離:多個機房部署,本機房服務正常只調用本機房服務,當其中一個機房發生問題是,通過負載均衡將請求全部切到另一個機房。
? ? 4.) 讀寫隔離:通過主從模式將讀和寫集群分離,如MySQL、Redis。
? ? 5.) 動靜隔離:將動態內容和靜態資源分離,靜態資源放在CDN上。防止訪問量太大導致寬帶被打滿,從而出現不可用。
? ? 6.) 爬蟲隔離:過濾惡意IP,分流到固定分組服務。保證正常流量可用。
3. 限流:
? ? 作用:一個時間窗口內的請求進行限速來保護系統,達到限制速率拒絕服務,從而保護系統可用性。
? ? 限流算法:
? ? 1.) 令牌桶:存放固定容量令牌的桶,按照固定速率往桶里添加令牌。桶滿時,新添加的令牌被丟棄或拒絕。允許一定程度突發流量。算法實現上,可用樂觀鎖CAS(Compare and Swap 比較并交換)實現,AtomicInteger。
? ? 2.) 漏桶:固定容量的漏桶,按照固定速率流出水滴。平滑突發流入速率。算法實現上,可以使用一個BlockingQueue表示漏桶,請求進來時放入這個BlockingQueue中。另起一個線程以固定的速率從BlockingQueue中取出請求,再提交給業務線程池處理。漏桶算法有個弊端:無法應對短時間的突發流量 。
? ? 3.) 計數器:限制總并發數,Redis+Lua實現。
4. 降級:
? ? 作用:保證核心服務可用。
? ? 降級手段:自動開關降級、人工開關降級、讀服務降級、寫服務降級等。
? ? 通過配置中心設置降級開關;可使用Hystrix實現降級、熔斷。
5. 超時與重試機制:
? ? * 如果應用不設置超時,可能導致請求響應慢,慢請求累積導致連鎖反應,甚至造成應用雪崩。
? ? * 設置超時時間,重試次數(不超過3次)
? ? * Nginx、Tomcat、中間件客戶端、數據庫客戶端、NoSQL客戶端、業務超時、前端Ajax超時等
6. 回滾機制:
? ? 代碼庫回滾、數據版本回滾、靜態資源版本回滾等。
7. 壓測與預案:
? ? 系統壓測、應急預案。
二、高并發
1. 緩存:
? ? 應用及緩存:堆內緩存、堆外緩存、分布式緩存。
? ? HTTP緩存:根據服務器端返回的緩存設置響應頭將響應內容緩存到瀏覽器。減少瀏覽器端和服務器端之間來回傳輸數據量,節省帶寬。
? ? 多級緩存:整個系統架構的不同系統層級進行數據緩存,以提升訪問效率。Nginx本地緩存、分布式緩存、Tomcat堆緩存。
? ? * 可擴展分布式緩存常用一致性哈希算法。
? ? * 考慮更新緩存與原子性,緩存擊穿、緩存雪崩問題。
2. 連接池、線程池:
? ? 連接池:如數據庫連接池、Redis連接池、HTTP連接池,通過復用TCP連接減少創建和釋放連接的時間來提升性能。
? ? 線程池:線程池也是類似,通過復用線程提升性能。ThreadPoolExecutor,根據任務類型是IO密集型還是CPU密集型、CPU核數,設置合理的線程池大小、隊列大小、拒絕策略。
3. 異步并發:
? ? 防止請求阻塞方案:異步、協程;Java不支持協程,則使用異步提升吞吐量。
? ? 異步Future
? ? 異步Callback
? ? 異步CompletableFuture
4. 擴容:
? ? 水平拆分和垂直拆分數據/應用來提升系統負載能力。理想情況,只需要增加機器就可以解決系統瓶頸。糟糕情況,需從架構層面重構甚至是重新設計。
? ? 單體應用垂直擴容
? ? 單體應用水平擴容
? ? 應用拆分
? ? 數據庫拆分(分庫分表)
5. 隊列:
? ? 作用:系統解耦、流量削峰、數據同步、擴展性、異步處理、緩沖等。
? ? * 保證最終一致性、不需要強一致性。(保證最終一致性的手段)
? ? * 考慮消息的重復處理,有序性問題。
三、總結:
? ? * 通過負載均衡和反向代理實現分流,通過限流保護服務免受雪崩之災,通過降級實現部分可用、有損服務,通過隔離實現故障隔離,通過設置合理的超時與重試機制避免請求堆積造成雪崩,通過回滾機制快速修改錯誤版本;通過上述原則來保護系統,使得系統高可用。
? ? * 通過緩存、異步并發、連接池、線程池、擴容、消息隊列、分布式任務等高并發原則來提升系統吞吐量。
? ?