首页 > 解决方案 > 带有 Http 请求的断路器 monix

问题描述

我正在努力使 Monix 的断路器与我在服务中收到的一些请求异步工作,并且失败了,因此它应该激活断路器,即使打开它也必须呈现请求。

这是我的代码

 @GET
  def XXXX(@Suspended asyncResponse: AsyncResponse): Unit = {
    val circuitBreaker = breaker.doOnOpen(eval.Task {
      logger.error(null, "Circuit breaker change state to open")
      asyncResponse.resume(Response.status(Response.Status.SERVICE_UNAVAILABLE.getStatusCode))
    })
      .doOnHalfOpen(eval.Task(logger.error(null, "Circuit breaker change state to half-open")))
      .doOnClosed(eval.Task(logger.error(null, "Circuit breaker change state to close")))
    val staticToggleProgram: ZIO[Any, Throwable, Boolean] =
      (for {
        staticToggle <- toggleService.getStaticToggle()
        state <- renderResponse(asyncResponse, staticToggle)
      } yield state).catchAll(t => {
        logger.error(null, s"Toggle Error handler. Unhandled effect $t")
        asyncResponse.resume(Response.status(Response.Status.INTERNAL_SERVER_ERROR.getStatusCode))
        ZIO.fail(t)
      })
    val task = eval.Task(main.unsafeRun(staticToggleProgram))
    circuitBreaker.protect(task).runAsync
  }

似乎什么时候异步在AsyncResponse断路器回调中使用时打开,被下一个到达的请求覆盖,然后我的服务卡住并且没有更多的请求可以到达。

到目前为止,唯一的解决方案是运行它同步,但这不是一个选项,因为它必须是 NIO

circuitBreaker.protect(task).runSyncMaybe

标签: scalascala-catsmonixzio

解决方案


推荐阅读