공부하는 스누피

[MSA] 마이크로서비스란? 본문

CS/소프트웨어 공학

[MSA] 마이크로서비스란?

커피맛스누피 2020. 12. 25. 23:10

마이크로서비스

마이크로서비스는 독자적인 업그레이드와 스케일링이 가능한 독립된 소프트웨어 컴포넌트이다. 

일체형 애플리케이션과는 달리 마이크로서비스는 여러 개의 작은 서버에 배포할 수 있어 애플리케이션을 쉽게 확장하고 빠르게 개발할 수 있다.

 

마이크로서비스가 독립된 컴포넌트로 동작하려면 다음과 같은 기준을 충족해야 한다.

- 아무것도 공유하지 않는 아키텍처를 유지해야 한다. (ex. 데이터베이스의 데이터 공유 x)

- 동기 방식이나 명확한 API를 이용해서만 통신해야 한다.

- 개별적인 런타임 프로세스로 배포해야 한다.

- 마이크로서비스 인스턴스는 stateless하기 때문에 모든 인스턴스가 요청을 처리할 수 있다.

 

각 컴포넌트는 독립된 기능을 수행한다. 각 컴포넌트 간 느슨한 결합이 요구된다.

마이크로서비스 개발은 플랫폼의 각 기능을 독립적인 소프트웨어 컴포넌트로 개발하는 방식으로 이루어진다.

각 컴포넌트는 자체 데이터 저장소가 있으며, 다른 컴포넌트와는 API로 통신한다.

 

각 컴포넌트는 패키징되어 아파치 톰캣과 같은 웹 컨테이너에 배포된다. 이때 배포는 여러 서버에서 이루어질 수도 있다.

2개의 노드(서버)에 서비스를 배포했을 경우

마이크로서비스의 장점

- 플랫폼의 API가 명확해 호환성을 유지하거나 시스템을 통합하기 쉽다.

 

- 컴포넌트를 개별적으로 배포/업그레이드할 수 있다.

 

- 컴포넌트 간 독립성이 보장되어 Scale out이 용이하다.

=> 서버의 앞단에 로드 밸런서를 설정하는 방식으로 스케일링을 수행한다.

ex. 컴포넌트 A, B가 두 개의 노드로 각각 서비스되고 있을 때, 컴포넌트 A의 사용량만 많아질 경우 컴포넌트 A 노드를 하나 더 만든다. 로드밸런서는 컴포넌트 A 요청이 들어왔을 때, 새로 추가된 노드와 기존 노드에 트래픽을 적절히 분배한다.

 

마이크로서비스의 단점

- 컴포넌트의 새 인스턴스(노드)를 직접 추가하려면 수동으로 로드밸런스와 노드를 설정해야 해서 시간이 오래 걸린다.

 

- 어느 한 시스템에서 오류가 발생했을 때 연쇄 장애를 일으킨다. 플랫폼 내부 통신은 대부분 동기식이기 때문에 한 컴포넌트의 중단은 연속적인 오류를 유발한다.

 

- 여러 인스턴스에 대한 모니터링이 복잡하다. 분산 시스템을 형성하게 되어 하드웨어 자원 사용량 분석 또한 어렵다.

 

=> 쿠버네티스같은 컨테이너 오케스트레이터를 사용하면 상용 환경에서 컨테이너를 실행하고 여러 대의 서버로 확장할 수 있다.

=> 서비스 메시(service mesh)를 사용하면 마이크로서비스를 쉽게 관리할 수 있다.

 

 

 

(참고)

Hands-On Microservices with Spring Boot and Spring Cloud (2019). Magnus Larsson. Packet Publishing.

Comments