2016-02-15 55 views
7

我們有一個蝟(1.4.X)命令看起來像這樣(使用Spring):如何正確處理hystrix後退中的預期錯誤?

@HystrixCommand(groupKey = "GroupKey", commandKey = "CommandKey", fallbackMethod = "myFallback") 
public List<X> findXs(long xId) { 
    return externalService.findXsExternally(xId); 
} 

事實上,我們不想返回(空)List從備用方法,而是拋出一個異常所以我們的呼叫者findXs知道externalService已關閉,並且可以採取相應的措施。但同時我們希望利用Hystrix提供的功能。在我們的例子中,我們希望調用者返回一個錯誤消息而不是返回一個列表。在春回退中實現這樣的:

public List<X> myFallback(long xId) { 
    // What to do?? Throw exception!? 
} 

myFallback拋出異常「作品」,但蝟會警告我們說:

command鍵失敗和撤退失敗。

I.e.它會將此解釋爲回退失敗。在我們的案例中,例外情況應該是而不是被解釋爲後備故障,而不是預期的行爲。我們還嘗試在HystrixBadRequestException中包裝拋出的異常,但它似乎不適用於回退(根據docs,這將適用於「運行」方法)。

如何在Hystrix中實現異常拋出回退方法?我們可以放心地忽略這個警告嗎?還是Hystrix沒有按照這種方式設計作品?

回答

9

如果你不想使用它,你爲什麼要設置回退? Hystrix不需要你設置一個。當您希望從緩存中返回類似陳舊的數據而不是拋出異常時使用回退。這兩種情況都算不上Hystrix。如果您要從後備方法中拋出異常,那麼您只會混淆Hystrix,除了服務本身之外,這可能會認爲您的後備存在錯誤。如果不提供回退,Hystrix應該拋出一個HystrixBadRequestException封裝從findXs方法拋出的異常。

+0

但是,如果您有多個使用@HystrixCommand註解的方法,您如何區分HystrixRuntimeException來自何處?我遇到了問題,我希望根據哪個客戶端具有不同的行爲方式。一個超時,但我唯一知道的是發生了HystrixRuntimeException。 – woezelmann

+0

註釋中有一個名爲** commandKey **的屬性。你可以把它關掉。我只是通過將其設置爲** ckey **來進行測試,並且這裏是處於異常狀態的消息... ** ckey失敗並且後退失敗**。在異常本身中可能還有更多的方法,試試看看 – hyness