티스토리 뷰

Study

[ MSA ] 12 Factor App 정리

후늬뉨 2021. 1. 19. 09:03

최근 MSA라는것에 대해 공부하다가 cloud native한 application을 개발할때 참고할 수 있는 12Factor App이라는것에 대해서 알게 되었다. 12개항목들이 무엇인지 공부하고 간단하게 정리해본다.

 

1. 코드베이스
-코드와 app 사이에는 1:1 관계가 성립해야함, 1개의 코드베이스에서 여러개의 앱(서비스)을 배포해선 안된다.
-SVN, GIT과 같은 VCM을 이용하여 코드 관리
-마이크로서비스마다 코드베이스를 가짐, 다른 마이크로서비스와 공유되지 않음
-공유가 필요한 코드는 라이브러리화해서 공유

2. 종속성(의존성)
-app의 의존관계는 명시적으로 선언되어야 함 (maven인 경우 pom.xml, gradle인 경우 build.gradle, node인 경우 npm)
-모든 라이브러리는 central - maven repository, nexus 와 같은 라이브러리 저장소에서 내려받을수 있어야함

3. 설정
-설정정보는 app 코드에 저장하지 않고, 환경설정파일로 분리해서 사용해야 함 (표프 템플릿경우 : globals.properties)
-로컬,개발,운영환경별 설정파일로 분리하여 사용하는것이 좋음
-MSA에서는 설정정보를 외부중앙서버에서 별도로 관리

4. 백엔드 서비스
-app에서 네트워크로 접근하여 이용하는 모든서비스를 연결된 리소스로 취급
-rest api, db, cache, smtp, mq등등
-예로 mysql을 사용하다가 app의 코드변경없이 설정변경만으로 oracle을 사용할 수 있어야 함 (jpa 의 dialect같은것)

5. 빌드,릴리즈,실행
-코드베이스는 3단계를 거쳐 배포로 변환된다.
빌드 : 라이브러리와 소스를 내려받아 컴파일하여 하나의 패키지를 만듬 (예 : jar, war 파일 생성)
릴리스 : 빌드된 패키지에 환경설정 정보를 조합 (예 : dockerfile을 이용하여 이미지 생성, 버전별로 기록되어 롤백가능)
실행 : 릴리스에서 만들어진 결과물을 실행환경에서 애플리케이션을 실행 (예 : dockerimages를 내려받아서 컨테이너로 실행)

6. 프로세스 (stateless 프로세스)
-애플리케이션을 하나 혹은 여러개의 무상태(stateless) 프로세스로 실행 (수평확장, 무상태)
-무상태 장점 : 수평확장하기에 용이하기 때문에 장애 대응성이 좋아짐 
-상태유지가 필요한 데이터는 DB나 인메모리캐쉬같은 백엔드서비스를 이용하여 처리함

7. 포트 바인딩
- 실행환경에서 app을 실행할때 특정 WAS에 의존적이지 않고 (예 : php 경우 apache에 의존적, jsp 경우 tomcat등 was에 의존적)
- 내부에 tomcat과 같은 서블릿 컨테이너를 내장시켜 단독실행가능한 app으로 만들어야함. (예 : spring boot)

8. 동시성
수직확장이 아니라 수평확장을 통한 동시성을 말함(프로세스 복제, 동일서버증설)
webapp 계층을 무상태계층으로 개발하면 상태를 가지지 않으므로 수평확장/축소를 자유롭게 할수 있음. (예 : jwt 인증)

9. 폐기 가능
-중지될때 진행중이던 프로세스는 모두 완료되어야 함 (graceful shutdown 지원)
-가능한 빠른시간내에 시작/종료되어야 함 (마이크로서비스를 작은 규모로 유지)

10. 개발/프로덕션 환경 일치
- 배포환경의 차이는 크게 3가지
- 1. 시간의 차이 (배포 간의 간격 : 몇 주 vs 몇 시간)
- 2. 담당자의 차이 (코드 작성자와 코드 배포자 : 다른사람 vs 같은사람)
- 3. 툴의 차이 (개발 환경과 production 환경 : 불일치 vs 최대한 유사함)
=> 개발환경과 배포환경을 최대한 동일하게 유지하는것을 중요하게 생각함

11. 로그
-원문에서는 app은 로그파일을 작성하거나 관리하려해선 안되고, 로그를 버퍼링없이 표준출력(stdout)에 출력하라고 되어 있음.
-log4j같은 라이브러리를 이용해서 파일로 쓰는 것은 I/O 병목현상을 일으킬수 있어서 위반, 단 console에 쓰는것은 OK. (내가 이해한게 틀릴수 있음)
-로그중앙화 : Fluentd, Logstash등의 로그수집기를 이용하여 로그중앙집중화

12. Admin 프로세스
-일회성 admin 프로세스는 실제 서비스하는 운영환경에서 실행돼야 함. (flyway 와 같은 마이그툴 사용)
-여기서 말하는 일회성 admin 프로세스는 데이터 마이그레이션 script 또는 코드, shell script등을 말함
-일회성 처리를 위한 기능들도 코드베이스와 함께 관리하고 배포되어야 함
-이런 점 때문에 12FactorApp 에서는 REPL Shell이 제공되는 언어를 선호 (일회성 스크립트 작성에 유리)
-Java 9버전부터 REPL Shell을 제공

이렇게 12 Factors Rule에 대해서 알아보았다.
지금은 100% 이해가 되지 않는 부분들이 있을수 있지만, 꾸준하게 MSA에 대한 관심을 가지다보면 깊이 이해할 날이 오리라 믿는다.
이 규칙들을 무조건 지켜야하는것은 아니겠지만 Cloud 환경에서 확장성 높은 애플리케이션을 개발하기 위해서 참고하기에 훌륭한 가이드라고 생각한다.

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함