CaseStudy:: AWS 클라우드 디자인 패턴 시리즈 리뷰 : 안정성 편
금일은 AWS 기술 블로그의 클라우드 디자인 패턴 시리즈 중 안정성 편을 리뷰하겠습니다. 안정성을 위한 디자인 패턴 2가지를 소개하며 이에 관한 도표와 관련 AWS 서비스를 소개하고 있습니다. 회로 차단기와 Retry 패턴을 구현하기 위한 AWS 서비스는 AWS Step Functions 이 있습니다.
아티클에서는 아키텍처 안정성을 위해 1) 회로 차단기(Circuit-breaker) 패턴, 2) Retry 패턴을 소개합니다.
1. 회로 차단기(Circuit-breaker) 패턴
회로 차단기(Circuit-breaker) 패턴은 전기 회로 차단기에서 영감을 받아 구현한 방식으로 외부 호출에 실패가 지속 발생할 경우 두 연결성을 해지하여 부가적인 문제 발생을 제지하는 것을 말합니다. 회로 차단기 패턴은 3가지 상태(닫힘(Closed), 열림(Open), 반 열림(Half open))들에 기반하여 시스템이 작동합니다.
회로 차단기의 작동 방식:
시스템 정상일 때는 회로가 닫혀있음. 마치 닫혀있을 때 전류가 흐를 수 있듯이.
실패 임계값이 넘을 경우 열림 상태로 전환. 열리면 전류가 흐르지 않음.
열린 상태에서 일정 시간 지난 후 반 열림(Half Open) 상태로 전환 후 호출 성공 여부 카운트.
호출 연속 성공하면 다시 닫힘 상태로 돌아가고, 그렇지 않으면 다시 열린 상태로 들어감.
회로 차단기를 적용하는 상황은 보통 실패 가능성 높은 Caller를 의도적으로 거부하거나, Caller의 요청에 대해 Callee(수신 서비스)의 지연 시간이 비정상적으로 높거나 장애 상황일 경우 입니다.
회로 차단기 구현 시 고려해야 할 점은 운영중 서비스와는 독립적으로 구현해야 합니다. 또 어드민 완전 제어를 통해 복구 시간을 통제할 수 있어야 합니다. 가시성(Observability) 확보를 통해 운영 상태 모니터링과 실패 요청에 관한 로깅도 필수입니다. 마지막으로 다중 스레드 호출의 경우, 첫 번째 호출에 대해 회로를 열어야 합니다.
https://aws.amazon.com/ko/blogs/tech/cloud-design-patterns-on-aws-1/
2. Retry with backoff 패턴
Retry with backoff 디자인 패턴은 요청 실패 시 즉각적인 재시도 대신 일정 대기 시간을 두고 재시도하는 방식입니다. 이를 통해 시스템 부하를 방지하고 애플리케이션의 안정성을 높일 수 있습니다.
대기 시간 설정에는 주로 지수 백오프(Exponential backoff)를 사용하며, 이는 대기 시간을 기하급수적으로 늘려가며 재시도하는 방식입니다. 실패한 호출들이 동시에 백오프하여 경합이 발생할 경우, 임의성을 추가하여 경합 상황을 완화할 수 있습니다.
Retry 패턴은 주로 아래와 같은 상황에 적용할 수 있습니다.
429 Too many request 자주 발생할 경우
일시적인 네트워크 이슈 발생할 경우
요청 처리 서비스가 장애로 인해 서비스 성능이 저하될 수 있는 경우
https://aws.amazon.com/ko/blogs/tech/cloud-design-patterns-on-aws-1/
Review
이 글은 두 디자인 패턴의 개념을 명확하게 설명하고 있으며, 적용 상황과 주의점을 잘 짚어준다는 점에서 매우 유용했습니다. 서버 개발자로서 애플리케이션에 문제가 발생했을 때 예외 처리를 애플리케이션 내부에서만 해결하려는 접근을 무의식적으로 해왔는데요. 서킷 패턴의 경우, 운영 중인 서비스와 독립적으로 구현하여 애플리케이션을 둘러싼 시스템의 안정성 자체를 제어한다는 클라우드 관점의 접근 방식이 흥미로웠습니다.
Reference
https://aws.amazon.com/ko/blogs/tech/cloud-design-patterns-on-aws-1/