모놀리식 아키텍처 (Monolithic Architecture)
하나의 큰 목적이 있는 서비스 또는 애플리케이션에 여러 기능이 통합돼 있는 구조.
소프트웨어가 하나의 결합된 코드로 구성되기 때문에 초기 단계에서 설계하기에 용이하고, 개발이 좀 더 단순하고 코드 관리가 간편하다.
하지만 서비스나 기능에 대한 수정 사항이 많을 경우, 하나의 기능을 수정할 때 연관된 다른 서비스 혹은 기능에 영향을 미칠 가능성이 커진다. 그리고 서비스나 기능이 점점 추가될수록, 처음에는 단순했던 서비스 간의 관계가 매우 복잡해질 수 있다.
마이크로서비스 아키텍처 (Microservices Architecture - MSA)
각각의 서비스 혹은 기능을 각각 개발하고, 연결함으로써 하나의 큰 목적을 달성하는 방식. 예를 들어 보안, 인증, 컨텐츠 등의 서비스들이 각각 독립적으로 개발되고 유지되면서, 서로 연결되어 하나의 큰 서비스를 구축한다.
이러한 구조는 개발된 서비스나 기능을 재사용하기 쉽고, 수정사항이 생겼을 때 다른 서비스에 영향을 미칠 가능성이 모놀리식 아키텍처보다는 적다는 강점이 있다. 더불어 특정 서비스의 사용량이 늘어날 경우, 해당 서비스에 대한 가용성 확장만도 가능하기 때문에 효율적, 그리고 경제적인 면이 있다.
하지만 마이크로서비스 아키텍처는 모놀리식 아키텍처보다 복잡도가 높고, 각 서비스간 네트워크를 통한 호출 횟수가 증가하면서 성능에 영향을 줄 수 있다는 점이 있다.
마이크로서비스 아키텍처의 구성
API 게이트웨이
각 서비스와 유저 인터페이스 간의 요청과 응답을 전달하는 기능을 전담하는 컴포넌트. 서비스와 인터페이스간 뿐만 아니라 각 서비스간의 통신도 담당한다.
서비스 디스커버리
시스템에 어떤 서비스가 등록돼 있는지를 파악하기 위한 컴포넌트. MSA에 구성되어있는 서비스들은 각기 다른 IP와 PORT를 가지기 때문에, 이러한 서비스들에 대한 정보를 저장하고 관리하는 존재가 필요하며, 이게 바로 서비스 디스커버리이다.
하나의 시스템에 속한 서비스의 개수가 많아질 수록, 그리고 각 서비스나 기능에 대한 수정사항이 많아질 수록 이러한 서비스들과 기능의 위치를 알려주고, 각 서비스들이 서로를 찾고 통신할 수 있도록 관리해주는 서비스 디스커버리와 같은 존재가 필요하다.
패턴 | 설명 | 예시 |
---|---|---|
클라이언트사이드 디스커버리 Client-Side discovery |
클라이언트가 서비스 인스턴스의 네트워크 위치를 찾고 로드밸런싱 하는 방식 | - Netflix Eureka & Netflix Robbon |
서버사이드 디스커버리 Server-Side discovery |
서버 쪽에서 디스커버리 로직을 구현한 방식 | - aws ELB - 구글 로드 밸런서 |
이벤트 버스
이벤트 버스란, 이벤트를 수신하여 0개 이상의 목적지 또는 대상에 전달하는 라우터를 지칭한다. 시스템 내에서 이벤트를 전달하고 관리하며, 이를 통해 서비스 간의 비동기 통신이 가능해진다. 이벤트 버스의 도입으로 서비스 간의 결합도를 낮추고, 확장성과 유연성을 높일 수 있다.
Reference
컨테이너 인프라 환경 구축을 위한 쿠버네티스/도커 (조훈, 심근우, 문성주 저)
서비스 디스커버리 : https://gimmesome.tistory.com/227
서비스 디스커버리 패턴 : https://www.msaschool.io/operation/design/design-six/
이벤트 버스 : https://docs.aws.amazon.com/ko_kr/eventbridge/latest/userguide/eb-event-bus.html