Hystrix學習筆記

前言

本文主要介紹Hystrix的基本功能,原理。Hystrix協調分佈式系統中各個服務高可用的框架,SpringCloud體系重要的一員。Hystrix主要解決了服務雪崩問題、服務監控問題等。web

Hystrix功能介紹

資源隔離與限流

做用

  • 主要在於預防依賴服務崩潰影響到本身服務資源被耗光,使用隔離的方式限制調用依賴服務所能使用的最大線程資源。若是一個服務崩潰,不控制好資源隔離的話,會引起服務雪崩,衆多上游服務集體崩潰。
  • 另外在併發量很大的狀況下,也能夠下降對依賴服務請求的流量,避免依賴服務過分負載。

原理

  • Hystrix將對外部服務的調用和一系列處理封裝爲一個Commond對象,具體分爲HystrixCommand(直接調用命令),HystrixObservableCommand(觀察者訂閱命令),後者能夠註冊回調事件。二者均可以以異步或同步的方式調用(異步返回Future,後續能夠調用get阻塞獲取結果)。緩存

  • Commond對象對資源隔離進行隔離有兩種方式,一種是使用線程池(經常使用),第二種是使用信號量。二者都是對Commond被調用的線程併發數量進行限制,區別在於信號量只是對command被調用併發許可的一個線程,不能記錄超時信息等等。架構

配置項

  • 選擇Commond資源隔離的策略,線程池(經常使用)或信號量
  • 指定command名稱、組。名稱默認爲類名(一個command一般對應一個依賴服務的接口調用),group下的全部command默認狀況下共用一個線程池或用一個信號量隔離(group通常對應一個依賴服務)。
  • 指定command線程池,HystrixThreadPool的key默認爲組名稱,也能夠手動指定使用的HystrixThreadPool。
  • 指定線程池核心線程數大小,默認爲10。
  • 指定線程池隊列長度,默認-1 無界隊列,設置值以後超過則拒絕請求。
  • 指定線程池拒絕閥值,默認5,超過就拒絕請求。
  • 信號量隔離下可設置最大併發訪問量,默認10。

requestCache-請求緩存

原理

在一個web調用主線程中,爲該主線程調用服務的command創建緩存,使得調用依賴服務相同參數的狀況下直接從內存中獲取結果,因爲本人認爲其做用不是很大,因此就很少介紹了,主要是在攔截器中初始化HytrixRequestContext(這個緩存數據目測應該是在線程本地變量裏面),而後Command中實現getCacheKey方法返回cache的key,當key同樣時,直接嘗試獲取以前調用後返回相同key的結果。併發

fallback-服務降級

原理

經過Command實現getFallBack方法(HystrixCommand)或resumeWithFallback方法(HystrixObservableCommand),實現降級邏輯,本地返回降級以後的結果。框架

降級的條件

  • 線程池或信號量拒絕
  • 調用超時
  • 執行報錯
  • 斷路器被開啓

降級的一般邏輯

  • 取本地緩存中較老的數據
  • 返回默認值

注:降級邏輯能夠設置參數限制併發線程數量(基於信號量)

circuit breaker-斷路器

原理

打開條件

  • 調用超時達到必定比例
  • 執行報錯達到必定比例
  • 線程池或信號量拒絕達到必定比例

半開狀態

必定時間以後會切換到半開狀態,讓1個請求經過,看是否可以正常返回異步

開啓狀態

若是半開狀態容許經過的請求成功了,就關閉斷路器分佈式

相關可配置項

  • 是否打開斷路器(默認打開)
  • 斷路器時間滾動窗中最小的請求數(默認20)
  • 多少異常(包括超時、報錯、拒絕)比例(默認50%)打開斷路器
  • 多長時間進入半開狀態(默認5000毫秒)
  • 是否強制打開斷路器
  • 是否強制關閉斷路器
  • 超時時長配置(默認1000毫秒)
  • 是否打開超時機制(默認打開)

小結

在實踐中,一般用了hystrix,通常的架構體系都是SpringCloud那一套,由於feign組件封裝了hystrix能夠實現熔斷、服務隔離。本文是在學習原生Hystrix所總結的,涉及到的使用和配置方法可能會與當前實踐相偏離,可是看官着重hystrix的功能原理就好,具體應用時能夠再查閱相關資料。學習

相關文章
相關標籤/搜索