2015-04-30 22 views
10

我注意到彈簧雲ZUUL強制執行隔離信號量,而不是線程默認值(如Netflix的推薦)。爲什麼ZUUL強制執行SEMAPHORE隔離來執行其Hystrix命令?

org.springframework.cloud.netflix.zuul.filters.route.RibbonCommand註釋說:

我們要默認信號量隔離,因爲這種包裝是已經跟帖隔離

2人的命令而我依然不明白這一點:-(什麼是這兩個其他命令?

配置這種方式,Zuul只能調度負載,但不允許超時,讓客戶走開。總之,即使Hystrix tim eout設置爲1000ms,客戶端只有在調用轉發給服務器的鏈接返回時纔會被釋放(或者由於ReadTimeout等原因超時)。

我試圖通過修改配置來強制隔離螺紋(每個服務遺憾的是,因爲默認在代碼中強制),一切似乎按預期方式工作。然而,如果沒有正確理解其含義,我並不熱衷於這樣做 - 當然,關於代碼中的評論以及Spring雲版本Zuul採用的默認設置。

有人能提供更多的信息? Thx

+0

有人在這? –

+0

有沒有更新? RibbonCommand中的RestClient.LoadBalancerCommand創建2個Observable。它是否與這個評論有關?我不確定。 –

+0

你好,對晚會遲到抱歉:)我很好奇爲什麼你覺得有必要改變隔離策略?你注意到由於信號量而導致的性能瓶頸嗎?正如'org.springframework.cloud.netflix.zuul.filters.route.support.AbstractRibbonCommand'中的評論中所提到的那樣,超時是由它包裝的2個方法處理的。我猜那些一個功能區的命令,所以超時可以通過'ribbon.connectTimeout'設置和'ribbon.readTimeout' –

回答

3

Hystrix documentation有一個很好的例子,說明在包裝線程隔離的命令時,信號隔離是合適的。具體來說,它說:

外觀HystrixCommand可以使用信號量隔離,因爲它所做的所有工作都是通過兩個已經線程隔離的其他HystrixCommand。只要façade的run()方法沒有執行任何其他網絡調用,重試邏輯或其他「容易出錯」的事情,就沒有必要擁有另一層線程。

更新:這個問題提到線程隔離必須配置爲每個服務,但我發現,你可以控制所有蝟通過設置以下屬性命令(包括RibbonCommands)的隔離:

hystrix.command.default.execution.isolation.strategy = THREAD 
+0

但在這種情況下,那些是什麼其他兩個HystrixCommands ...不能找到他們因此我的問題。 –

+0

@BertrandRenuart我沒有看過Zuul的實現,所以我沒有對這個問題的答案。 –

+0

@BertrandRenuart也許註釋參照LoadBalancerCommand使用rx.Observable的此類通過RibbonCommand的RESTClient實現調用。雖然我不得不承認,但我真的只是在猜測。 –