AWS의 애플리케이션 아키텍처 패턴

AWS에서 애플리케이션 배포하기

Dunieski Otano

Amazon Web Services Solutions Architect

강사 소개

AWS 솔루션즈 아키텍트이자 클라우드 경력 약 10년인 강사 Dunieski Otano

AWS에서 애플리케이션 배포하기

올바른 아키텍처가 중요한 이유

아키텍처 선택 노드가 결합, 상태, 통신이라는 세 가지 요소로 나뉘고, 그 위에 트레이드오프를 나타내는 작은 저울 아이콘이 있는 밝은 테마의 의사 결정 다이어그램

  • 아키텍처는 정답이 하나가 아니라 트레이드오프의 집합입니다
    • 모든 선택은 세 가지 질문으로 결정됩니다:
      • 구성 요소가 얼마나 긴밀하게 결합되어 있나요?
      • 상태는 어디에 저장되나요?
      • 통신은 동기식인가요, 비동기식인가요?
    • 유행이 아니라 워크로드에 맞는 패턴을 선택하세요
AWS에서 애플리케이션 배포하기

금요일 밤의 연쇄 장애

  • 느린 결제 API 하나가 전체 결제 과정을 멈추게 합니다
  • 모든 서비스가 이 API를 동기적으로 기다렸습니다
  • 해결책은 더 빠른 API가 아니라 아키텍처입니다

메시지 큐로 분리되지 않아 멈추는 긴밀 결합 서비스와 분리된 서비스를 나란히 비교

AWS에서 애플리케이션 배포하기

아키텍처 선택이 배포를 결정하는 이유

하나의 서비스 장애가 모든 서비스로 전파되는 취약한 긴밀 결합 아키텍처와, 큐 버퍼가 장애를 격리해 다른 서비스는 계속 작동하는 복원력 있는 설계를 비교하는 다이어그램

  • 선택한 패턴이 애플리케이션의 확장성과 장애 방식을 결정합니다
    • 긴밀 결합 설계는 부하가 걸리면 무너집니다
  • 올바른 패턴은 배포를 예측 가능하게 만듭니다
    • 같은 코드라도 운영 환경에서의 동작은 완전히 다릅니다
AWS에서 애플리케이션 배포하기

핵심 아키텍처 패턴

  • 모놀리식(Monolithic): 배포 단위가 하나이며 시작하기 간단합니다
  • 마이크로서비스(Microservices): 독립적인 서비스로 각각 배포됩니다
  • 이벤트 기반(Event-driven): 직접 호출이 아니라 이벤트에 반응하는 구성 요소입니다
    • 팬아웃(Fanout)은 이벤트 기반의 하위 패턴으로, 하나의 이벤트가 여러 소비자에게 전달됩니다

 

세 가지 애플리케이션 아키텍처 패턴을 나란히 비교: 하나의 블록으로 쌓인 모놀리식, 독립적으로 배포 가능한 서비스로 이루어진 마이크로서비스, 이벤트 버스를 사용하는 이벤트 기반, 그리고 이벤트 기반 패널 안에 하위 패턴으로 표시되어 하나의 이벤트를 여러 소비자에게 발행하는 팬아웃

AWS에서 애플리케이션 배포하기

스테이트풀 vs 스테이트리스

  • 스테이트리스(Stateless): 요청 간에 클라이언트 데이터를 유지하지 않습니다
    • 어떤 인스턴스든 모든 요청을 처리할 수 있습니다
  • 스테이트풀(Stateful): 인스턴스가 이전 상호작용을 기억합니다
  • 스테이트리스 특성 덕분에 수평 확장이 가능합니다
    • 공유 상태는 DynamoDB 또는 ElastiCache로 옮기세요

왼쪽은 어떤 요청이든 도달할 수 있는 스테이트리스 함수 인스턴스, 오른쪽은 하나의 클라이언트 세션에 묶인 스테이트풀 인스턴스

AWS에서 애플리케이션 배포하기

긴밀 결합 vs 느슨한 결합

느린 호출 대상(callee)을 기다리며 차단된 호출자가 있는 긴밀 결합과, SQS 큐가 메시지를 버퍼링해 생산자가 계속 작동하는 느슨한 결합을 비교

  • 긴밀 결합(Tight coupling): 호출자가 호출 대상의 응답을 기다립니다
  • 느린 서비스 하나가 전체 체인을 멈추게 합니다
  • 느슨한 결합(Loose coupling): 서비스 사이에 Amazon SQS 큐가 위치합니다
  • 소비자가 다운되어도 생산자는 계속 작동합니다
AWS에서 애플리케이션 배포하기

동기 vs 비동기

  • 동기(Synchronous): 호출자가 차단된 채 결과를 기다립니다
  • 호출자가 즉시 답을 필요로 할 때 사용합니다
  • 비동기(Asynchronous): 호출자가 작업을 넘기고 바로 돌아옵니다
  • 느리거나 몰리거나 긴급하지 않은 작업에 사용합니다

 

왼쪽은 응답이 올 때까지 호출자가 차단되는 동기 호출, 오른쪽은 즉시 반환되고 백그라운드에서 처리되는 비동기 전달

AWS에서 애플리케이션 배포하기

외부 호출을 위한 복원력 패턴

  • 지수 백오프 재시도(Exponential backoff retry): 시도 간격을 점점 늘립니다
  • 서킷 브레이커(Circuit breaker): 장애가 발생한 서비스 호출을 일정 시간 중단합니다
  • 데드레터 큐(Dead-letter queue): 계속 실패하는 메시지를 따로 보관합니다
  • 이 패턴들을 함께 사용하세요. 무분별한 재시도는 장애를 악화시킵니다

세 가지 복원력 패턴: 지수 백오프 재시도 곡선, 장애 서비스 호출을 중단하는 서킷 브레이커, 재시도를 모두 소진한 메시지를 담는 데드레터 큐

AWS에서 애플리케이션 배포하기

연습해 봅시다!

AWS에서 애플리케이션 배포하기

Preparing Video For Download...