내용
SaaS을 만들기 위한 방법론으로 독립적인 애플리케이션 운영을 위한 12가지 요소 이다.
Codebase
버전 관리되는 하나의 코드베이스와 다양한 배포
- Git의 main/test/dev 브랜치를 사용한다.
Dependenices
명시적으로 선언되고 분리된 종속성
- package.json과 같은 의존성 관리툴에서 확인이 가능하다.
Config
환경에 저장된 설정
- 모든 설정 정보는 코드로부터 분리된 공간에 저장되어야 하고, 런타임에서 코드에 의해 읽혀야 한다.
- 동일한 코드를 여러 환경에 배포한다.
- 데이터베이스, 외부리소스, 배포마다 달라지는 값 등이 분리되어야한다.
Backing services
백엔드 서비스를 연결된 리소스로 취급
- SaaS의 리소스는 자유롭게 배포에 연결되거나 분리할 수 있고, 코드 수정 없이 전환이 가능해야 한다.
Build, release, run
철처하게 분리된 빌드와 실행 단계
Processes
애플리케이션을 하나 혹은 여러개의 무상태(stateless) 프로세스로 실행
- 인스턴스는 메모리 파일을 공유할 수 없으며, 재실행 될 때 로컬 파일, 세션은 모두 초기화된다.
- 세션 상태 데이터의 경우 Redis에 저장한다.
Port binding
포트 바인딩을 사용해서 서비스를 공개
Concurrency
프로세스 모델을 사용한 확장
- 모든 일을 처리하는 하나의 프로세스 대신 기능별로 분리된 프로세스로 실행한다.
Disposability
빠른 시작과 그레이스풀 셧다운(graceful shutdown)을 통한 안정성 극대화
- graceful shutdown은 프로그램이 종료될 때 최대한 side effect를 내지 않기 위해 로직을 잘 처리하고 종료하는 거이다.
Dev/prod parity
개발, 스테이징, 프로덕션 환경을 최대한 비슷하게 유지
Logs
로그를 이벤트 스트림으로 취급
- 스트림을 버퍼링 없이 stdout, stderr로 출력한다.
- 별도의 로그 저장소를 사용한다.
Admin processes
admin/maintenance 작업을 일회성 프로세스로 실행