【问题标题】:Akka Http Circuit breakerAkka Http 断路器
【发布时间】:2016-05-02 09:26:52
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 在我的场景中,调用是依赖的,你建议使用什么作为缓存?
    • 我已编辑答案以添加有关缓存的更多信息。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-13
    相关资源
    最近更新 更多