使用断路器模式时,是否可以将所有外部服务调用包装在传递给.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
?
答案 0 :(得分:2)
这取决于。当其中一项服务失败时,呼叫者能否生存?我的意思是,假设只有externalCall2
失败,您的服务能够继续运行还是需要两个呼叫都有效?
如果你高度依赖于两个电话,那么将这两个声音包装成一个好主意。如果externalCall1
失败并且您需要两者,则致电externalCall2
是没有意义的。这里的建议是在电路打开时进行某种后备/备份。
如果否则呼叫彼此独立,那么您应该为每个呼叫分离断路器。同样,当电路打开时,您可以进行某种备份/回退。
可能的回退/备份是使用缓存并在电路打开时返回缓存的值。 ScalaCache在这里是个不错的选择。它可以与Ehcache或Redis等进程内缓存一起使用,并具有异步/同步API。