Akka Http断路器

时间:2016-01-25 22:04:13

标签: web-services scala akka akka-http circuit-breaker

使用断路器模式时,是否可以将所有外部服务调用包装在传递给.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))

更新:如果是网络服务,可以在mainActorSystem中注册断路器,或者我应该使用单独的circuitBreakerActorSystem

1 个答案:

答案 0 :(得分:2)

这取决于。当其中一项服务失败时,呼叫者能否生存?我的意思是,假设只有externalCall2失败,您的服务能够继续运行还是需要两个呼叫都有效?

如果你高度依赖于两个电话,那么将这两个声音包装成一个好主意。如果externalCall1失败并且您需要两者,则致电externalCall2是没有意义的。这里的建议是在电路打开时进行某种后备/备份。

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

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

相关问题