天天看點

解決方案:緩存雪崩優化。

解決方案:緩存雪崩優化。

上圖描述了什麼是緩存雪崩:由于緩存層承載着大量請求,有效地保護了存儲層,但是如果緩存層由于某些原因不能提供服務,于是所有的請求都會達到存儲層,存儲層的調用量會暴增,造成存儲層也會級聯當機的情況。緩存雪崩的英文原意是stampeding herd(奔逃的野牛),指的是緩存層宕掉後,流量會向奔逃的野牛一樣,打向後端存儲。

預防和解決緩存雪崩問題,可以從以下三個方面進行着手。

 保證緩存層服務高可用性。和飛機都有多個引擎一樣,如果緩存層設計成高可用的,即使個别節點、個别機器、甚至是機房宕掉,依然可以提供服務,例如Redis Sentinel和Redis Cluster都實作了高可用。

  • 依賴隔離元件為後端限流并降級。無論是緩存層還是存儲層都會有出錯的機率,可以将他們視同為資源。作為并發量較大的系統,假如有一個資源不可用,可能會造成線程全部阻塞在這個資源上,造成整個系統不可用。降級機制在高并發系統中是非常普遍的:比如推薦服務中,如果個性化推薦服務不可用,可以降級補充熱點資料,不至于造成前端頁面是開天窗。在實際項目中,我們需要對重要的資源(例如Redis、MySQL、HBase、外部接口)都進行隔離,讓每種資源都單獨運作在自己的線程池中,即使個别資源出現了問題,對其他服務沒有影響。但是線程池如何管理,比如如何關閉資源池、開啟資源池、資源池閥值管理,這些做起來還是相當複雜的,這裡推薦一個Java依賴隔離工具Hystrix,如下圖所示。Hystrix是解決依賴隔離的利器。
解決方案:緩存雪崩優化。
  • 提前演練。在項目上線前,演練緩存層宕掉後,應用以及後端的負載情況以及可能出現的問題,在此基礎上做一些預案設定。

繼續閱讀