5.1 구성(그리고 복잡성) 관리
클라우드에서 실행하는 마이크로서비스에서는 마이크로서비스의 인스턴스가 사람의 개입을 최소화하여 신속하게 시작되어야 하므로 애플리케이션 구성을 관리하는 것은 중요하다. 사람이 서비스를 배포하기 위해 수동으로 구성하거나 건드려야 한다면 애플리케이션에서 구성 불일치(configuration drift)나 예기치 않은 장애, 확장 문제 대응을 위한 지연 시간 등이 발생할 수 있다. 앞으로 지킬 네 가지 원칙을 세워 애플리케이션 구성 관리에 대한 논의를 시작해 보자.
• 분리(segregate): 서비스의 물리적 배포에서 서비스 구성 정보를 완전히 분리해야 한다. 실제로 애플리케이션 구성 정보는 서비스 인스턴스와 함께 배포되어서는 안 되며, 시작 중인 서비스에 환경 변수로 전달되거나 서비스가 시작할 때 중앙 저장소에서 읽어 들여야 한다.
• 추상화(abstract): 서비스 인터페이스 뒷단에 있는 구성 데이터의 접근 방식을 추상화해야 한다. 애플리케이션 구성 데이터를 조회하는 데 서비스 저장소(파일 기반 또는 JDBC 데이터베이스 기반)에서 직접 읽어 오는 코드를 작성하기보다 REST 기반 JSON 서비스를 사용해야 한다.
• 중앙 집중화(centralize): 클라우드 기반의 애플리케이션에는 실제로 수백 개의 서비스가 실행될 수 있어 구성 데이터를 보관하는 데 사용되는 여러 저장소 수를 최소화하는 것이 중요하다. 가능한 적은 수의 저장소로 애플리케이션 구성 정보를 모아야 한다.
• 견고화(harden): 애플리케이션 구성 정보는 배포되는 서비스와 완전히 분리되고 중앙 집중화되므로 사용하고 구현할 솔루션은 가용성이 높고 이중화가 필요하다.
명심해야 할 핵심 사항 중 하나는 구성 정보를 실제 코드 외부로 분리할 때 외부 의존성이 생겨서 이를 관리하고 버전 제어한다는 것이다. 애플리케이션 구성을 제대로 관리하지 못하면 탐지하기 어려운 버그와 예기치 않은 장애의 온상이 되기 때문에 애플리케이션 구성 데이터는 추적 가능하고 버전을 제어할 수 있어야 한다고 아무리 강조해도 지나치지 않다.