1

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
4

0 に答える 0