scala - 带有 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
解决方案
推荐阅读
- python - 无法使用 plt.imshow 显示图片
- jquery - 如何使 Pardot 上的 Jq 脚本更短更高效
- flutter - 如何获得像图像中的自定义底页?颤动的弯曲底板
- java - 数组兼容性java
- oop - 如何在类外修改可变类?
- reactjs - 无法从 map 和 forEach 函数中遍历 props 数据
- cypress - 我如何在柏树中按名称选择下拉列表?
- python - 检查列值是否在熊猫的其他列中,忽略特殊字符和字符大小
- c++ - 在 C++ 中使用 rust 库时未定义的引用
- ruby-on-rails - 在 Rails MVC 项目中,查询后数据转换应该在哪里进行?模型还是控制器?