카샤의 만개시기

마이크로서비스 시작하기 (2편) - 12요소 방법론 본문

Java/MSA

마이크로서비스 시작하기 (2편) - 12요소 방법론

SKaSha 2019. 6. 13. 01:15

12요소 방법론이란 허로쿠(Heroku) 클라우드 플랫폼을 만든 창시자들이 정립한 방법론으로써 어플리케이션을 만들때 필요한 여러가지 근본적인 핵심 사상을 정리한것입니다.
그렇다면 12요소 어플리케이션의 실천법에 대하여 알아보도록 하겠습니다.

1. 코드베이스 (Codebase)

어플리케이션은 git과 같은 버전 관리 시스템을 통하여 형상관리 되어야하며 코드와 App은 1:1로 매핑되어 동일한 코드를 여러 App이 공유하지 않도록 해야합니다. 공유가 필요한 부분은 모듈화하여 공유하여야 합니다. 하나의 코드베이스는 복수의 환경으로 배포가 가능해야 합니다.

2. 의존관계 (Deoendencies)

의존관계는 패키지 매니저 툴(Java의 경우 Gradle이나 Maven)을 이용하여 명시적으로 표시하고 격리하여야 합니다.

3. 설정 (Config)

하나의 코드베이스는 여러 환경에 배포될수 있어야 한다고 하였으며 환경에 따라 DB나 스토리지 등 설정 정보들이 달라질수 있기 때문에 어플리케이션 구동 시에 설정 정보들이 주입될 수 있도록 해야합니다.

4. 지원 서비스(Backing Services)

DB나 SMTP 등의 지원 서비스들은 필요에 따라 어플리케이션을 통하여 추가되는 자원으로 취급할 수 있습니다.

5. 빌드, 릴리스, 실행 (Build, Release, Run)

어플리케이션은 빌드, 릴리스, 실행 단계를 엄격하게 분리하여 빌드와 배포, 실행을 지속적으로 가능하도록 해야합니다.

6. 프로세스 (Processes)

클라우드 환경에서 서비스는 여러 인스턴스로 구동되며 트래픽에 따라 Auto Scale를 통해 수평적으로 확장됩니다.
그렇기 때문에 프로세스의 축소/확장 혹은 배포나 설정 변경으로 인한 프로세스의 변화에 따라 상태 정보가 손실되지 않도록 무상태 프로세스로 실행되어야합니다.
어플리케이션 간 공유되어야 하는 정보들은 별도의 저장소나 캐시 혹은 ZooKeeper와 같은 분산 코디네이터를 이용해야합니다.

7. 포트 바인딩 (Port Binding)

Tomcat과 같은 WAS를 미리 설치하여 어플리케이션을 띄우는 방식이 아닌 독립적으로 실행 가능한 서비스로 구성되어야 하기 때문에 특정 포트를 이용하는것이 아닌 포트 바인딩을 통하여 서비스가 외부에 제공되어야 합니다.

8. 동시성 (Concurrency)

어플리케이션은 아무것도 공유하지 않으면서 수평으로 확장(Scale out)하는 것을 통하여 동시성을 높여야합니다. 이는 매우 간단하면서도 안정적인 작업입니다.

9. 처분성 (Disposability)

어플리케이션은 장애가 전파되지 않도록 빠르게 종료되어야 하며 빠른 시작을 통하여 서비스의 연속성과 견고함을 극대화해야합니다. 이를 위해 개발자는 시스템의 프로세스 매니저로부터 수신 받는 종료 신호를 통해 Graceful Shutdown을 구현해 주어야 합니다. (스프링의 경우 SIGTERM을 수신하였을 경우 이를 보장합니다)
또한 하드웨어나 네트워크 장애로 인해 타임아웃이 발생되어 정상적인 서비스를 제공할수 없는 경우에는 프로세스를 격리시키거나 리커버리를 통하여 적절한 조치를 취해야 합니다.

10. 개발/운영 짝맞춤 (Dev/prod parity)

개발과 스테이징, 운영은 가능한 한 동일하게 유지하여야 합니다.

11. 로그 (Logs)

모노리스 서비스에서는 로그를 주로 로컬 디스크에 저장합니다. 하지만 서비스가 수평적으로 확장/축소 되는 클라우드 환경에서는 로그를 확인하기 위해 각 인스턴스에 접근하여 확인하는 것이 매우 번거로운 일이기때문에 스트림을 이용하여 처리해야 합니다.

12. 관리 프로세스 (Admin Process)

서비스의 운영 단계에서는 디비 마이그레이션 등의 일회성 작업들이 발생될수 있습니다. 이를 위해서 별도의 프로그램이나 시스템을 만드는것은 불필요하기 때문에 일회성 프로세스를 이용하여 실행해야합니다. 이런 점 때문에 REPL Shell이 제공되는 언어를 선호하는데 Java 역시 9버전부터 REPL Shell을 제공하고 있습니다.

Next

12요소 방법론 세번째 Config에서 어플리케이션 구동 시에 설정 정보들이 주입될 수 있도록 해야 한다고 하였습니다.
다음 챕터에서는 이를 스프링 부트 환경의 어플리케이션에서 어떻게 구현 되는지 알아보도록 하겠습니다.

마이크로서비스 시작하기 (3편) - Spring Cloud Config로 설정 주입

Comments