카테고리 없음

RateLimiter는 특정 메소드에만 연결됩니다.

기록만이살길 2021. 2. 20. 15:31
반응형

RateLimiter는 특정 메소드에만 연결됩니다.

1. 질문(문제점):

내 메서드에는 두 개의 API 호출이 필요하며 Spring Boot @Cacheable와 Resilience4j @RateLimiter( link to doc ) 장식되어 있습니다 .

    @Cacheable(value = "getProjectFile")
    @RateLimiter(name = "getProjectFile")
    public Optional<String> getProjectFile(String projectName) {
        return getFileName(projectName).flatMap(this::getProjectFileFromFileName);
    }

    private Optional<String> getFileName(String projectName) {
        String url = getUrlFromProjectName(projectName);
        return Optional.ofNullable(restTemplate.getForObject(url, String.class));
    }

    private Optional<String> getProjectFileFromFileName(String fileName) {
        String url = getUrlFromFileName(fileName);
        return Optional.ofNullable(restTemplate.getForObject(url, String.class));
    }

두 주석 모두 완벽하게 작동 하지만 캐시 된 값에 액세스 할 때에도 속도 제한 기가 켜지므로 프로그램 속도가 불필요하게 느려집니다.

이 문제를 해결하기 위해 @RateLimiter주석을 getFileName, getProjectFileFromFileName또는 둘 다로 이동하려고 시도했지만 갑자기 작동이 중지되었습니다 (코드가 컴파일되지만 요청이 너무 자주 발생 함).

@RateLimiter첫 번째 기능 작동하지만 두 번째 또는 세 번째 기능 작동 하지 않는 이유는 무엇 입니까? 그리고 캐시 된 함수 내에서 속도 제한기를 어떻게 얻을 수 있습니까?

2. 해결방안:

Spring AOP 주석은 동일한 클래스 (bean)에서 로컬로 주석이 달린 메소드를 호출 할 때 작동하지 않습니다. 그러면 PROXY가 우회되기 때문입니다.

@Cacheable@RateLimiter같은 방법에 있기 때문에 스프링 AOP의 화면 순서와, 작동하지 않을 수 있습니다. 참조 : https://docs.spring.io/spring-framework/docs/4.3.15.RELEASE/spring-framework-reference/html/aop.html#aop-ataspectj-advice-ordering

RateLimiter의 순서를 전역 적으로 구성 할 수 있지만 메서드 getFileName를 다른 Bean으로 이동하고 @RateLimiter.

65923899
반응형