Akka Http断路器
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))
更新:如果是 Web 服务,是否可以在 mainActorSystem
中注册断路器,或者我应该使用单独的 circuitBreakerActorSystem
?
视情况而定。当只有一个服务失败时,调用者能否生存?我的意思是,假设只有 externalCall2
失败,您的服务是否能够继续运行或者它需要两个调用都有效?
如果您高度依赖这两个调用,将两个调用包装起来听起来是个好主意。如果 externalCall2
失败并且您需要两者,则调用 externalCall1
毫无意义。这里的建议是在电路打开时有某种fallback/backup。
否则,如果调用彼此独立,那么您可能应该为每个调用设置单独的断路器。同样,当电路打开时,您可以有某种 backup/fallback。
一种可能的fallback/backup是使用缓存,return电路打开时缓存的值。 ScalaCache is a good option here. It can work with a in process cache like Ehcache 或使用 Redis 并具有 async/sync 个 API。
使用断路器模式时,是否可以将所有外部服务调用包装在传递给 .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
?
视情况而定。当只有一个服务失败时,调用者能否生存?我的意思是,假设只有 externalCall2
失败,您的服务是否能够继续运行或者它需要两个调用都有效?
如果您高度依赖这两个调用,将两个调用包装起来听起来是个好主意。如果 externalCall2
失败并且您需要两者,则调用 externalCall1
毫无意义。这里的建议是在电路打开时有某种fallback/backup。
否则,如果调用彼此独立,那么您可能应该为每个调用设置单独的断路器。同样,当电路打开时,您可以有某种 backup/fallback。
一种可能的fallback/backup是使用缓存,return电路打开时缓存的值。 ScalaCache is a good option here. It can work with a in process cache like Ehcache 或使用 Redis 并具有 async/sync 个 API。