Spring Retry

2024. 12. 23. 20:34·개발

분산환경에서 짧은 네트워크 중단 또는 일시적인 서비스 불가한 상황에 발생할 때가 있다. 일부 장애는 지속적으로 발생하여 사람의 개입이나 시스템 변경이 필요할 수 있지만 대부분 일시적이어서 재시도를 통해 해결될 때가 있다. 이때 사용하는 것이 Spring Retry이다.

 

Spring Retry는 추상화된 retry operation을 제공한다. 때문에 개발자들이 retry logic을 어플리케이션에 간편하게 추가할 수 있다. 특히나, 일시적인 오류가 문제가 되는 외부 시스템을 다룰 때 굉장히 유용하다.

 

 

사용 방법

코드에 적절한 종속성을 추가하고 실패 시 재시도해야 하는 메서드에 어노테이션을 달면된다.

@Service
class MyService {

    // Retryable: 최대 3번 재시도, 2초 대기 후 2배씩 증가
    @Retryable(
        value = [RuntimeException::class],
        maxAttempts = 3,
        backoff = Backoff(delay = 2000, multiplier = 2.0)
    )
    fun performTask() {
        println("Executing task...")
        throw RuntimeException("Task failed!")
    }

@Retryable 어노테이션이 getCart()라는 메소드에 exception이 발생했을 경우 세번 retry하라는 것을 의미한다. 

(그렇다면 annotation으로 특정 에러가 발생했을 경우 ErrorCode를 토대로 retry여부를 결정할 수 있지 않을까 싶다. 이건 더 알아봐야겠음)

 

- 특정 Exception이 발생하면 Retry를 하도록 설정하는 방법

@Service
class MyService {

    // Retryable: 최대 3번 재시도, 2초 대기 후 2배씩 증가
    @Retryable(
        value = [NetworkException::class, TimeoutException.class],
        maxAttempts = 3,
        backoff = Backoff(delay = 2000, multiplier = 2.0)
    )
    fun performTask() {
        println("Executing task...")
        throw RuntimeException("Task failed!")
    }

 

 

만약 retry의 시도가 모두 완료되었고 여전이 fail이 발생한다면, spring retry는 recovery mechanism을 제공한다. 개발자들이 fallback을 정의할 수 있도록 되어있다. 

@Service
class MyService {

    // Retryable: 최대 3번 재시도, 2초 대기 후 2배씩 증가
    @Retryable(
        value = [RuntimeException::class],
        maxAttempts = 3,
        backoff = Backoff(delay = 2000, multiplier = 2.0)
    )
    fun performTask() {
        println("Executing task...")
        throw RuntimeException("Task failed!")
    }

    // Recover: 모든 재시도가 실패한 후 실행
    @Recover
    fun recover(e: RuntimeException) {
        println("Recovering from failure: ${e.message}")
    }
}

 

 

Stateful 과 Stateless retry

 

기본적으로 Spring Retry는 stateless이다. 때문에 각각의 retry가 독립적이다. 하지만 stateful한 시스템을 운영하는 특정 경우에는 stateful retry를 사용할 수 있다.  

저작자표시 비영리 동일조건 (새창열림)

'개발' 카테고리의 다른 글

API Gateway  (0) 2025.01.05
Spring Fallback  (2) 2024.12.23
견고한 MSA  (2) 2024.12.23
MongoDB Bucket Pattern  (1) 2024.12.23
고민 4일차  (1) 2024.12.20
'개발' 카테고리의 다른 글
  • API Gateway
  • Spring Fallback
  • 견고한 MSA
  • MongoDB Bucket Pattern
senyalog
senyalog
개발 블로그 https://github.com/iamyunjuda
  • senyalog
    Senya의 개발 블로그
    senyalog
  • 전체
    오늘
    어제
    • 분류 전체보기 (77)
      • 일상 (6)
      • 알고리즘 이론 (14)
        • 백준 (8)
      • 개발 (47)
        • Server (7)
        • 인턴 (11)
        • Javascript (0)
      • 경제 (4)
  • 블로그 메뉴

    • Github
    • 홈
  • 링크

    • Github
  • 공지사항

  • 인기 글

  • 태그

    알고리즘공부
    깃
    생각
    일상
    백준문제
    공부
    MSA
    공대생
    개발공부
    개발
    인턴
    알고리즘
    인턴생활
    nestjs
    대학생
    컴공
    서버
    TypeScript
    C++
    GIT
    대학생인턴
    개발자
    카페
    백준풀이
    경제
    코딩테스트
    이마고웍스
    백엔드
    백준
    코딩
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
senyalog
Spring Retry
상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.