Retrying Feign Calls

2023. 3. 14. 17:31·SpringBoot

Retrying Feign Calls

 

소개

 

- REST 엔드포인트를 통해 외부 서비스를 호출하는 것은 Feign과 같은 라이브러리에서 매우 간단하게 작성할 수 있습니다.
- 그러나 이러한 호출 중에 많은 문제가 발생할 수 있습니다. 이러한 문제의 대부분은 무작위적이거나 일시적인 것입니다.
- 여기에서는 실패한 호출을 다시 시도하고 보다 탄력적인 REST 클라이언트를 만드는 방법에 대해 알아봅니다.

 

Spring Cloud OpenFeign 환경설정

dependencies {
    implementation("org.springframework.boot:spring-boot-starter")
    implementation("org.springframework.cloud:spring-cloud-starter-openfeign")
}

dependencyManagement {
    imports {
        mavenBom("org.springframework.cloud:spring-cloud-dependencies:2022.0.1")
    }
}

 

# application.properties
spring.cloud.openfeign.compression.request.enabled=true
spring.cloud.openfeign.compression.response.enabled=true
spring.cloud.openfeign.client.config.default.logger-level=full
spring.cloud.openfeign.client.config.default.connect-timeout=5000
spring.cloud.openfeign.client.config.default.read-timeout=5000

 

Feign Retryer

Default Implementation

- Feign은 재시도 인터페이스의 합리적인 기본 구현을 제공합니다.
- 주어진 횟수만큼만 재시도하고, 일정 시간 간격으로 시작한 다음, 재시도할 때마다 지정된 최대값까지 간격을 늘립니다.
- 시작 간격을 1초, 최대 간격을 3초, 최대 시도 횟수를 3회로 정의해 보겠습니다:

@Configuration(proxyBeanMethods = false)
public class CustomOpenFeignConfig {
    @Bean
    public Retryer feignRetryer() {
        return new Retryer.Default(1000, TimeUnit.SECONDS.toMillis(3), 3);
    }
}




No Retrying

- Feign이 호출을 재시도하지 않도록 하려면 클라이언트 빌더에 Retryer.NEVER_RETRY 구현을 제공하면 됩니다. 

- 그러면 매번 예외를 전파하기만 하면 됩니다.

@Configuration(proxyBeanMethods = false)
public class CustomOpenFeignConfig {
    @Bean
    public Retryer feignNoRetryer() {
        return Retryer.NEVER_RETRY;
    }
}



Creating Retryable Exceptions

- 이전에는 호출을 재시도하는 빈도를 제어하는 방법을 배웠습니다.
- 이제 호출을 재시도할 때와 단순히 예외를 던질 때를 제어하는 방법을 살펴보겠습니다.

 


ErrorDecoder 와 RetryableException

- 잘못된 응답을 받으면 Feign은 이를 어떻게 처리할지 결정하는 ErrorDecoder 인터페이스의 인스턴스로 전달합니다.
- 가장 중요한 것은 디코더가 예외를 RetryableException의 인스턴스에 매핑하여 Retryer가 호출을 재시도할 수 있도록 한다는 점입니다.
- ErrorDecoder의 기본 구현은 응답에 "Retry-After" 헤더가 포함된 경우에만 RetryableException 인스턴스를 생성합니다. 가장 일반적으로 503 서비스 사용 불가 응답에서 찾을 수 있습니다.
- 이는 좋은 기본 동작이지만 때로는 더 유연해야 할 때도 있습니다.
- 예를 들어, 때때로 500 내부 서버 오류로 무작위로 응답하는 외부 서비스와 통신하고 있는데 이를 해결할 수 있는 권한이 없는 경우가 있습니다.
- 우리가 할 수 있는 일은 다음 번에는 통화가 성공할 것이라는 것을 알기 때문에 통화를 다시 시도하는 것입니다.
- 이를 위해서는 사용자 정의 ErrorDecoder 구현을 작성해야 합니다.



Custom Error Decoder 생성

- 사용자 정의 디코더에서 구현해야 하는 메서드는 decode 하나뿐입니다.
- 이 메서드는 두 개의 인자, 즉 String 메서드 키와 Response 객체를 받습니다.
- 이 메서드는 예외를 반환하는데, 이 예외가 RetryableException의 인스턴스이거나 구현에 따라 다른 예외인 경우 예외를 반환합니다.
- 디코딩 메서드는 단순히 응답의 상태 코드가 500보다 높거나 같은지 확인합니다.
- 이 경우 RetryableException을 생성합니다. 그렇지 않은 경우, FeignException 클래스의 errorStatus 팩토리 함수로 생성된 기본 FeignException을 반환합니다:

public class Custom5xxErrorDecoder implements ErrorDecoder {
    @Override
    public Exception decode(String methodKey, Response response) {
        FeignException exception = feign.FeignException.errorStatus(methodKey, response);
        int status = response.status();
        if (status >= 500) {
            return new RetryableException(
              response.status(),
              exception.getMessage(),
              response.request().httpMethod(),
              exception,
              null,
              response.request());
        }
        return exception;
    }
}



Custom Error Decoder 설정 추가

@Configuration(proxyBeanMethods = false)
public class CustomOpenFeignConfig {
    @Bean
    public ErrorDecoder custom5xxErrorDecoder() {
        return new Custom5xxErrorDecoder();
    }
}

 

'SpringBoot' 카테고리의 다른 글

Kotlin Simple Version Compare  (0) 2023.03.21
Spring 6 의 HTTP Interface  (0) 2023.03.14
RedisTemplate 과 Json Serializer 설정  (0) 2019.07.09
MongoDB _class 필드 제거하기  (0) 2019.07.09
restful json request response 패킷 로깅 필터  (1) 2019.07.04
'SpringBoot' 카테고리의 다른 글
  • Kotlin Simple Version Compare
  • Spring 6 의 HTTP Interface
  • RedisTemplate 과 Json Serializer 설정
  • MongoDB _class 필드 제거하기
somoly
somoly
About me.
  • somoly
    somoly.tistory.com
    somoly
  • 전체
    오늘
    어제
    • 전체 (55)
      • SpringBoot (8)
      • Kotlin (5)
      • Javascript (4)
      • 백엔드 (6)
      • Linux (25)
      • Windows (1)
      • IT (2)
      • FF14 (1)
      • 애니 (1)
      • Figure (1)
      • 회사생활 (1)
  • 블로그 메뉴

    • HOME
    • TAGS
    • MEDIA
    • LOCATION
    • GUESTBOOK
    • ADMIN
    • WRITE
  • 링크

    • [FF14] 5.0 (71-80) 제작 레벨링 매크로
    • [FF14] 갈론드벨
    • [FF14] FFLogs
    • [FF14] Ariyala 장비 시뮬레이터
    • [FF14] 낚시 도우미
    • [FF14] 인테리어 정보
    • [FF14] 의상 코디 정보
  • 공지사항

  • 인기 글

  • 태그

    최후의 재림
    versioncomapre
    tabulator
    30일전
    Spring
    accesskey
    부팅
    77인치
    dynamodb local
    83인치
    종료
    우분투
    HTTP
    exchage method
    피규어
    VirtualBox
    bcmod
    P2P
    springboot
    ubuntu
    설치
    string methods
    Kotlin
    interactive table
    동영상
    리눅스
    javascript
    utf-8
    jvminline
    linux
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.6
somoly
Retrying Feign Calls
상단으로

티스토리툴바