백오프와 재시도
백오프로 재시도하기
백오프와 재시도은(는) CoddyKit의 무료 Go Academy 강의입니다. 이것은 4개 중 4번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 Go Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. Go Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
재시도하는 이유
일시적인 실패, 시간 초과, 연결 끊김, 짧은 503 오류는 두 번째 시도에서 성공하는 경우가 많습니다. 재시도는 호출자를 방해하지 않으면서 불안정한 작업을 안정적인 작업으로 바꿉니다.
단순한 재시도는 위험합니다
실패 직후 촘촘한 반복문에서 재시도하면 어려움을 겪는 서비스에 과도한 부하를 주고 재시도 폭풍을 일으킬 수 있습니다. 시도 사이에 지연이 필요하며, 그 지연은 점점 늘어나야 합니다.
지수 백오프
지수 백오프는 실패할 때마다 대기 시간을 두 배로 늘립니다(100밀리초, 200밀리초, 400밀리초, 800밀리초). 이렇게 하면 하위 서비스가 복구할 시간을 확보할 수 있습니다.
delay := 100 * time.Millisecond
for attempt := 0; attempt < 5; attempt++ {
// try, on failure:
time.Sleep(delay)
delay *= 2
}지터 추가
많은 클라이언트가 같은 방식으로 백오프하면 모두 같은 순간에 재시도하여 요청이 한꺼번에 몰리는 현상이 발생합니다. 지터는 각 지연 시간을 조금씩 무작위화하여 재시도가 시간상 분산되게 합니다.
jitter := time.Duration(rand.Int63n(int64(delay) / 2))
time.Sleep(delay + jitter)지연 시간 상한 설정
지수적인 증가는 빠르게 매우 커집니다. 시도 사이에 몇 분씩 기다리지 않도록 지연 시간에 최댓값을 설정하십시오.
if delay > 2*time.Second {
delay = 2 * time.Second
}시도 횟수 제한
항상 시도 횟수를 제한하십시오. 제한에 도달하면 마지막 오류를 반환하여 호출자가 영원히 재시도하는 대신 어떻게 처리할지 결정할 수 있게 합니다.
멱등 작업만 재시도하기
작업을 두 번 실행해도 문제가 없을 때에만 재시도가 안전합니다. GET은 멱등적이지만, 카드를 청구하는 멱등적이지 않은 POST는 무작정 재시도하면 안 됩니다. 필요할 때는 멱등성 키를 사용하십시오.
백오프 재시도 전체 구현
이 프로그램은 두 번 실패한 후 성공하는 함수를 재시도하며, 매번 지연 시간을 두 배로 늘립니다. 표준 라이브러리만 사용합니다.
package main
import (
"errors"
"fmt"
"time"
)
func flaky(attempt int) error {
if attempt < 2 {
return errors.New("temporary failure")
}
return nil
}
func main() {
delay := 50 * time.Millisecond
var err error
for attempt := 0; attempt < 5; attempt++ {
err = flaky(attempt)
if err == nil {
fmt.Println("succeeded on attempt", attempt)
return
}
fmt.Printf("attempt %d failed, waiting %v\n", attempt, delay)
time.Sleep(delay)
delay *= 2
}
fmt.Println("gave up:", err)
}context 준수하기
재시도 반복문에 context를 전달하고, 대기 중에는 ctx.Done()을 선택하십시오. 이렇게 하면 취소되거나 시간이 초과된 호출자가 즉시 재시도를 중지할 수 있습니다.
select {
case <-ctx.Done():
return ctx.Err()
case <-time.After(delay):
}오류 구분
모든 오류를 재시도할 수 있는 것은 아닙니다. 400 잘못된 요청은 계속 실패합니다. 오류나 상태 코드를 검사하고 시간 초과, 429, 5xx와 같은 일시적인 종류에만 재시도하십시오.
회로 차단기
실패가 지속되면 회로 차단기가 각 호출을 재시도하는 대신 일정한 냉각 기간 동안 요청 전송을 중지합니다. 이는 백오프를 보완하여 확실히 장애가 난 의존 서비스를 보호합니다.
빠른 확인
백오프에 대한 지식을 확인해 보십시오.
복습
백오프와 재시도에 대해 배웠습니다:
- 지수 백오프는 실패할 때마다 지연 시간을 두 배로 늘립니다
- 지터는 동기화된 재시도 폭풍을 방지합니다
- 지연 시간에 상한을 두고 시도 횟수를 제한합니다
- 멱등적이거나 재시도 가능한 오류만 재시도합니다
- 취소를 위해 context를 준수합니다
AI 튜터와 함께 Go을(를) 배우세요 — 무료
브라우저에서 실제 코드를 작성하고 실행하며, 24/7 AI 튜터로부터 즉각적인 도움을 받고, 웹이나 앱에서 중단한 부분부터 계속 학습하세요.
- 코스
- 51
- 레슨
- 203
자주 묻는 질문
“백오프와 재시도” 강의는 무료인가요?
네 — “백오프와 재시도” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 Go Academy 강의 전체를 잠금 해제할 수 있습니다. Go Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
“백오프와 재시도”에서 뭘 배우나요?
백오프로 재시도하기 브라우저에서 직접 실행하는 실습 코드로 Go Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.
Go Academy을(를) 시작하는 데 경험이 필요한가요?
사전 경험은 필요하지 않습니다. CoddyKit의 Go Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 4번째 강의입니다.
“백오프와 재시도” 강의는 얼마나 걸리나요?
대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.
이 Go Academy 강의에서 코드를 작성하고 실행할 수 있나요?
네. 모든 Go Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.