[JAVA] Limitation de débit à l'aide de RateLimiter of Resilience4j

https://github.com/resilience4j/resilience4j

resilience4j sera une implémentation de disjoncteur de premier plan principalement pour Java. Des fonctionnalités liées à la limitation de débit existent également.

https://github.com/resilience4j/resilience4j#ratelimiter

Ci-dessous, la vérification est effectuée sur la base de l'exemple de programme suivant.

https://github.com/resilience4j/resilience4j-spring-boot2-demo

Configuration build.gradle

Utilisez ʻio.github.resilience4j: resilience4j-spring-boot2` lors de la liaison avec Spring Boot.

dependencies {
        compile('org.springframework.boot:spring-boot-starter-webflux')
        compile('org.springframework.boot:spring-boot-starter-actuator')
        compile('org.springframework.boot:spring-boot-starter-aop')

        compile("io.github.resilience4j:resilience4j-spring-boot2:${resilience4jVersion}") // <-

application.yml

resilience4j.ratelimiter:
    configs:
        default:
            registerHealthIndicator: false
            limitForPeriod: 3
            limitRefreshPeriod: 2s
            timeoutDuration: 0
            eventConsumerBufferSize: 100
    instances:
        backendA:
            baseConfig: default
        backendB:
            limitForPeriod: 6
            limitRefreshPeriod: 500ms
            timeoutDuration: 3s

Avec limitForPeriod: 3 et limitRefreshPeriod: 2s, la limitation de débit est effectuée s'il y a plus de 3 accès dans les 2 secondes.

Java Définissez l'annotation @RateLimiter lors de la définition de la limitation de débit.

    @Override
    @RateLimiter(name = BACKEND_A) // <--
    @CircuitBreaker(name = BACKEND_A)
    @Bulkhead(name = BACKEND_A)
    @Retry(name = BACKEND_A)
    public String success() {
        return "Hello World from backend A";
    }

Running Avec ce paramètre, une erreur 500 sera renvoyée si l'accès est effectué plus de 3 fois en 2 secondes.

Heure normale (200)

< HTTP/1.1 200 OK
< Content-Type: text/plain;charset=UTF-8
< Content-Length: 26
< 
* Connection #0 to host localhost left intact
Hello World from backend A

Au taux limite (500)

< HTTP/1.1 500 Internal Server Error
< Content-Type: application/json
< Content-Length: 235
< 
{
  "timestamp" : "2020-05-05T09:23:13.530+0000",
  "path" : "/backendA/success",
  "status" : 500,
  "error" : "Internal Server Error",
  "message" : "RateLimiter 'backendA' does not permit further calls",
  "requestId" : "b372ed49"
}

En interne, une exception RuntimeException appelée RequestNotPermitted se produit, il est donc nécessaire d'effectuer une gestion des erreurs appropriée et un traitement de retour HTTP StatusCode dans la couche Controller.

Monitoring Vous pouvez obtenir les paramètres relatifs à la limite de débit avec / actionneur / ratelimiters.

{
  "rateLimiters" : [ "backendA", "backendB" ]
}

Conclusion

Avec resilience4j et resilience4j-spring-boot2, il est assez facile d'ajouter une fonctionnalité de limitation de débit à votre application Spring Boot existante.

La différence avec bucket4j est que le chemin d'URL et le traitement de limitation de débit par utilisateur ne sont pas pris en charge par défaut.

Si vous souhaitez appliquer sérieusement le traitement de limitation de débit à l'ensemble du système, il est préférable d'introduire le middleware API Gateway à l'aide de Ambassador Pattern ou Side-Car Pattern.

Recommended Posts

Limitation de débit à l'aide de RateLimiter of Resilience4j
Limitation de débit à l'aide de RateLimiter de goyave
Exemple d'utilisation de vue.config.js
Résumé de l'utilisation de FragmentArgs
Résumé de l'utilisation de DBFlow
Exemple de paramètres utilisant where
Résumé de l'utilisation de ButterKnife
Exemple d'utilisation d'une classe abstraite
Énumération des modèles de combinaison à l'aide de List
Développement de Flink à l'aide de l'API DataStream
Validation des messages du journal à l'aide de mockito
Gestion des fuseaux horaires avec Java
Acquisition des informations de localisation à l'aide de FusedLocationProviderClient
[Kotlin] Un exemple de traitement utilisant Enum
Résumé de la programmation orientée objet utilisant Java
J'ai essayé d'utiliser Google HttpClient de Java