AWS에서 장애에 강하고 복원력 있는 애플리케이션 설계하기
AWS에서 애플리케이션 개발하기
Ricardo Sueiras
Principal Technologist
일시적 장애
- 일반적인 장애 유형을 이해하세요:
- 일시적 오류는 저절로 해결되며, 보통 재시도해도 안전합니다.
타임아웃
- 일반적인 장애 유형을 이해하세요:
- 일시적 오류는 저절로 해결되며, 보통 재시도해도 안전합니다.
- 타임아웃: 외부 서비스가 응답하는 데 너무 오래 걸립니다.
영구적 오류
- 일반적인 장애 유형을 이해하세요:
- 일시적 오류는 저절로 해결되며, 보통 재시도해도 안전합니다.
- 타임아웃: 외부 서비스가 응답하는 데 너무 오래 걸립니다.
- 영구적 오류: 요청 자체에 근본적인 문제가 있어 재시도해도 소용없습니다.
API 제한
- 일반적인 장애 유형을 이해하세요:
- 일시적 오류는 저절로 해결되며, 보통 재시도해도 안전합니다.
- 타임아웃: 외부 서비스가 응답하는 데 너무 오래 걸립니다.
- 영구적 오류: 요청 자체에 근본적인 문제가 있어 재시도해도 소용없습니다.
- API 호출 제한: 요청이 너무 많으면 HTTP 429 Too Many Requests가 발생합니다.
재시도 전략
- 분산 시스템의 장애는 대부분 일시적입니다.
- 재시도한 요청은 대개 성공합니다.
- 재시도 로직은 신중하게 추가해야 합니다. 무턱대고 재시도하면 상황이 악화될 수 있습니다.
- 지수 백오프: 재시도 간격을 점점 늘립니다.
- 지터: 재시도가 몰리지 않도록 무작위성을 추가합니다.
- 재시도 제한: 무한 루프를 방지합니다.
AWS SDK의 내장 기능
- AWS SDK는 재시도 로직을 자동으로 처리합니다.
- 내장된 재시도 기능에는 지수 백오프와 지터가 포함됩니다.
- 실패하거나 제한된 요청은 간격을 늘려가며 재시도됩니다.
- 직접 작성해야 하는 오류 처리 코드를 줄여줍니다.
재시도 로직 관리하기
- 재시도 로직이 항상 정답은 아닙니다.
- HTTP 4xx 오류: 서버가 요청을 이해했지만 거부했습니다.
- 비멱등 요청: 재시도하면 중복되거나 일관성 없는 작업이 발생할 수 있습니다.
타임아웃 관리하기
- 제한 없이 재시도하면 부하 상황에서 문제가 더 커질 수 있습니다.
- 재시도와 타임아웃을 함께 사용하세요.
- 타임아웃은 응답을 기다릴 최대 시간을 설정합니다.
- 외부 서비스를 호출할 때는 반드시 타임아웃을 설정해야 합니다.
서킷 브레이커
- 서비스가 계속 실패하면 재시도만으로는 충분하지 않습니다.
- 계속 요청을 보내면 장애가 발생한 서비스에 과부하가 걸릴 수 있습니다.
- 서킷 브레이커 패턴은 비정상 상태인 종속 서비스에 대한 요청을 일시적으로 중단합니다.
- 닫힘(Closed) 상태: 요청이 정상적으로 흐릅니다.
서킷 브레이커
- 장애가 임계값을 초과하면 회로가 열립니다.
- 이후 요청은 차단됩니다.
서킷 브레이커
- 쿨다운 후, 회로는 복구 여부를 테스트하기 위해 반열림(Half Open) 상태로 전환됩니다.
- 서비스가 정상 응답하면 정상 운영이 재개됩니다.
- 여전히 실패하면 회로는 열림 상태를 유지합니다.
- 서킷 브레이커는 애플리케이션 수준에서 구현하세요.
데드 레터 큐
- 계속 실패하는 메시지는 시스템을 막을 수 있습니다.
- 이런 메시지는 주 처리 흐름에서 제외하세요.
- 실패한 메시지는 데드 레터 큐(Dead Letter Queue)로 이동합니다.
- 복원력 있는 애플리케이션 구축의 핵심 요소입니다.
- 다만, 트레이드오프를 이해해야 합니다
AWS API 제한
- AWS 서비스와는 API를 통해 상호작용합니다.
- 각 서비스마다 자체 API 호출 제한이 있습니다.
- 제한을 초과하면 스로틀링(HTTP 429 Too Many Requests)이 발생합니다.
- 스로틀링을 원활하게 처리할 수 있도록 애플리케이션을 설계하세요.
타사 서비스와 통합하기
- 타사 서비스는 불확실성을 가져옵니다.
- 해당 서비스의 성능이나 가용성은 통제할 수 없습니다.
- 긴 대기를 방지하기 위해 타임아웃을 설정하세요.
- 일시적 문제에는 백오프를 적용한 재시도를 사용하세요.
- 종속성을 분리해 영향 범위를 제한하세요.
타사 서비스와 통합하기
- 동기식 통신에서 비동기식 통신으로 전환하는 것을 고려하세요.
- 외부 서비스가 지연되더라도 시스템은 계속 처리를 이어갑니다.
연습해 봅시다!
AWS에서 애플리케이션 개발하기
Preparing Video For Download...