[Report]디자인 패턴과 고객 사례로 살펴보는 현대적 어플리케이션 개발 ~AWS에서의 현대적 어플리케이션 개발~ #AWSSummit

2020 AWS Summit Korea 에서 [디자인 패턴과 고객 사례로 살펴보는 현대적 어플리케이션 개발] 세션의 내용을 정리한 글입니다
2020.05.15

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

5월 13일 AWS Summit Online이 개최 되었습니다. 코로나의 영향으로 온라인으로 진행되어서 아쉬웠습니다... 이번 콘퍼런스에서 특히 흥미가 생겼던 세션을 정리도하며 공유도 하기위해 글을 적어보았습니다!! 아키텍처나 디자인 패턴에 관한 부분이라 아무래도 어려운 단어가 많았기에 함께 볼 수 있도록 정리했습니다.

세션 개요

디자인 패턴과 고객 사례로 살펴보는 현대적 어플리케이션 개발

  • 배영부 애플리케이션 아키텍트, AWS
  • 강성일 애플리케이션 아키텍트, AWS

거의 모든 산업 분야의 기업은 전례없는 속도의 변화를 경험하고 있으며, 작고 빠른 기업이 몇달 만에 시장을 앞서나가기도 합니다. 하지만 전통적인 모놀리틱 애플리케이션 환경에서는 시장 변화에 민첩하게 대응하거나 실험을 자주 시도하는 것이 어려웠습니다.컨테이너와 서버리스 기술, MSA, CI/CD의 특징을 가진 모던 어플리케이션 개발은 여러분이 빠르게 혁신할 수 있도록 도와드릴 수 있습니다. 이 세션에서는 실제 비즈니스 케이스를 위해 AWS에 구현한 다양한 모던 어플리케이션 디자인 패턴들을 사례와 함께 소개합니다.

목차

  1. 현대적 애플리케이션 개발
  2. 현대적 애플리케이션의 디자인 패턴
  3. 디자인 패턴 별 고객 사례

현대적 애플리케이션 개발

거의 모든 산업 분야에서 전례없는 변화의 속도를 경험하고 있습니다. 현대의 기업에게 혁신은 필수적일뿐만 아니라 아주 빨라야한다는 것을 우리는 경험적으로 알고 있습니다.

현대의 비즈니스에서 신속함은 매우 중요한 요소 중 하나입니다. 빠르게 변화해가는 시대의 흐름에 맞춰 기업들은 실험을 통해 혁신적인 아이템을 고객들에게 제공해야합니다.

혁신적인 기업들은 전략과 기업 문화, 우수한 인재 그리고 혁신의 중심에 디지털 기술이라는 공통점을 가지고 있습니다.

AWS는 더 효율적이고 신속하게 혁신을 달성하기 위한 최적의 플랫폼입니다.

현대적 애플리케이션의 디자인 패턴

현대적인 애플리케이션의 개발

  • 필요한 자원과 시간을 최소화 시키고 핵심 애플리케이션의 혁신에 투자
  • 가능한한 재활용 가능한 빌딩 블럭과 공통적인 아키텍쳐 패턴을 사용
  • AWS를 애플리케이션의 빌딩 블록으로 사용하면 구현에 필요한 자원을 줄이고 안정성과 가용성을 높일 수 있습니다

현대적인 애플리케이션 구현을 위한 일반적인 패턴

API Gateway

사용하는 AWS 서비스

  • AWS API Gateway

마이크로 서비스 아키텍쳐(이하 'MSA')를 효율적으로 사용하기 위해 서비스의 특정 그룹에 단일 진입점을 제공하는 패턴입니다. 주의할 점은 단일 API 게이트웨이가 애플리케이션의 모든 내부 마이크로 서비스를 집계하도록 하지 않는 것입니다.

Service Discovery and Service Registries

사용하는 AWS 서비스

  • AWS Cloud Map
  • AWS ELB(Elastic Load Balancing)

MSA에서 서비스는 의존하는 다른 서비스의 위치를 항상 찾을 수 있어야합니다. MSA에선 장애에 대응하기 위해 새로운 인스턴스 또는 컨테이너를 온라인 상태로 만드는 등 인스턴스나 컨테이너의 IP가 지속적으로 변경될 수 있습니다. 서비스 인스턴스는 시작될 때 자신의 정보를 service registries에 등록하고, service registries는 각 서비스 인스턴스의 상태를 지속적으로 점검합니다.

이 패턴은 Server-side service discovery pattern 이나 Client-side service discovery pattern 으로 구현될 수 있습니다.

Server-side service discovery pattern

AWS ELB를 활용하여 안정적인 엔드포인트를 제공할 수 있습니다. 단, 로드 밸런싱을 위한 추가적인 컴퓨팅 리소스가 필요하며, 대기시간이 발생할 수 있습니다.

Client-side service discovery pattern

클라이언트가 호출을 제어할 수 있는 경우에 사용합니다. AWS Cloud Map을 활용하여 클라이언트의 호출을 통하여 관리가 가능합니다.

Circuit Breaker

사용하는 AWS 서비스

  • AWS App Mesh

외부 시스템의 오류, 예측 불가능한 오류가 지속적으로 발생하는 것을 방지할 때 사용합니다.
지정된 횟수 이상의 오류가 발생하면 서킷 브레이크가 열린상태가 되고, 요청을 하면 즉시 호출자에게 오류 반환, 정해진 시간이 지나면 다시 닫히고 호출을 정상 처리 합니다.
예전엔 별도의 라이브러리나 프레임워크를 사용했지만 이젠 사이드카 가 있는 컨테이너화 된 마이크로 서비스에서 처리 할 수 있습니다. 엔보이 프록시가 사이드카로 배포되는 경우 서비스 매쉬 의 일부로 사용되기도 합니다.
이러한 유형에서 엔보이 프록시는 데이터 플레인으로 사용되고, AWS App Mesh가 컨트롤 플레인의 역할을 합니다.

CQRS(command query responsibility segregation)

사용하는 AWS 서비스

  • AWS DynamoDB
  • AWS RDS(Aurora)
  • AWS Lambda

데이터의 명령 모듈과 쿼리 모듈을 분리하여 독립적으로 확장이 가능해집니다. 잘 정리된 워크로드에서 DynamoDB로 높은 쓰기 확장성을 확보하고, RDS로 복잡한 쿼리기능을 제공합니다.
그리고 Lambda를 활용하여 데이터를 최신 상태로 유지합니다.

Event Sourcing / Fan-out

사용하는 AWS 서비스

  • AWS Kinesis
  • AWS Lambda
  • AWS SNS(Simple Notification Service)
  • AWS SQS(Simple Queue Service)

이벤트 중심의 접근 방법으로 일련의 상태변경 이벤트를 저장하여 비즈니스 오브젝트를 영속적으로 저장합니다.
여러 이벤트 컨슈머가 스트림해서 데이터를 검색할 수 있도록 AWS Kinesis Data Stream 을 사용합니다.
AWS SNS 를 사용하여 여러 함수로 확장 할 수 있습니다.
Amazon SNS 와 지정된 Lambda 함수 사이에 Amazon SQS 대기열을 추가해서 함수에 대한 실행 소스를 지정 할 수 있습니다.

Choreography

사용하는 AWS 서비스

  • AWS Kinesis
  • AWS Lambda
  • AWS SNS(Simple Notification Service)
  • AWS SQS(Simple Queue Service)

여러 개의 서비스가 연결되어 긴 작업을 형성할 때 사용합니다. 각 서비스가 특정 이벤트에 대해 응답을 독립적으로 실행 할 수 있습니다.

Log Aggregation

사용하는 AWS 서비스

  • AWS Cloud Watch

로그를 균일하게 저장할 수 있는 중앙 저장소를 가집니다. 특히 MSA에서는 요청에 대하여 지연이나 오류 사항을 파악하는 것이 모놀리식 아키텍처에 비해 어려울 수 있습니다.
그렇기에 중앙에 수집 된 로그와 런타임 매트릭이 있어야합니다.
AWS 서비스 내에서의 로그는 Cloud Watch를 활용하여 로그를 수집 할 수 있습니다. ECSFargate의 경우엔 로그 드라이버를 활용하여 Cloud Watch로 보낼 수 있습니다.

디자인 패턴 별 고객 사례

Circuit breaker - AfterShip

Circuit breaker 패턴으로 99.95%의 SLA를 달성하였습니다.
앞쪽의 SQS가 버퍼역할을 하여 Lambda가 실패하더라도 재시도를 할 수 있습니다.

Event sourcing - Zalando

높은 확장성을 가진 파이프라인의 구성과 적은 직원으로 개발/구축/운영을 달성하는 것이 목적입니다.
SNSfan-out을 위해서 사용합니다.

CQRS - Healthdirect Australia

대량의 데이터를 관리하면서 높은 수준의 보안을 달성하는 것이 목적입니다.
EMR을 통해 쓰기의 데이터를 읽기의 Kinesis로 전달합니다.
의미론적 데이터를 사용하는데는 Elasticsearch가 더 적합합니다.

Log Aggregation - Ancestry

대량의 데이터를 수집/저장/분석하면서 보안 규제를 따르는 것이 목적입니다.
Glacier로 데이터를 옮겨 보안 규제를 충족하고 있습니다.
요청에 따라 Elasticsearch에 시간 기반으로 로그를 로딩합니다

참고 자료

마이크로소프트 아키텍쳐
마이크로 서비스 io
microservice on aws
모놀리식 아키텍처
마이크로 서비스 아키텍처