< Loosely Coupled Microservices and API Gateways >
Build for the Cloud
클라우드용 빌드
- 클라우드에서 실행되는 애플리케이션은 다음을 처리하도록 구축되어야만 함
- 글로벌 도달 범위 :
- 애플리케이션은 응답성이 있어야 하고 전 세계 사용자가 액세스할 수 있어야 함 - 확장성 및 고가용성 :
- 애플리케이션은 높은 트래픽 볼륨을 안정적으로 처리할 수 있어야 함
- 애플리케이션 아키텍처는 기본 클라우드 플랫폼의 기능을 활용하여 부하 변화에 따라 탄력적으로 확장해야 함 - 보안 :
- 애플리케이션과 기본 인프라는 보안 모범 사례를 구현해야 함
- 사용 사례에 따라 보안 및 규정 준수를 위해 특정 지역에서 사용자 데이터를 격리해야 할 수 있음
Implement best practice to build scalable, more secure, and highly available applications
확장 가능하고 더 안전하며 가용성이 높은 애플리케이션을 구축하기 위한 모범 사례 구현
- 코드 및 환경 관리
- 설계 및 개발
- 확장성 및 안정성
- 마이그레이션(이주)과 관련된 모범 사례를 학습
Manage your application’s code and environment
애플리케이션의 코드 및 환경 관리
- 모범 사례 구현을 통해 애플리케이션의 코드 및 환경 관리
- 코드 저장소 :
- Git 또는 Subversion과 같은 버전 제어 시스템의 코드 리포지토리에 애플리케이션 코드를 저장하여
소스 코드의 변경 사항을 추적하고 지속적인 통합 및 제공을 위한 시스템을 설정할 수 있음 - 종속성 관리 :
- JAR 파일 또는 외부 패키지와 같은 외부 종속성을 코드 저장소에 저장하지 말아야 함
- 대신 애플리케이션 플랫폼에 따라 해당 버전으로 종속성을 명시적으로 선언하고 종속성 관리자를 사용하여 설치
- Node.js 애플리케이션의 경우, package.json 파일에 애플리케이션 종속성을 선언 후 npm install 명령을 사용하여 설치 - 구성/환경 설정 :
- 애플리케이션의 구성 설정을 코드와 분리하며, 구성 설정을 소스 코드에 상수로 저장하지 말아야 함
- 대신 구성 설정을 환경 변수로 지정해야 하며, 이를 통해 개발, 테스트 및 프로덕션 환경 간에 설정을 쉽게 수정할 수 있음
Consider implementing microservices
마이크로서비스 구현 고려
- 모놀리식 애플리케이션을 구현하는 대신 애플리케이션을 마이크로서비스 세트로 구현하거나 리팩토링하는 것을 고려
- 모놀리식 애플리케이션 :
- 코드베이스는 시간이 지남에 따라 더욱 커져 코드를 변경해야 하는 위치를 결정하기 어려움
- 응용 프로그램의 패키지 또는 구성 요소에는 얽힌 종속성이 있을 수 있음
- 코드베이스의 작은 부분이 변경되더라도 전체 애플리케이션을 배포하고 테스트해야 함
- 기능 변경 및 버그 수정 시 노력과 위험이 증가함 - 마이크로서비스 :
- 비즈니스 경계와 관련하여 애플리케이션 구성 요소를 구성할 수 있음
- 각 서비스의 코드베이스는 모듈식이므로 코드를 변경해야 하는 위치를 쉽게 결정할 수 있음
- 각 서비스는 고객이 동시에 변경할 필요 없이 독립적으로 업데이트 및 배포할 수 있으며, 부하에 따라 독립적으로 확장 가능 - 모놀리식 애플리케이션을 최적화하고 마이크로서비스 아키텍처를 사용하는 애플리케이션으로 변환할 때 비용과 이점 평가 필요
Perform asynchronous operations
비동기 작업 수행
- 응답성을 유지하며 백엔드 작업을 비동기적으로 수행 :
- 원격 작업은 예측할 수 없는 응답 시간을 가질 수 있으며 애플리케이션이 느리게 보일 수 있음
- 사용자 스레드의 작업을 최소한으로 유지하며 백엔드 작업을 비동기적으로 수행해야 함 - 이벤트 기반 처리 사용 :
- 가능한 이벤트 기반 처리를 사용해야 함
- 애플리케이션이 사용자가 업로드한 이미지를 처리하는 경우
Cloud Storage 버킷을 사용해 업로드된 이미지를 저장하며 그 후 Cloud 함수를 구현하면
새 이미지가 업로드될 때마다 트리거되어 이미지를 처리해 다른 Cloud Storage에 결과 업로드
Design for loose coupling
느슨한 결합을 위한 설계
- 게시자와 구독자는 느슨하게 연결되어 있음 :
- 런타임에 느슨하게 결합되도록 애플리케이션 구성 요소를 설계함
- 밀접하게 결합된 구성 요소는 장애, 트래픽 급증 및 서비스 변경에 대한 애플리케이션의 탄력성을 저하시킬 수 있음
- 메시지 큐 같은 중간 구성 요소는 느슨한 결합을 구현하고, 비동기식 처리를 수행하고,
트래픽 급증 시 요청을 버퍼링하는데 사용
- Pub/Sub 토픽을 메시지 큐로 사용할 수 있어
게시자(Publisher)는 토픽에 메시지를 게시할 수 있고 구독자(Subscriber)는 이 토픽의 메시지를 구독할 수 있음 - HTTP API 소비자는 게시자 페이로드와 느슨하게 바인딩해야 함 :
- HTTP API 페이로드 컨텍스트에서 HTTP API 소비자는 API 게시자와 느슨하게 바인딩해야 함
- 이 예에서 이메일 서비스는 고객 서비스에서 각 고객에 대한 정보를 검색하며
고객 서비스는 페이로드에 고객의 이름, 나이 및 이메일 주소를 반환
- 이메일을 보내려면 이메일 서비스가 페이로드의 이름과 이메일 필드만 참조해야 하며
페이로드의 모든 필드와 바인딩을 시도해서는 안 됨
- 필드를 느슨하게 바인딩하는 이 방법을 사용하면
게시자가 API를 발전시키고 이전 버전과 호환되는 방식으로 페이로드에 필드를 추가할 수 있음
Implement stateless components for scalability
확장성을 위한 상태 비저장 구성 요소 구현
- 작업자는 상태를 공유하지 않고 컴퓨팅 작업을 수행하며, 안정적으로 확장 및 축소할 수 있음 :
- 내부적으로 상태를 저장하거나 공유 상태에 액세스하지 않도록 애플리케이션 구성 요소를 구현
- 공유 상태에 액세스하는 것은 확장성에 대한 일반적인 병목 현상이므로 작업에만 집중하도록 애플리케이션 구성 요소를 설계
- 이 접근 방식을 사용하면 작업자 패턴을 사용하여 확장성을 위해 구성 요소의 추가 인스턴스를 추가하거나 제거할 수 있음
- 애플리케이션 구성 요소는 효율적인 확장을 위해 빠르게 시작해야 하며 종료 신호를 받으면 정상적으로 종료되어야 함
- 애플리케이션이 IoT 디바이스의 스트리밍 데이터를 처리해야 하는 경우
Pub/Sub 토픽을 사용하여 데이터를 수신할 수 있으며 그런 다음 새 데이터가 들어올 때마다 트리거되는 Cloud 함수 구현 가능
- Cloud 함수는 데이터를 처리, 변환 및 저장할 수 있음
- 애플리케이션이 스트리밍 데이터를 수신하는 Pub/Sub 토픽을 구독할 수 있음
- 애플리케이션의 여러 인스턴스는 토픽의 메시지를 스핀업 및 처리하고 워크로드를 분할할 수 있음
- 이러한 인스턴스는 처리할 메시지가 거의 없을 때 자동으로 종료될 수 있음
- 탄력적 확장을 사용 설정하려면 Cloud Load Balancing이 포함된 Compute Engine, Google Kubernetes Engine
또는 App Engine과 같은 모든 컴퓨팅 환경을 사용할 수 있음
- 어느 접근 방식이든 동시성 또는 확장성을 관리하기 위해 코드를 개발할 필요가 없으며
애플리케이션은 워크로드에 따라 자동으로 확장
Cache content
캐시 콘텐츠
- 콘텐츠를 캐싱하면 애플리케이션 성능을 개선하고 네트워크 대기 시간을 줄일 수 있음
- 애플리케이션 데이터 캐시 :
- 자주 액세스하거나 매번 계산하기 위해 계산 집약적인 애플리케이션 데이터를 캐시함
- 사용자가 데이터를 요청할 때 응용 프로그램 구성 요소는 먼저 캐시를 확인
- 데이터가 캐시에 있는 경우(TTL이 만료되지 않은 경우) 애플리케이션은 이전에 캐시된 데이터를 반환 (Cache hit)
- 데이터가 캐시에 없거나 만료된 경우
애플리케이션은 백엔드 데이터 소스에서 데이터를 검색하고 필요에 따라 결과를 다시 계산 (Cache miss)
- 응용 프로그램은 또한 새 값으로 캐시를 업데이트해야 함 - 캐시 프론트엔드 콘텐츠 :
- Memcached 또는 Redis와 같은 캐시에 애플리케이션 데이터를 캐싱하는 것 외에도
콘텐츠 전송 네트워크(CDN)를 사용하여 웹 페이지(콘텐츠)를 캐시할 수도 있음
- Cloud Content Delivery Network는 Compute Engine VM 인스턴스 그룹에서 가져온 부하 분산된 프런트엔드 콘텐츠
또는 Cloud Storage에서 제공되는 정적 콘텐츠를 캐시할 수 있음
Implement API gateways to make backend functionality available to consumer applications
소비자 애플리케이션에서 백엔드 기능을 사용할 수 있도록 API 게이트웨이 구현
- 소비자 애플리케이션에서 백엔드 기능을 사용할 수 있도록 API 게이트웨이 구현 :
- Cloud Endpoints를 사용하여 OpenAPI 사양을 기반으로 API를 개발, 배포, 보호 및 모니터링할 수 있음
- 애플리케이션용 API는 App Engine, Google Kubernetes Engine 또는 Compute Engine과 같은 백엔드에서 실행 가능
- 리팩토링할 수 없고 클라우드로 이동할 수 없는 레거시 애플리케이션이 있는 경우 API를 파사드 또는 어댑터 계층으로 구현
- 그런 다음 각 소비자는 오래된 프로토콜과 서로 다른 인터페이스를 사용하여 통신하는 기능을 구현하는 대신
이러한 최신 API를 호출하여 백엔드에서 정보를 검색할 수 있음
- Apigee API 플랫폼을 사용하여 기존 백엔드용 API를 설계, 보호, 분석, 확장할 수 있음