1

使用断路器模式时,是否可以将所有外部服务调用包装在传递给的方法中,.withCircuitBreaker()或者每个调用本身都应该传递给.withCircuitBreaker()?例如。

// 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

4

1 回答 1

2

这取决于。当只有一项服务失败时,调用者可以生存吗?我的意思是,假设只有externalCall2失败,您的服务是否能够继续运行,或者它需要两个调用都有效?

如果您高度依赖这两个调用,那么包装这两个听起来是个好主意。externalCall1如果externalCall2失败并且您需要两者,则没有任何意义。这里的建议是在电路打开时进行某种后备/备份。

如果否则调用彼此独立,那么您可能应该为每个调用单独的断路器。同样,当电路打开时,您可以进行某种备份/回退。

一种可能的后备/备份是使用缓存并在电路打开时返回缓存的值。ScalaCache是一个不错的选择。它可以与Ehcache等进程内缓存或 Redis 一起使用,并具有异步/同步 API。

于 2016-01-26T00:55:39.050 回答