AWS에서 장애에 강하고 복원력 있는 애플리케이션 설계하기

AWS에서 애플리케이션 개발하기

Ricardo Sueiras

Principal Technologist

복원력을 고려한 설계

복원력을 위한 설계

AWS에서 애플리케이션 개발하기

모든 것은 실패한다

AWS에서 애플리케이션 개발하기

일시적 장애

 

일시적 장애

  • 일반적인 장애 유형을 이해하세요:
  • 일시적 오류는 저절로 해결되며, 보통 재시도해도 안전합니다.
AWS에서 애플리케이션 개발하기

타임아웃

 

타임아웃

  • 일반적인 장애 유형을 이해하세요:
  • 일시적 오류는 저절로 해결되며, 보통 재시도해도 안전합니다.
  • 타임아웃: 외부 서비스가 응답하는 데 너무 오래 걸립니다.
AWS에서 애플리케이션 개발하기

영구적 오류

 

영구적 오류

  • 일반적인 장애 유형을 이해하세요:
  • 일시적 오류는 저절로 해결되며, 보통 재시도해도 안전합니다.
  • 타임아웃: 외부 서비스가 응답하는 데 너무 오래 걸립니다.
  • 영구적 오류: 요청 자체에 근본적인 문제가 있어 재시도해도 소용없습니다.
AWS에서 애플리케이션 개발하기

API 제한

 

API 제한

  • 일반적인 장애 유형을 이해하세요:
  • 일시적 오류는 저절로 해결되며, 보통 재시도해도 안전합니다.
  • 타임아웃: 외부 서비스가 응답하는 데 너무 오래 걸립니다.
  • 영구적 오류: 요청 자체에 근본적인 문제가 있어 재시도해도 소용없습니다.
  • API 호출 제한: 요청이 너무 많으면 HTTP 429 Too Many Requests가 발생합니다.
AWS에서 애플리케이션 개발하기

재시도 전략

  • 분산 시스템의 장애는 대부분 일시적입니다.
  • 재시도한 요청은 대개 성공합니다.
  • 재시도 로직은 신중하게 추가해야 합니다. 무턱대고 재시도하면 상황이 악화될 수 있습니다.
  • 지수 백오프: 재시도 간격을 점점 늘립니다.
  • 지터: 재시도가 몰리지 않도록 무작위성을 추가합니다.
  • 재시도 제한: 무한 루프를 방지합니다.

 

재시도 전략

AWS에서 애플리케이션 개발하기

AWS SDK의 내장 기능

  • AWS SDK는 재시도 로직을 자동으로 처리합니다.
  • 내장된 재시도 기능에는 지수 백오프와 지터가 포함됩니다.
  • 실패하거나 제한된 요청은 간격을 늘려가며 재시도됩니다.
  • 직접 작성해야 하는 오류 처리 코드를 줄여줍니다.

 

SDK 기능

AWS에서 애플리케이션 개발하기

재시도 로직 관리하기

 

재시도 금지

  • 재시도 로직이 항상 정답은 아닙니다.
  • HTTP 4xx 오류: 서버가 요청을 이해했지만 거부했습니다.
  • 비멱등 요청: 재시도하면 중복되거나 일관성 없는 작업이 발생할 수 있습니다.
AWS에서 애플리케이션 개발하기

타임아웃 관리하기

 

타임아웃 관리

  • 제한 없이 재시도하면 부하 상황에서 문제가 더 커질 수 있습니다.
  • 재시도와 타임아웃을 함께 사용하세요.
  • 타임아웃은 응답을 기다릴 최대 시간을 설정합니다.
  • 외부 서비스를 호출할 때는 반드시 타임아웃을 설정해야 합니다.
AWS에서 애플리케이션 개발하기

서킷 브레이커

  • 서비스가 계속 실패하면 재시도만으로는 충분하지 않습니다.
  • 계속 요청을 보내면 장애가 발생한 서비스에 과부하가 걸릴 수 있습니다.
  • 서킷 브레이커 패턴은 비정상 상태인 종속 서비스에 대한 요청을 일시적으로 중단합니다.
  • 닫힘(Closed) 상태: 요청이 정상적으로 흐릅니다.

 

서킷 브레이커

AWS에서 애플리케이션 개발하기

서킷 브레이커

  • 장애가 임계값을 초과하면 회로가 열립니다.
  • 이후 요청은 차단됩니다.

 

서킷 브레이커

AWS에서 애플리케이션 개발하기

서킷 브레이커

  • 쿨다운 후, 회로는 복구 여부를 테스트하기 위해 반열림(Half Open) 상태로 전환됩니다.
  • 서비스가 정상 응답하면 정상 운영이 재개됩니다.
  • 여전히 실패하면 회로는 열림 상태를 유지합니다.
  • 서킷 브레이커는 애플리케이션 수준에서 구현하세요.

 

서킷 브레이커

AWS에서 애플리케이션 개발하기

데드 레터 큐

 

DLQ

  • 계속 실패하는 메시지는 시스템을 막을 수 있습니다.
  • 이런 메시지는 주 처리 흐름에서 제외하세요.
  • 실패한 메시지는 데드 레터 큐(Dead Letter Queue)로 이동합니다.
  • 복원력 있는 애플리케이션 구축의 핵심 요소입니다.
  • 다만, 트레이드오프를 이해해야 합니다
AWS에서 애플리케이션 개발하기

AWS API 제한

 

API 제한

  • AWS 서비스와는 API를 통해 상호작용합니다.
  • 각 서비스마다 자체 API 호출 제한이 있습니다.
  • 제한을 초과하면 스로틀링(HTTP 429 Too Many Requests)이 발생합니다.
  • 스로틀링을 원활하게 처리할 수 있도록 애플리케이션을 설계하세요.
AWS에서 애플리케이션 개발하기

타사 서비스와 통합하기

  • 타사 서비스는 불확실성을 가져옵니다.
  • 해당 서비스의 성능이나 가용성은 통제할 수 없습니다.
  • 긴 대기를 방지하기 위해 타임아웃을 설정하세요.
  • 일시적 문제에는 백오프를 적용한 재시도를 사용하세요.
  • 종속성을 분리해 영향 범위를 제한하세요.

 

타사 서비스

AWS에서 애플리케이션 개발하기

타사 서비스와 통합하기

  • 동기식 통신에서 비동기식 통신으로 전환하는 것을 고려하세요.
  • 외부 서비스가 지연되더라도 시스템은 계속 처리를 이어갑니다.

 

타사 서비스 관리

AWS에서 애플리케이션 개발하기

연습해 봅시다!

AWS에서 애플리케이션 개발하기

Preparing Video For Download...