[Etc] 동기 방식으로 외부 서비스를 호출할 때 외부 서비스 장애가 나면 어떻게 조치해야 하는가.

선ㅎㅣ·2024년 12월 11일
0

매일메일

목록 보기
1/3

1. 재시도(Retry) 로직 구현

  • 설명: 장애가 일시적인 경우를 대비해 호출 실패 시 일정 횟수 재시도를 시도합니다.
  • 구현:
    • 지수적 백오프(Exponential Backoff): 재시도 간격을 점점 늘려서 요청 빈도를 낮춥니다.
    • 최대 재시도 횟수 설정: 무한 루프를 방지하기 위해 최대 재시도 횟수를 제한합니다.
  • 적용 사례: 네트워크 문제, 과부하 등 일시적인 문제일 가능성이 높을 때.

2. 서킷 브레이커(Circuit Breaker) 패턴

  • 설명: 외부 서비스 장애가 반복되면 더 이상 호출을 시도하지 않고 빠르게 실패를 반환합니다.
  • 구현:
    • Open 상태: 외부 서비스가 장애 상태로 간주되면 호출을 차단합니다.
    • Half-Open 상태: 일정 시간이 지난 후 일부 요청을 시도해 상태를 확인합니다.
    • Closed 상태: 외부 서비스가 복구되면 호출을 재개합니다.
  • 적용 사례: 서비스가 지속적으로 장애를 겪을 때 시스템의 안정성을 보호.

3. Fallback 처리

  • 설명: 외부 서비스 장애 시 대체 로직을 수행하거나 기본값을 반환합니다.
  • 구현:
    • 외부 서비스 데이터 대신 캐싱된 데이터나 미리 정의된 기본값을 제공.
    • 대체 서비스 호출.
  • 적용 사례: 외부 서비스가 필수적이지 않거나 데이터 유효성이 일정 기간 유지 가능한 경우.

4. Timeout 설정

  • 설명: 외부 서비스 응답 지연으로 인해 호출이 무한 대기 상태에 빠지는 것을 방지합니다.
  • 구현:
    • 요청에 적절한 응답 시간 제한 설정.
    • Timeout 발생 시 실패로 간주하고 재시도 또는 Fallback 수행.
  • 적용 사례: 서비스 응답 속도가 중요한 경우.

5. 비동기 요청 전환

  • 설명: 호출을 동기 방식에서 비동기 방식으로 전환해 호출자가 장애의 영향을 덜 받게 만듭니다.
  • 구현:
    • 호출 요청을 메시지 큐(Kafka, RabbitMQ) 등에 저장.
    • 비동기 프로세스가 큐에서 읽어 서비스 호출을 처리.
  • 적용 사례: 호출 결과를 즉시 확인할 필요가 없는 경우.

6. 로깅 및 알림

  • 설명: 외부 서비스 장애를 모니터링하고, 장애 발생 시 적시에 대응할 수 있도록 알림을 설정합니다.
  • 구현:
    • 실패 호출 기록을 로깅.
    • 일정 비율 이상의 실패 시 모니터링 시스템(Slack, PagerDuty 등)으로 알림 전송.
  • 적용 사례: 서비스 장애 원인 분석 및 문제 해결을 위한 데이터 확보.

7. 캐싱 활용

  • 설명: 외부 서비스에서 받은 데이터를 캐싱하여 일시적인 장애 동안에도 기존 데이터를 제공.
  • 구현:
    • Redis, Memcached 등 캐싱 솔루션 사용.
    • 캐싱 데이터 만료 시간 설정(TTL).
  • 적용 사례: 읽기 중심 작업이 많거나 데이터가 자주 변하지 않는 경우.

8. 대체 서비스 사용

  • 설명: 동일한 기능을 제공하는 다른 서비스로 요청을 전환합니다.
  • 구현:
    • 서비스 장애 시 대체 서비스로 라우팅.
    • 예: 여러 지역의 API 엔드포인트 사용.
  • 적용 사례: 고가용성이 중요한 경우.

위 방법들은 상황에 따라 단독 또는 조합하여 사용 가능합니다. 재시도 + 서킷 브레이커 + Fallback은 일반적으로 많이 활용되는 조합입니다.
시스템의 안정성을 유지하면서 장애 상황을 유연하게 처리하려면, 성능 테스트와 장애 시나리오 테스트도 병행하는 것이 중요합니다.

0개의 댓글