Rate Limiter 구현 (2)

날아올라돼지야·2024년 8월 29일
0

1. Rate Limiter 패턴 구현

이번 강의에서는 Spring Boot 기반의 개별 마이크로서비스 내부에서 Rate Limiter 패턴을 구현하는 방법을 설명합니다. 이 예제에서는 getJavaVersion() 메서드를 사용하여 요청 속도를 제한합니다. 이를 통해 지정된 시간 내에 허용된 요청 수를 초과할 경우 오류를 반환하도록 합니다.

2. Rate Limiter 어노테이션 추가

먼저, getJavaVersion() 메서드에 @RateLimiter 어노테이션을 추가합니다.

@RateLimiter(name = "getJavaVersion")
public String getJavaVersion() {
    // 실제 Java 버전 정보를 반환하는 로직
    return System.getProperty("java.version");
}
  • @RateLimiter 설명: 이 어노테이션을 통해 메서드 호출에 대한 속도 제한을 설정할 수 있습니다. name 속성에는 Rate Limiter 설정을 식별할 이름을 지정합니다.

3. Rate Limiter 설정 추가

이제 application.yml 파일에 Rate Limiter 설정을 추가합니다.

resilience4j:
  ratelimiter:
    configs:
      default:
        limitRefreshPeriod: 5000ms
        limitForPeriod: 1
        timeoutDuration: 1s
  • limitRefreshPeriod: 5초(5000ms)마다 할당량을 새로 고칩니다.
  • limitForPeriod: 매 5초마다 최대 1개의 요청만 허용됩니다.
  • timeoutDuration: 요청이 제한된 경우, 새로운 할당량이 생성될 때까지 최대 1초 동안 기다립니다. 1초가 지나도 새로운 할당량이 생성되지 않으면 오류가 반환됩니다.

4. 애플리케이션 시작

설정을 마친 후, 애플리케이션을 다시 빌드하고 시작합니다.

./mvn clean install

이후, AccountsApplication을 시작하고 GatewayServerApplication을 재시작합니다.

./mvn spring-boot:run -Dspring-boot.run.arguments=--server.port=8080

5. Rate Limiter 테스트

이제 Postman을 사용하여 getJavaVersion() API를 여러 번 호출하여 Rate Limiter 동작을 확인합니다.

POST http://localhost:8080/accounts/getJavaVersion
  • 첫 번째 요청: 정상적으로 처리되고 Java 버전이 반환됩니다.
  • 반복된 요청: 여러 번 요청을 보내면 RateLimiter에 의해 제한되어 "RateLimiter does not permit further calls" 오류가 발생합니다.

6. Fallback 메커니즘 추가

이제 Rate Limiter에서 요청이 제한된 경우에 대비한 fallback 메서드를 추가합니다.

@RateLimiter(name = "getJavaVersion", fallbackMethod = "getJavaVersionFallback")
public String getJavaVersion() {
    return System.getProperty("java.version");
}

public String getJavaVersionFallback(Throwable throwable) {
    // Fallback 메서드에서는 간단한 대체 값을 반환합니다.
    return "Java 17";
}
  • Fallback 메서드: getJavaVersionFallback 메서드는 Rate Limiter가 호출을 허용하지 않을 때 호출됩니다. 여기서 기본값 "Java 17"을 반환합니다.

7. Fallback 메커니즘 테스트

애플리케이션을 재시작한 후, 다시 API를 테스트합니다. 여러 번 요청을 보낸 후에는 Rate Limiter에 의해 제한되며, 이때 fallback 메서드가 호출되어 "Java 17"이 반환됩니다.

8. 결론

이번 강의에서는 개별 Spring Boot 마이크로서비스에서 Rate Limiter 패턴을 구현하는 방법을 학습했습니다. 이 패턴은 시스템의 안정성을 유지하고 과도한 트래픽을 제어하는 데 유용합니다. 또한, fallback 메커니즘을 통해 제한된 요청에 대한 대체 응답을 제공할 수 있습니다. 이를 통해 비즈니스 요구 사항에 맞는 유연한 서비스 설계를 할 수 있습니다.

profile
무슨 생각하며 사니

0개의 댓글