본문 바로가기

Server

[Spring] 마이크로서비스 아키텍쳐 (Micro Service Architecture, MSA)

모놀리식 아키텍처

모놀리식 아키텍처는 하나의 시스템이 서비스 전체 기능을 처리하도록 설계한 방법이다. 그렇기 때문에 전반적으로 서비스 구조가 매우 간단하며 이 간단한 구조 덕분에 시스템 운영과 개발이 편리하다는 장점이 있다. 소규모 개발 팀이 비교적 간단하고 작은 기능을 제공하는 서비스를 개발할때 효율적이다.

장점

  • 개발자는 하나의 데이터 저장소에 하나의 애플리케이션만 개발하면 되므로 데이터를 처리하는 일에만 집중하면 된다.
  • 하나의 서비스안에서 클래스들간에만 데이터를 주고 받으면 되기 때문에 데이터가 유실될 걱정이 없다. (MSA 방식은 분산된 서비스들 간에 데이터를 주고받아야 하기 때문에 네트워크를 통해 전송된다.)
  • 시스템 장애나 기능에 버그가 생기면 하나의 애플리케이션에서만 원인을 파악하면 되기 때문에 고치기 쉽다.
  • 데이터 저장소가 하나이므로 트랜잭션 기능을 쉽게 사용할 수 있으며 일관성을 유지하기 쉽다.
  • 테스트 환경을 쉽게 구성할 수 있으며, 유닛 테스트나 통합 테스트를 작성하기 편하다.

단점

모놀리식 방식은 구조가 간단하지만 서비스 규모가 커지면 하나의 애플리케이션 서버에서 여러 기능을 제공해야 하므로 오히려 구조가 복잡해질 수 있다. 뿐만 아니라 서비스 확장 측면에서 단점이 명확하다. 예를 들어 하나의 애플리케이션 서버가 상품 조회 기능과 상품 검색 기능을 모두 처리한다고 가정하고 호출 비율은 상품 조회가 10배 많다고 가정하자. 이럴 경우 상품 조회 기능만 서비스를 확장하면 될텐데 모놀리식 방식은 서버가 하나이기 때문에 잘 사용하지 않는 기능까지 확장하게 되고 그렇게 되면 리소스가 낭비가 발생할 수 있다.

마이크로서비스 아키텍처

마이크로서비스 아키텍처는 분산 시스템 아키텍처 중 하나로 서비스 전체 기능을 독립된 작은 단위로 나누어 분리하고, 각각의 컴포넌트는 독립된 시스템 형태로 개발하고 운영한다. 이렇게 기능단위로 분리된 애플리케이션들을 마이크로서비스라고 하고 미리 정의된 인터페이스를 통해 서로 유기적으로 동작한다. 아래는 마이크로서비스 어키텍처가 갖는 특징들이다.

  • 잘 분리된 마이크로서비스로 인한 탈중앙화
  • 대규모 시스템을 위한 아키텍처
  • 가벼운 네트워크 프로토콜
  • 느슨한 결합
  • 서비스지향 아키텍처

장점

  • 독립성, 기능단위로 독립된 마이크로서비스들간의 간섭이 최소화된다.
  • 각각의 마이크로서비스는 독립된 데이터 저장소를 갖고 있기 때문에 대용량 데이터를 저장하고 처리하는 데 용이하다.
  • 기능단위로 분리되어있기 때문에 배포주기가 빠르다.
  • 마이크로서비스 단위로 확장할 수 있어 서비스 전체적으로 확장성이 좋다. 또한 필요한 마이크로서비스만 확장할 수 있어 효율적으로 시스템 자원을 사용할 수 있다.
  • 사용자 반응에 따라 서비스를 고도화하거나 제외할 수 있기 때문에 사용자 반응에 민첩하게 대응할 수 있다.
  • 특정 서비스에 장애가 발생해도 다른 서비스에 영향을 주지 않는다. (잘 설계되고 독립되어있다고 가정)

단점

  • 진입장벽이 높다. 기능별로 분리된 서비스들이 네트워크상에 분산되어 있어 여러 상황을 고려해야 한다. 특히 각각의 서비스가 독립된 데이터 저장소를 가지고 있기 때문에 데이터 정합성을 보장하기 어렵다.
  • 운영하기 매우 어려운 아케텍처다.
  • 서비스가 분산되어있기 때문에 에러가 발생했을때 에러 지점을 찾기 어렵다. 또한 서비스간에 의존성을 가지고 있는 경우 하나의 서비스에서 에러가 발생했을때 연쇄적으로 다른 서비스에도 영향을 미칠 수가 있다.
  • 설계하기 매우 까다롭다. 앞의 단점들을 보면 분산된 서비스들간의 관계에서 발생하는 경우가 많다. 그렇기 때문에 설계단계에서 잘 설계해야지 그렇지 않으면 오히려 모놀리식 방식보다 유지보수하기 어려워질 수가 있다.
  • 여러 마이크로서비스를 운영해야하기 때문에 자동화된 시스템이 필요하다. 이런 자동화된 시스템들을 운영하고 유지 보수하는 것도 쉬운일은 아니다.

정리하면 마이크로서비스들은 각각 다른 마이크로서비스에서 독립적으로 구성되어야 하며 서로 의존성을 최소화해야한다. 뿐만아니라 기능과 성격에 맞게 잘 분리되어야하며 너무 작게 혹은 너무 크게 설계되어서는 안된다.

 

이렇게 마이크로서비스 아키텍처는 장점도 많지만 단점도 많은 아키텍처이다. 그렇기 때문에 적절한 상황에 마이크로서비스 아키텍처를 적용 해야한다. 만약 다음과 같은 상황에 처해있다면 마이크로서비스 아키텍처를 적용해보는 것을 고려해보자.

  • 클라이언트 요청이 점점 많아지는데 로드 밸런서로 확장해도 한계가 있을 때
  • 데이터베이스 성능을 높여도 더 이상 성능 개선의 여지가 없을 때
  • 기능 확장 요구가 많지만 현재 시스템 구조로 불가능할 때
  • 소스 코드가 너무 복잡해서 리팩토링이 필요할 때
  • 기능 중 하나라도 변경되면 전체 QA를 해야 할 때
  • 기능을 수정하면 다른 기능에 연쇄적으로 버그가 발생할 때
  • 개발자는 늘었는데, 개발 속도는 이전 같지 않을 때

'Server' 카테고리의 다른 글

Docker 컨테이너로 젠킨스 설치하기  (0) 2023.02.03
도커  (0) 2023.01.03