Retry 및 Timeout

Retry와 Timeout은 마이크로서비스의 복원력을 높이는 핵심 메커니즘입니다. Istio를 사용하면 애플리케이션 코드 변경 없이 이러한 정책을 설정할 수 있습니다.

목차

개요

Timeout과 Retry의 필요성

spinner

Timeout 설정

기본 Timeout

경로별 Timeout

Retry 설정

기본 Retry

Retry 조건

조건
설명

5xx

HTTP 5xx 에러

gateway-error

502, 503, 504 에러

reset

연결 리셋

connect-failure

연결 실패

refused-stream

HTTP/2 REFUSED_STREAM

retriable-4xx

409 Conflict

retriable-status-codes

사용자 정의 상태 코드

고급 Retry 설정

Retry와 Timeout 조합

계층별 Timeout

계산: 최대 대기 시간 = min(전체 timeout, attempts × perTryTimeout) = min(10s, 3 × 3s) = 9s

멱등성 보장이 필요한 경우

실전 예제

예제 1: 마이크로서비스 체인

예제 2: 외부 API 호출

예제 3: Circuit Breaker와 함께 사용

중요 주의사항

⚠️ 비멱등성 요청(Non-Idempotent Requests)에 대한 Retry 위험

핵심 원칙: POST, PUT, DELETE 등 상태를 변경하는 요청은 Istio Proxy에서 자동 retry를 사용하면 데이터 정합성 문제가 발생할 수 있습니다.

문제 상황

spinner

왜 위험한가?

  1. 중복 생성: POST 요청이 실제로는 성공했지만 네트워크 문제로 응답이 손실되면, Proxy가 재시도하여 중복 레코드가 생성됩니다.

  2. 잘못된 상태 변경: 결제, 재고 차감 등 비즈니스 크리티컬한 작업이 중복 실행될 수 있습니다.

  3. 검증 불가능: Istio Proxy는 요청이 성공했는지 확인할 방법이 없습니다.

안전한 Retry 전략

✅ 권장: 애플리케이션 레벨 Retry

HTTP 메소드별 Retry 안전성

메소드
멱등성
Istio Retry 안전성
권장 설정

GET

✅ 멱등

✅ 안전

attempts: 3, retryOn: 5xx,reset

HEAD

✅ 멱등

✅ 안전

attempts: 3, retryOn: 5xx,reset

OPTIONS

✅ 멱등

✅ 안전

attempts: 3, retryOn: 5xx,reset

PUT

⚠️ 조건부 멱등

⚠️ 주의

Idempotency Key 필요

DELETE

⚠️ 조건부 멱등

⚠️ 주의

Idempotency Key 필요

POST

❌ 비멱등

❌ 위험

attempts: 1, 애플리케이션 retry

PATCH

❌ 비멱등

❌ 위험

attempts: 1, 애플리케이션 retry

안전하게 Retry 가능한 경우

Circuit Breaker와 함께 사용 시 주의사항

Circuit Breaker는 장애 격리에는 효과적이지만, 비멱등성 요청의 중복 실행은 막지 못합니다.

실전 가이드라인

  1. GET/HEAD/OPTIONS: Istio Proxy Retry 사용 가능 ✅

  2. POST/PATCH: Istio Retry 비활성화, 애플리케이션 레벨 Retry + Idempotency Key ✅

  3. PUT/DELETE: Idempotency 보장 시에만 Istio Retry 사용 ⚠️

  4. 결제/재고/포인트 등 크리티컬: 반드시 애플리케이션 레벨 검증 + Idempotency Key 🔴

모범 사례

1. Timeout 설정 가이드

2. Retry 전략

3. 지수 백오프 (Exponential Backoff)

Istio는 기본적으로 25ms 간격으로 재시도하지만, 커스텀 백오프가 필요한 경우:

4. 전체 시스템 Timeout 계산

문제 해결

Timeout이 작동하지 않음

Retry가 너무 많이 발생

Retry Storm 방지

참고 자료

마지막 업데이트