Satyam Agarwal
08/12/2020, 8:03 AMtupledN
, parTraverse
, parSequence
, bracketCase
, guarantee
from IO
which would need some replacement thats not built on IO
aballano
08/12/2020, 8:11 AMSatyam Agarwal
08/12/2020, 8:18 AMsimon.vergauwen
08/12/2020, 8:19 AMSatyam Agarwal
08/12/2020, 8:24 AMIO
Like this :
data class UtilsHttpCommand(
private val commandKey: String,
private val executionTimeoutMillis: Long,
val httpClient: HttpClient
) {
val circuitBreaker: CircuitBreaker = AppConfig.circuitBreakerRegistry.circuitBreaker(commandKey)
private val timeLimiterConfig: TimeLimiterConfig = TimeLimiterConfig
.custom()
.timeoutDuration(Duration.ofMillis(executionTimeoutMillis))
.build()
val timeLimiter: TimeLimiter = AppConfig.timeLimiterRegistry.timeLimiter(commandKey, timeLimiterConfig)
inline fun <reified A> execute(request: HttpRequestBuilder): IO<A> {
return IO.effect(httpClient.coroutineContext + MDCContext()) {
circuitBreaker.executeSuspendFunction {
timeLimiter.executeSuspendFunction { httpClient.request<A>(request) }
}
}.handleBackendResponse()
}
}
Satyam Agarwal
08/12/2020, 8:26 AMhandleBackendResponse()
is just a
inline fun <reified A> IO<A>.handleBackendResponse(): IO<A> { ... }
Satyam Agarwal
08/12/2020, 8:27 AMIO.handleErrorWith
to convert `Ktor`’s httpClient error classes to my ownsimon.vergauwen
08/12/2020, 8:44 AMsuspend
.
We also have a CircuitBreaker
implementation based on Monix which originally was inspired by Akka.
https://arrow-kt.io/docs/next/apidocs/arrow-fx-coroutines/arrow.fx.coroutines/-circuit-breaker/index.html