MicroService Achitecture, MSA
누군가가 어떤 서비스를 개발하고 싶냐는 질문을 했었는데 그 때 간단하게 예전에 본 흥미로웠었던 B2C 서비스를 얘기했더니 MSA 에 대해서 공부를 해보라는 얘기를 들었다. 처음 들어본 용어라서 바로 무엇인지 물어봤더니 하나의 서비스를 독립적인 서비스로 분리하는 방식을 의미한다고 했다. 독립적으로 분리한다? WAS 와 WS 가 분리되어 있는 지금의 상태가 MSA 아닙니까 라는 질문에 WAS 를 더 작은 독립적인 단위로 쪼갠다는 얘기를 해줬다.
현재 내가 개발하고 있는 아키텍처 와는 좀 다른 형태로 구성을 한다는 것인데 궁금해졌다.
Monolithic Architecture, 모놀리식 구조 애플리케이션
현재 우리 시스템을 간략하게 설명해보면 위와 같은 구조로 확인이 된다. 전통적인 개발 방식으로써 모놀리식 아키텍처 라고 불리우는데 모놀리식 아키텍처는 하나의 애플리케이션을 단일한 코드베이스로 개발하고 배포하는 아키텍처이다. 이 아키텍처에서는 애플리케이션의 모든 컴포넌트가 동일한 코드베이스에 포함되어 있으며, 여러 개의 서비스나 모듈로 구성된 분산 시스템과는 달리, 모든 기능이 하나의 애플리케이션 내에서 구현된다. 애플리케이션 전체가 하나의 프로세스 내에서 실행되므로, 서로 다른 모듈이나 컴포넌트 간의 통신은 메모리 내에서 발생하기에 분산 시스템에서 발생할 수 있는 통신 비용이나 지연 시간 등의 문제를 해결할 수 있지만, 애플리케이션 규모가 커질수록 유지보수가 어려워질 수 있다는 단점이 있다. 그럼 좀더 깊게 장단점을 확인해보자.
모놀리식 구조의 장 단점
장점
- 개발 및 배포가 쉽다. 하나의 코드베이스에서 작업하기 때문에 개발자들이 전체 시스템을 이해하기 쉬우며, 배포도 간단하게 이루어진다.
- 단일 코드베이스를 사용하기 때문에 통합 테스트와 디버깅도 용이하다.
- 효율적인 메모리 사용과 빠른 실행 속도를 가진다. 애플리케이션 전체가 하나의 프로세스 내에서 실행되기 때문에, 서로 다른 모듈이나 컴포넌트 간의 통신이 메모리 내에서 발생하므로 분산 시스템에서 발생할 수 있는 통신 비용이나 지연 시간 등의 문제를 해결할 수 있다.
단점
- 규모가 커질수록 유지보수와 확장이 어렵다. 코드의 복잡성이 증가하면서 개발 및 배포 시간도 길어지고, 성능 문제도 발생할 수 있다.
- 모듈 간의 독립성이 부족해진다. 애플리케이션 전체가 하나의 코드베이스에 의존하기 때문에, 하나의 모듈이 문제를 일으키면 전체 애플리케이션이 영향을 받을 수 있다.
- 기술 스택 변경이 어렵다. 모놀리식 아키텍처에서는 전체 애플리케이션이 하나의 기술 스택에 의존하기 때문에, 새로운 기술을 도입하거나 업그레이드하는 것이 어렵다.
MicroService Architecture, MSA 구조 애플리케이션
MSA 는 기존의 아키텍처와는 다르게 여러 개의 작은 서비스로 구성된 애플리케이션을 구축하는 방법이다. 각 서비스는 독립적으로 구현되고 배포되며, 서비스 간에는 API (Application Programming Interface)를 통해 통신하는것이 기본이다.
MSA에서 각 서비스는 작은 규모로 구성되어 있으며, 특정 업무나 기능을 수행하는데 이러한 작은 서비스를 조합하여 전체 애플리케이션을 구성하게 된다. 각 서비스는 완전히 분리된 형태로 동작하며, 서로 독립적으로 배포 및 스케일링이 가능 하기에 이를 통해 개발자는 더 빠르게 애플리케이션을 개발하고, 서비스 단위로 유연한 확장이 가능하며, 장애 상황에서도 영향을 최소화할 수 있다.
MSA 구조의 장 단점
장점
- 각각의 서비스는 독립적으로 배포, 관리 (스케일링 등)할 수 있기 때문에 높은 확장성과 유연성을 가질 수 있다.
- 각각의 서비스가 서로의 서비스에 종속적이지 않기 때문에 하나의 서비스에 독립적 기술 스택을 적용할 수 있어 기술의 다양성을 보장한다.
- 단일 서비스의 장애가 전체 시스템에 영향을 주지 않아서 서비스의 가용성이 높아진다.
- 작은 단위의 서비스를 개발하기에 개발 주기가 빨라진다.
단점
- 많은 서비스 간의 상호작용이 필요하므로 분산 시스템의 복잡성이 증가한다.
- 여러 개의 서비스에서 공유하는 데이터 일관성을 유지하는 것이 어려워 진다.
- 여러 개의 서비스를 운영하고 관리하는 것이 어려울 수 있다.
- 분산된 환경에서 통합 테스트와 디버깅이 어려울 수 있다.
정리
맨 처음 이 분산 시스템에 대해서 생각해 봤을때 독립적으로 운영되면 서비스 관리하기가 편할것 같다는 생각도 하기는 했지만 실제로 데이터 베이스의 ACID를 유지하는 부분은 매우 힘들 수도 있겠다는 생각도 들었다.
여러 개의 작은 서비스가 분산되어 동작하게 되므로 각각의 서비스에서 발생하는 데이터 변경 작업들이 전체 시스템에 올바르게 반영이 되어야 하는데 이를 위해서는 트랜잭션 관리가 중요하고 이런 부분을 확실히 인지해서 잘 설계하는것이 핵심이라는 생각이 든다.