12요소 애플리케이션 방법론

- Heroku가 제시한 12 요소 애플리케이션 방법론은 클라우드 환경에서 운영 가능한 가장 현대적인 애플리케이션에서 기대할 수 있는 특징을 기술한 방법론이다.

1. 단일 코드 베이스

- 애플리케이션은 하나의 코드 베이스만 가져야 한다. 개발/테스트/운영 등 여러 개의 인스턴스를 동일한 코드 베이스 기반으로 구성해야 하며, git/svn 과 같은 형상관리를 이용한다. 이 코드 베이스는 다른 마이크로 서비스와 공유되지 않는다.


2. 의존성 꾸러미(Bundling dependencies)

- 애플리케이션에 필요한 모든 의존성은 애플리케이션과 함께 관리되야한다. maven/gradle 을 통해 pom.xml/.gradle 을 통해 명시적으로 의존성을 관리할 수 있으며 최종 실행 파일은 .jar 혹은 .war 파일에 모두 패키징되어야 한다.


3. 환경설정 외부화(externalizing configuration)

- 모든 환경설정 파라미터를 코드와 분리해서 외부화하라고 권고한다.


4. 후방지원 서비스(backend service)

- URL을 통해 접근가능해야 하며, 모든 서비스는 살아있는 동안 외부의 자원과 의사소통할 수 있어야 한다. 마이크로 서비스 세상에서의 API end-point는 일반적으로 REST를 사용하는 HTTP 기반의 end-point이다. 


5. 빌드, 배포, 운영의 격리

- 빌드/배포/운영 단계를 뚜렷하게 격리하는 것이 좋다. 빌드 -> 배포 -> 운영의 방향은 일방향이며 파이프라인을 모두 통과하여야 한다.


6. 무상태, 비공유 프로세스

- 모든 마이크로 서비스는 무상태 기반으로 설계되어야 하며, 상태를 저장해야 할 경우 DB 혹은 인메모리 캐쉬 같은 후방 지원 서비스에서 처리 해야한다.


7. 서비스를 포트에 바인딩해서 노출

- 12요소 애플리케이션은 standalone 이어야 하기 때문에 포트바인딩을 통해 자율적이고 자기 완비적인 특성을 유지해야 한다.


8. 확장을 위한 동시성

- replication(복제)를 통해 프로세스가 확장될 수 있게 설계 되어야 한다.


9. 폐기 영향 최소화

- 구동 및 종료에 필요한 시간을 최소화 하고, 서버가 종료될 때는 종료에 필요한 작업이 모두 수행되는 우아한 방식으로 종료해야 한다. 특히 자동화된 배포의 시간이 오래 걸리면 자동화에 부정적인 요소가 미칠 우려가 있다. 때문에, lazy loading(지연 로딩) 혹은 크기를 가능한 한 작게 유지하는 것이 중요하다.

10. 개발/운영 환경의 동일

- 개발/ 운영 환경은 동일해야 한다. 그렇지 않으면, 개발에서 일어나지 않았던 비정상적인 상황이 운영에서 발생할 수 있다.


11. 로그 외부화

- 로그 파일은 절대 애플리케이션 영역에 담지 않고, 로그 스트림을 통해 중앙 집중화하는 것이 중요하다.


12. 관리자 프로세스 패키징

- 관리에 필요한 코드 및 태스크 또한 애플리케이션과 함께 패키징되고 포함되어야 한다.



'Architecture & Protocol' 카테고리의 다른 글

HTTP2 Protocol 분석  (0) 2019.04.16
Websocket Protocol 분석  (0) 2019.01.28
서비스 지향 아키텍쳐(SOA)  (0) 2018.12.30
마이크로서비스 아키텍처(MSA)  (0) 2018.12.02

+ Recent posts