모놀리식 아키텍처
소프트웨어가 하나의 결합된 코드로 구성되기 때문에 초기에 설계가 용이하다.
개발도 단순하고, 코드 관리도 간편하다.
일단 개발이 단순하고 코드 관리가 간편하다는 것은 엄청난 장점이다.
하지만 서비스 운영중에 수정사항이 많아질 경우, 특정 서비스에서의 수정이 다른 서비스에 영향을 미쳐서 2개의 서비스가 모두 고장나버리는 사태가 발생할 수 있다.
또한 서비스가 점점 성장하면서 기능이 추가될수록 단순했던 서비스간의 관계도가 매우 복잡해 질 수 있다.
만약에 네이버웹툰, 네이버 증시, 네이버 메일, 네이버 페이 등의 서비스들이 모두 모놀리식 아키텍처로 한데 묶여있다고 가정해보자.
위 서비스들은 서로 관련이 전혀 없다고 볼 수 있다. 웹툰이 망가진다고 해서 네이버 메일을 못보내면 말이 안되는 것이다.
이들이 모놀리식으로 구현되었다면?
네이버 증시 서비스에서 잘못된 정보를 바로잡기 위해 코드를 고치는 와중에 테스트에 잡히지 않은 잘못된 코드가 운영서버로 올라가 버렸다. 한동안은 잠잠하다가 어느날 갑자기 문제가 발생했다. (증시 가격이 잘못 설정되어 오버플로우가 일어났는데 테스트에서 못잡았다고 가정하자.) 네이버는 모든 서비스가 모놀리식 아키텍처로 묶여있기 때문에 증시 서비스만 고장났지만 네이버 페이, 웹툰, 메일 등등 모든 서비스가 함께 무너져 버리게 된다. 이게 모놀리식 아키텍처의 주요 단점이다.
서비스의 규모가 커질수록 모놀리식이 아닌 다른 아키텍처 대안이 필요할 것이다.
마이크로서비스 아키텍처
위와 같은 문제를 해결하는 방안으로 마이크로서비스 아키텍처(이하 MSA)가 등장했다.
MSA 전체는 하나의 목적을 지향한다.
하지만 개별 기능을 하는 작은 서비스를 각각 개발해 연결하는데서 모놀리식과 큰 차이를 보인다.
그리고 보안, 인증과 관련된 기능이 독립된 서비스를 구성하게 되고, 다른 서비스들도 모두 독립적으로 동작할 수 있다.
이러한 구조는 초기 설계가 어렵고, 각 서비스가 서로 유기적으로 통신하는 구조이므로 네트워크를 통한 요청이 증가하기 때문에 성능도 아쉬울 수 있다.
하지만 MSA는 개발된 서비스를 재사용하기 쉽고, 향후 서비스가 변경됐을 때 다른 서비스에 영향을 미칠 가능성이 줄어들며 사용량의 변화에 따라 특정 서비스만 확장할 수 있다. 따라서 사용자의 요구 사항에 따라 가용성을 즉각적으로 확보할 수 있는 IaaS(Infra as a Service : ex) AWS EC2) 환경에 적합하다.
MSA는 다음과 같이 구성할 수 있다.
하나의 애플리케이션 안에 포함돼 있던 뉴스, 카페, 웹툰 서비스가 각 서비스와 관련된 기능(크롤러, 웹툰 보안 등)과 DB를 독립적으로 가지는 구조로 표현되었다.
각 서비스는 API 게이트웨이와 REST API를 이용한 통신 방식으로 사용자(외부)의 요청을 전달한다. 서비스 개수는 고정된 것이 아니기 때문에 어떤 서비스가 등록되어 있는지 파악하기 위해 서비스 디스커버리를 사용한다.
또한 수많은 서비스의 내부 통신을 이벤트로 발생시켜 이를 효과적으로 관리하기 위해 별도로 이벤트 버스를 서비스로 구성한다.
서비스 디스커버리
각 서비스별로 서버를 별도로 구성했지만, 대용량 트래픽을 처리하게 되면 로드밸런싱을 하게 될 것이다.
이 서버들은 각자 다른 IP와 port를 가지고 있을 것이다.
이러한 서로 다른 서비스들의 IP와 port 정보를 서비스 레지스트리에 저장하고 매핑해주는 역할을 서비스 디스커버리 라고 한다.
대표적인 서비스 레지스트리는 다음과 같다.
- k8s etcd
- consul
- Apache ZooKeeper
이벤트 버스
'이벤트 큐' 또는 '메시지 브로커'라고도 할 수 있다.
클라이언트의 요청, 서비스에서 서비스로의 데이터 전송, 서비스에서 클라이언트로의 응답들이 이벤트 버스를 통해서 전달된다. 이벤트를 생성하는 자를 프로듀서, 이벤트를 받아서 사용하는 자를 컨슈머라고 한다.
대표적인 이벤트 버스는 다음과 같다.
- RabbitMQ
- Apache Kafka
- Amazon EventBridge
'Back-End > MSA' 카테고리의 다른 글
[Cloud Native] 분산 시스템의 기초 개념들 (3) | 2022.11.05 |
---|---|
[MSA] 리액티브 마이크로 서비스 패턴 (0) | 2022.05.18 |
RabbitMQ, Redis, Kafka의 특징 (0) | 2022.01.18 |
MSA(MicroService Architecture)에 대한 내 생각 한 줌 (6) | 2022.01.05 |