개발 무지렁이

[Arch.] 클라우드 환경에서의 애플리케이션의 설계, 개발, 배포 방식과 12가지의 지침(+ 3 factors) 본문

Backend/Architecture

[Arch.] 클라우드 환경에서의 애플리케이션의 설계, 개발, 배포 방식과 12가지의 지침(+ 3 factors)

Gaejirang-e 2023. 9. 20. 00:38

𐁍 Cloud Native Architecture
클라우드 컴퓨팅유연성, 확장성, 자동화 기능을 최대한 활용하여
클라우드 환경에서 애플리케이션을 설계, 개발 및 배포하는 방식을 지칭하는 개념이다.

🍩 탄력적 아키텍처
: 분할된 서비스 구조, 무상태(Stateless) 통신 프로토콜, 서비스 추가/삭제 자동 감지, 동적처리, 장애격리

❓무상태(Stateless) 통신 프로토콜
: 각 요청과 응단 간에 상태정보를 공유하지 않고 독립적으로 처리되는 방식을 말한다.

❓동적처리
: 애플리케이션이 실행중에 사용자의 요청에 따라 응답을 동적으로 생성하거나 조절하는 것을 말한다.

❓장애격리(Default isolation)
: 특정 서비스에서 오류가 발생해도 다른 서비스에 영향을 미치지 않는 것을 말한다.

🍩 마이크로서비스
: 애플리케이션을 작은 독립적인 서비스로 분할,
각 서비스는 자체적으로 배포, 확장 및 관리
➡️ 확장가능한 아키텍처, 수평적 확장(Scale-out)

🍩 컨테이너 기반 배포
: Docker와 같은 컨테이너 기술을 사용하여
애플리케이션 및 종속성을 하나의 이미지로 패키징하고 배포하기 때문에, 이미지를 빌드 한 후빠른 배포가 가능하다

🍩 자동화 및 오케스트레이션
: 인프라 및 애플리케이션 배포를 자동화하고 관리하기 위해 오케스트레이션 시스템 사용
이를 통해 인프라 리소스를 효율적으로 사용할 수 있다.

🍩 Cloud Native Data Storage
: 분산 데이터 스토리지 및 데이터베이스 사용

🍩 모니터링 및 로깅
🍩 보안

𖠃 12 Factors
클라우드 기반 애플리케이션의 설계와 개발을 지침하는 12가지 원칙

🎃 1. 코드베이스(Codebase, 전체 소스코드 집합)
소스코드와 구성을 하나로 유지하면서(단일 코드베이스) 다양한 실행환경(개발, 테스트, 스테이징, 배포)에서
해당 애플리케이션을 배포하고 운영해야 한다

🎃 2. 의존성(Dependencies)
의존성 관리도구를 사용하여 패키지를 격리해야한다.
프로젝트에서 필요한 외부 라이브러리와 모듈의 의존성 관리프로젝트 내 격리된 환경에 설치하는 것을 말한다.
이렇게 하면, 애플리케이션 간의 충돌을 방지할 수 있다.

🎃 3. 환경설정(Configuration)
설정정보를 코드 외부에 저장하고 각 환경별로 설정을 분리하여 관리하고, 설정이 적용된 후 자동배포 한다.

🎃 4. 배포(Backing Services)
백엔드 서비스는 분리되어 외부 서비스로 독립적으로 관리되야 한다.
필요에 따라 별도로 확장할 수 있으니, 🧩 확장 및 유지보수를 쉽게하도록 만든다.

백엔드 서비스
: 데이터베이스, 메시지큐, 캐시서버, 외부 API 서비스와 같은 리소스
⚠️ 백엔드 서비스는 애플리케이션을 배포하기 위한 리소스로 사용된다.

🎃 5. 빌드, 릴리스, 실행(Build, Release, Run)
빌드 단계릴리스 단계명확하게 분리하여, 빌드한 애플리케이션여러번 실행환경에서 실행할 수 있어야 한다.

빌드(Build)
: 소스코드 및 관련 리소스컴파일하고 결합하여
실행가능한 소프트웨어 패키지 or 실행파일을 생성하는 과정을 말한다.

릴리스(Release)
: 빌드된 애플리케이션사용자에게 제공하기 위한 과정을 말한다.
빌드된 실행파일, 관련문서, 설정파일 등이 패키징되어 배포된다.

🎃 6. 프로세스(Processes)
애플리케이션은 stateless하게 설계되어야 하며,
프로세스는 상태를 공유하지 않아야 한다.
⚠️ 모든 상태정보외부 스토리지에 저장한다.

🎃 7. 포트바인딩(Port Binding)
애플리케이션은 서비스를 위한 포트동적으로 할당받아 사용해야 한다.
환경변수 또는 서비스 디스커버리 매커니즘을 통해 할당받은 포트에 연결한다.
⚠️ 각각의 마이크로서비스서로 다른 포트에서 동작해야 한다.

🎃 8. 동시성(Concurrency)
애플리케이션은 여러 프로세스확장 가능하게 설계되어야 한다.

🎃 9. 처리(Disposability)
애플리케이션은 빠른 시작정상 종료를 지원해야 하며
프로세스 간 상태 공유나 세션을 피해야 한다.

🎃 10. 개발환경(Dev/Prod Parity)
개발, 테스트, 스테이징, 프로덕션 등 각 환경에서 최대한 유사한 환경을 유지하며 배포해야한다.

🎃 11. 로깅(Logging)
로그 파일을 사용하여 이벤트와 상태정보를 기록하거나
이벤트 스트림으로 출력해야 하고, 서비스가 중단되어도 로그는 정상적으로 동작해야 한다.

🎃 12. 관리 프로세스(Admin Processes)
데이터베이스 마이그레이션, 캐시 비우기 등 관리작업스크립트 또는 프로세스로 실행할 수 있어야하며,
이는 애플리케이션과 분리된다.

+ 3 factors

🎃 13. API First
먼저 API부터 고민하면서 개발해야 한다.

🎃 14. Telemetry
모든 지표는 수치화, 시각화되어 관리할 수 있는 항목이어야 한다.

🎃 15. Authentication and authorization
마이크로서비스인증 및 인가가 필요한 리소스에 대해서 적절한 인증 및 인가가 이루어져야 한다.
Comments