線程池隔離
一個服務有多個接口,在提供服務時,使用了線程池,多個接口共用這一個線程池,如下圖所示:
那么當某個接口處理效率緩慢,當對該接口的請求量上升時,由於該接口處理效率慢,對於該接口的請求就會占用公用的連接池,並且如果長時間沒有釋放連接,就會造成其他接口沒有線程池來處理請求,於是就會出現因為一個接口的問題,導致整個服務的多個接口都不可用。
為了解決這種問題,Hystrix提供了線程池隔離,可以為每個接口設置單獨的線程池,當該接口的線程池被占滿時,只是該接口收到影響,而不會對其他接口造成影響,如下圖所示:
另外,可以讓一部分service共用線程池的同時,另一部分service做線程池隔離,如下圖:
信號量隔離
信號量隔離的方式,和線程池隔離的方式相似,如下圖所示:
信號量隔離的原理:會設置一個信號量值(計數器),當一個接收到一個請求后,信號量減1;當請求處理完后,信號量加1;當信號量減為0的時候,表示不能再接受請求,則會拒絕處理。
線程隔離與信號量隔離的區別
線程池隔離
優點:
1.可以設置coreSize和MaxQueueSize,也就是說,支持排隊;
2.可以設置調用超時時間;
3.支持異步調用;
缺點:
1.創建線程池會產生額外的開銷,且開銷比信號量大;
適用場景:
1.調用其他服務(不受信的服務,不能保證其他服務的服務質量);
2.適合調用的服務比較少的情況(扇出少),如果比較多,則線程池也要加大;
信號量隔離
優點:
1.輕量,開銷可以忽略不計;
缺點:
1.不支持任務排隊,只要信號量減為0,立即就會被拒絕;
2.不支持設置超時,在執行過程中,只能等待調用拿到結果或者拋出異常,操作才會繼續;
3.不支持異步調用;
適用場景:
1.網關(扇出多);
2.受信服務(被調用服務能夠保證不超時);
3.高頻高速調用(比如查cache這種操作,基本能保證在很多時間內響應)