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。