mirror of
https://gitlab.com/mangadex-pub/mangadex_at_home.git
synced 2024-01-19 02:48:37 +00:00
Instal a circuit breaker
This commit is contained in:
parent
2d002fcc6c
commit
0c3be9f4b3
|
@ -33,6 +33,7 @@ dependencies {
|
|||
implementation group: "com.maxmind.geoip2", name: "geoip2", version: "2.15.0"
|
||||
|
||||
implementation group: "org.http4k", name: "http4k-core", version: "$http_4k_version"
|
||||
implementation group: "org.http4k", name: "http4k-resilience4j", version: "$http_4k_version"
|
||||
implementation group: "org.http4k", name: "http4k-format-jackson", version: "$http_4k_version"
|
||||
implementation group: "com.fasterxml.jackson.dataformat", name: "jackson-dataformat-yaml", version: "2.12.1"
|
||||
implementation group: "com.fasterxml.jackson.datatype", name: "jackson-datatype-jsr310", version: "2.12.1"
|
||||
|
|
|
@ -24,6 +24,8 @@ import com.fasterxml.jackson.databind.ObjectMapper
|
|||
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule
|
||||
import com.fasterxml.jackson.module.kotlin.jacksonObjectMapper
|
||||
import com.fasterxml.jackson.module.kotlin.readValue
|
||||
import io.github.resilience4j.circuitbreaker.CircuitBreaker
|
||||
import io.github.resilience4j.circuitbreaker.CircuitBreakerConfig
|
||||
import io.micrometer.core.instrument.FunctionCounter
|
||||
import io.micrometer.core.instrument.Timer
|
||||
import io.micrometer.prometheus.PrometheusMeterRegistry
|
||||
|
@ -45,10 +47,7 @@ import mdnet.settings.MetricsSettings
|
|||
import mdnet.settings.RemoteSettings
|
||||
import mdnet.settings.ServerSettings
|
||||
import org.http4k.core.*
|
||||
import org.http4k.filter.CachingFilters
|
||||
import org.http4k.filter.ClientFilters
|
||||
import org.http4k.filter.MicrometerMetrics
|
||||
import org.http4k.filter.ServerFilters
|
||||
import org.http4k.filter.*
|
||||
import org.http4k.lens.LensFailure
|
||||
import org.http4k.lens.Path
|
||||
import org.http4k.routing.bind
|
||||
|
@ -60,6 +59,7 @@ import java.io.BufferedInputStream
|
|||
import java.io.BufferedOutputStream
|
||||
import java.io.InputStream
|
||||
import java.time.Clock
|
||||
import java.time.Duration
|
||||
import java.time.OffsetDateTime
|
||||
import java.util.*
|
||||
import java.util.concurrent.Executors
|
||||
|
@ -230,10 +230,23 @@ fun getServer(
|
|||
registry: PrometheusMeterRegistry,
|
||||
client: HttpHandler
|
||||
): Http4kServer {
|
||||
val upstream =
|
||||
ClientFilters.SetBaseUriFrom(remoteSettings.imageServer)
|
||||
.then(ClientFilters.MicrometerMetrics.RequestTimer(registry))
|
||||
.then(client)
|
||||
val circuitBreaker = CircuitBreaker.of("circuit",
|
||||
CircuitBreakerConfig.custom()
|
||||
.slidingWindow(50, 20, CircuitBreakerConfig.SlidingWindowType.COUNT_BASED)
|
||||
.permittedNumberOfCallsInHalfOpenState(10)
|
||||
.slowCallDurationThreshold(Duration.ofSeconds(20))
|
||||
.waitDurationInOpenState(Duration.ofMinutes(2))
|
||||
.build()
|
||||
)
|
||||
|
||||
val circuited = ResilienceFilters.CircuitBreak(circuitBreaker,
|
||||
isError = { r: Response -> !r.status.successful } // this defaults to >= 500
|
||||
)
|
||||
|
||||
val upstream = ClientFilters.MicrometerMetrics.RequestTimer(registry)
|
||||
.then(ClientFilters.SetBaseUriFrom(remoteSettings.imageServer))
|
||||
.then(circuited)
|
||||
.then(client)
|
||||
|
||||
val imageServer = ImageServer(
|
||||
storage = storage,
|
||||
|
|
Loading…
Reference in a new issue