微服務高可用、高并發思路

一、高可用

1. 負載均衡、反向代理:

? ? 作用:將全部的網絡請求均衡地分布到其它服務器,合理管理網絡流量。

? ? LVS:軟件負載均衡器;F5:硬件負載均衡器。

? ? Nginx:軟件負載均衡器、反向代理服務器。

圖1

2. 隔離:

? ? 作用:將系統或資源分割開,保障服務間的相互不影響和可用性。

? ? 隔離常用手段:

? ? 1.) 線程隔離:核心業務線程池、非核心業務線程池。基于servlet3的線程隔離術,tomcat7之后版本引入了servlet3,它基于NIO能處理更大的并發數。

? ? ? ? * 通過異步化不會獲得更快的響應時間,但提升了整體的吞吐量和更高的靈活性,根據業務重要性進行分級,對不同的線程池進行監控、運維和降級等處理。

? ? 2.) 進程隔離:拆分多個子系統來實現物理隔離。

? ? 3.) 集群隔離:部署多個服務集群(常規服務分組,秒殺服務分組)

? ? 3.) 機房隔離:多個機房部署,本機房服務正常只調用本機房服務,當其中一個機房發生問題是,通過負載均衡將請求全部切到另一個機房。

? ? 4.) 讀寫隔離:通過主從模式將讀和寫集群分離,如MySQL、Redis。

? ? 5.) 動靜隔離:將動態內容和靜態資源分離,靜態資源放在CDN上。防止訪問量太大導致寬帶被打滿,從而出現不可用。

? ? 6.) 爬蟲隔離:過濾惡意IP,分流到固定分組服務。保證正常流量可用。

圖2.1

3. 限流:

? ? 作用:一個時間窗口內的請求進行限速來保護系統,達到限制速率拒絕服務,從而保護系統可用性。

? ? 限流算法:

? ? 1.) 令牌桶:存放固定容量令牌的桶,按照固定速率往桶里添加令牌。桶滿時,新添加的令牌被丟棄或拒絕。允許一定程度突發流量。算法實現上,可用樂觀鎖CAS(Compare and Swap 比較并交換)實現,AtomicInteger。

? ? 2.) 漏桶:固定容量的漏桶,按照固定速率流出水滴。平滑突發流入速率。算法實現上,可以使用一個BlockingQueue表示漏桶,請求進來時放入這個BlockingQueue中。另起一個線程以固定的速率從BlockingQueue中取出請求,再提交給業務線程池處理。漏桶算法有個弊端:無法應對短時間的突發流量 。

? ? 3.) 計數器:限制總并發數,Redis+Lua實現。

圖3.1

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. 隊列:

? ? 作用:系統解耦、流量削峰、數據同步、擴展性、異步處理、緩沖等。

? ? * 保證最終一致性、不需要強一致性。(保證最終一致性的手段)

? ? * 考慮消息的重復處理,有序性問題。


三、總結:

? ? * 通過負載均衡和反向代理實現分流,通過限流保護服務免受雪崩之災,通過降級實現部分可用、有損服務,通過隔離實現故障隔離,通過設置合理的超時與重試機制避免請求堆積造成雪崩,通過回滾機制快速修改錯誤版本;通過上述原則來保護系統,使得系統高可用。

? ? * 通過緩存、異步并發、連接池、線程池、擴容、消息隊列、分布式任務等高并發原則來提升系統吞吐量。

? ?


最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容