마이크로서비스란 작고, 독립적으로 배포 가능한 각각의 기능을 수행하는 서비스로 구성된 프레임워크라고 할 수 있다. 마이크로서비스는 완전히 독립적으로 배포가 가능하고, 다른 기술 스택(개발 언어, 데이터베이스 등)이 사용 가능한 단일 사업 영역에 초점을 둔다.
MSA와 Monolithic의 비교
Monolithic Architecture는 소프트웨어의 모든 구성요소가 한 프로젝트에 통합되어 있는 형태이다. 웹 개발을 예로 들면 웹 프로그램을 개발하기 위해 모듈별로 개발을 하고, 개발이 완료된 웹 어플리케이션을 하나의 결과물로 패키징하여 배포되는 형태를 말한다. 이런 어플리케이션을 모놀리식 어플리케이션이라 한다.
주로 소규모 프로젝트에서 사용된다.
하지만 일정 규모 이상의 서비스, 혹은 수백명 이상의 개발자가 투입되는 프로젝트에서 Monolithic Architecture는 한계를 보인다.
부분 장애가 전체 서비스의 장애로 확대될 수 있다.
부분적인 *Scale-out(여러 server로 나누어 일을 처리하는 방식)이 어렵다.
Monolithic Architecture에서는 사용되지 않는 다른 모든 서비스가 Scale-out되어야 하기 때문에 부분 Scale-out이 어렵다.
서비스의 변경이 어렵고, 수정 시 장애의 영향도 파악이 힘들다.
여러 컴포넌트가 하나의 서비스에 강하게 결합되어 있기 때문에 수정에 대한 영향도 파악이 힘들다.
배포 시간이 오래 걸린다.
한 Framework와 언어에 종속적이다.
이러한 Monolithic Architecture의 문제점들을 보완하기 위해 MSA가 등장하게 되었다. 기존의 특정한 물리적인 서버에 서비스를 올리던 on-promise 서버 기반의 Monolithic Architecture에서 이제는 클라우드 환경을 이용하여 서버를 구성하는 MicroService Architecture로 많은 서비스들이 전환되고 있다.
MSA는 API를 통해서만 상호작용할 수 있다. 즉, 마이크로 서비스는 서비스의 end-point(접근점)을 API 형태로 외부에 노출하고, 실질적인 세부 사항은 모두 추상화한다. 내부의 구현 로직, 아키텍처와 프로그래밍 언어, 데이터베이스, 품질 유지 체계와 같은 기술적인 사항들은 서비스 API에 의해 철저하게 가려진다.
복잡성 증가
팀 간 협업 어려움
배포 복잡성
분산 시스템 관리
데이터 일관성 유지
성능 문제
-MSA에서는 서비스 간의 네트워크 통신이 증가하므로, 성능 문제가 발생할 수 있습니다. 또한, 각 서비스가 독립적으로 확장될 수 있지만, 전체 시스템의 성능을 최적화하는 것이 어려울 수 있습니다.
최종 프로젝트에서 제대로된 MSA는 아니였지만 경험을 해보면서 느낀점이라고하면 많이 복잡해 팀원들과 소통하고 서비스들의 정상 작동을하고있는지 확인하고 문제가 있다면 파악하는데 시간이 많이 소요되었던거 같다. 또한 각각 분산되어있는 서비스에 통신과 환경변수 공통 라이브러리 같은 설정도 고민해봐야한다. MSA사용방법이나 후기는 다음 포스트에 더 자세하게 다뤄보도록 해야겠다.