天天看點

hystrix線程池資源隔離的了解

hystrix作為一款熔斷、降級、資源隔離的優秀元件,廣泛流行。

hystrix如何進行隔離,有線程池隔離和信号量兩種方式。

信号量隔離相對來說容易了解,他就是一個計數器,顯示服務的請求數量,起到了限流的作用。

如何了解線程池隔離,我剛接觸hystrix的時候就走向了誤區。

hystrix線程池資源隔離的了解

這張圖是我們在網上常常看到的,描述hystrix的原理的圖。

但是,其實這張圖并不嚴謹,會把我們帶到一個誤區。

看到這張圖以及網上的講解,我一開始認為,hystrix會在服務消費方,也就是調用者微服務中,将上遊來的請求封裝到一個單獨的線程池中,跟tomcat其他的線程池隔離,本次請求量就算再大也隻是會撐滿自己的線程池,不會影響tomcat的其他服務。這樣就保護了這個微服務的其他接口。卧槽,這得多流弊。

但是,實際上是我想多了,仔細想想也是,外部流量進來,首先接收流量的就是tomcat的threadpool,輪到hystrix幹活,還要經過九曲十八彎呢。

那hystrix的線程池隔離是什麼意思呢,實際上,是接口的請求在來到hystrix之前還要經過controller、service等,真正被hystrix接收到後,hystrix才會建立線程池,把請求放到新的線程中,請求下遊的服務。這個過程中,hystrix就可以控制等待逾時、失敗請求統計等操作。是以這個線程池的大小就決定了對下遊服務的并發請求量,實際上也是在這裡起到了對下遊服務的一個保護。重點就是對下遊服務的保護。對自己所在的服務是否有保護呢,如果我們的hystrix逾時時間(execution.isolation.thread.timeoutInMilliseconds)設定的非常長,那麼當下遊服務響應慢或無響應時,hystrix所在的服務也會長時間挂起,這樣tomcat的線程池也就很快會耗盡,失去保護作用。是以我們的hystrix逾時時間,失敗統計次數,失敗比例等參數設定的合理才能起到對自己的保護作用,也就是對下遊響應慢或無響應的服務,能夠快速熔斷,進行降級,傳回降級結果,釋放寶貴的tomcat線程資源。