Retry 패키지

Go 에서 http 요청을 하거나 내부 프로세스에서 요청을 할때 실패할 경우 다시 재시도 하는 패키지를 찾았다.

 

패키지는

github.com/avast/retry-go/v4

을 사용했고 가장 많은 star 를 보유하고 있는것 같다.

사용 방법은 다음과 같다.

 

func TestRetryStrategy(t *testing.T) {

	retryOptions := []retry.Option{
		retry.Attempts(uint(3)), // 재시도 3번
		retry.LastErrorOnly(true), // 여러 에러중 가장 마지막 에러를 출력
		retry.RetryIf(func(err error) bool { // 에러의 종류에 따라 중단할지 시작할지 결정
			return true
		}),
	}
	count := 0
	str, err := retry.DoWithData(func() (string, error) { // 데이터를 리턴 받을 경우 사용
    // 리턴 값이 없을 경우 retry.Do(retryableFunc RetryableFunc, opts ...Option) 사용 할 수 있음
		fmt.Printf("start :%d\n", count)
		count++
		fmt.Println("???ajlksd")
		return "", nil // 정상적으로 실행 됐을 경우 재시작을 하지 않음
		//return "", retry.Unrecoverable(errors.New("end")) // 더이상 retry를 하지마라는 뜻
	}, retryOptions...)
	if err != nil {
		fmt.Println("error " + err.Error())
		return
	}
	fmt.Println(str)
}

 

retry option 은 여러가지가 있는데 내가 설정한 옵션은 주석을 달아 놓은 대로 실행된다.
기본적으로 back off 가 설정돼 있으니 back off 를 사용 하지 않을때에는 retry.Delay(time.Millisecond*0), retry.DelayType(retry.FixedDelay) 옵션을 사용하면 특정 딜레이 시간을 고정 할 수 있다.

 

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

Go 1.22 release  (1) 2024.02.15
[문법] 임시 구조체  (0) 2022.05.13
[gRPC/gRPC GATEWAY] json 필드 이름 proto 타입이름과 다를때  (0) 2022.05.12
[gRPC] message oneof 사용  (0) 2022.05.11