2016-01-25 101 views
0

當使用斷路器模式時,是否可以將所有外部服務呼叫都包含在傳遞給.withCircuitBreaker()的方法中,或者每個呼叫本身應傳遞給.withCircuitBreaker()? 例如。Akka Http斷路器

// wrapped 
def wrapper(param: T) : Future[Option[T]] = { 
    externalCall1(param) 
    externalCall2(param) 
} 

circuitBreaker.withCircuitBreaker(wrapper(someParam)) 

// one-by-one 
circuitBreaker.withCircuitBreaker(externalCall1(param)) 
circuitBreaker.withCircuitBreaker(externalCall2(param)) 

更新:在Web服務的情況下,是否可以將註冊斷路器在mainActorSystem或者我應該使用單獨的circuitBreakerActorSystem

回答

2

這取決於。只有其中一項服務失敗時,呼叫者能否存活?我的意思是,假設只有externalCall2失敗,您的服務能夠繼續運行還是需要這兩個調用都起作用?

如果你高度依賴於這兩個調用,將兩個聲音都包裝爲一個好主意。如果externalCall2發生故障,您不需要撥打externalCall1,並且您需要兩者。這裏的建議是在電路打開時進行某種後備/備份。

如果在其他情況下呼叫彼此獨立,那麼您應該爲每個呼叫分別設置不同的斷路器。當電路斷開時,您可以再次進行某種備份/回退。

可能的回退/備份是使用緩存並在電路打開時返回緩存的值。 ScalaCache是一個很好的選擇。它可以與進程緩存(如Ehcache)或Redis一起使用,並具有異步/同步API。

+0

在我的情況下,調用是相關的,你建議用什麼作爲緩存? –

+0

我已編輯答案以添加有關緩存的更多信息。 – marcospereira

+0

感謝您的更新答案 –