대부분의 마이크로서비스 아키텍처에서는 메시지 큐를 활용한 비동기 패턴을 사용한다. 모놀리식 아키텍처에서 사용자가 증가함에 따라 데이터의 처리량도 많아지게 되면서 애플리케이션의 서비스 단위로 분리하기 시작했다. 그럼 다음과 같은 문제가 발생할 수 있다. 서비스는 분리시켰지만 데이터베이스는 어떻게 하지? 동일한 데이터베이스를 사용하도록 해야 하나? 데이터베이스도 분리한다면 동기화 문제는 어떻게 처리해야 하지? 등등의 문제가 발생한다. 동일한 데이터베이스를 사용할 경우 트랜잭션과 Isolation level에 관한 문제가 발생할 수 있어 결국은 문제가 되기에 결국 분리시켜야 한다. 이때 활용할 수 있는 기술이 Message Queue이다. Message Queue는 분산시스템에서 동기화 문제를 해결하는데 도움을 준다. 아래에서 메시지 큐에 대해 자세히 알아보자
메시지 큐란?
메시지 큐는 프로세스 또는 서로 다른 컴포넌트 간에 비동기적으로 메시지를 교환하는데 사용되는 중간 매개체이다. 데이터나 이벤트 등의 메시지를 Producer(생산자)로부터 받아 Consumer(소비자)에게 전달하는 역할을 한다. 메시지 기반의 통신을 지원하는 이러한 형태는 메시지 지향 미들웨어(Message Oriented Middleware: MOM) 기반 시스템이라고 하는데 아래에서 추가적으로 설명해 보도록 하겠다.
메시지 큐의 주요 목적
- 시스템 간 직접 연결되거나 종속되지 않고 데이터를 교환할 수 있도록 하기 위함 → 결합도를 낮춤
- 프로세스 간 통신을 안정적으로 제공할 수 있고, 언제든 확장이 가능함
- 메시지 큐를 독립적으로 관리하기에 발신자와 수신자가 동기화되지 않았을 경우 메시지 버퍼를 유지할 수 있음
메시지 지향 미들웨어(Message Oriented Middleware)[참고]
미들웨어 : 응용 프로그램과 OS 사이, 또는 네트워크 상에서 서로 다른 응용프로그램이 통신할 수 있도록 지원하는 소프트웨어로 분산 시스템 환경에서 서비스하는 애플리케이션들을 보다 효율적으로 통신할 수 있도록 도와주는 소프트웨어를 일컫는다.
메시지 지향 미들웨어는 분산시스템에서 메시지 기반의 통신을 지원하기 위한 소프트웨어 미들웨어이다. MOM은 비동기적인 메시지 교환을 중심으로 설계되어 있으며, 각 컴포넌트는 메시지를 생성하고 처리하는 독립적인 역할을 수행한다. 이러한 메시지 중심의 통신은 컴포넌트 간의 결합성을 낮추고, 확장성과 유연성에 뛰어나다.
- 비동기 방식의 메시지 전달
- 메시지를 생성하는 Producer와 소비하는 Consumer로 구성
- 보관 : 메시지의 백업을 유지함으로써 지속성을 제공, 덕분에 송수신 측은 동시에 네트워크 연결을 유지할 필요가 없음
- 라우팅 : 미들웨어 계층 자신이 직접 라우팅이 가능하기 때문에, 하나의 메시지를 여러 수신사에게 배포가 가능해짐(멀티캐스트)
- 변환 : 송수신 측의 요구에 따라 메시지를 변환할 수 있음
메시지 큐 시스템의 핵심 구성요소
▷ Message Producer
메시지 큐에 메시지를 생성하고 보내는 역할. Producer는 공유할 데이터를 생성하는 시스템 내의 모든 애플리케이션, 컴포넌트일 수 있음
▷ Message Queue
자료구조의 일종으로 Consumer가 메시지를 처리할 때까지 저장하거나 관리한다. Producer와 Consumer 사이의 버퍼, 중재자 역할을 함
▷ Message Consumer
메시지 큐에서 메시지를 검색하고 처리하는 역할. 여러 Consumer들은 동시에 메시지를 읽을 수 있음
▷ Message Broker(Optional)
몇몇 메시지 큐 시스템에는 메시지 브로커가 존재하는데, 메시지 생산자와 소비자 사이에서 메시지 라우팅, 필터링, 메시지 변환 등의 일을 하는 중재자 역할을 한다.
메시지 큐는 왜 필요할까?
1. 모놀리식 아키텍처에서 마이크로서비스 아키텍처(MSA)로의 변환
현재 많은 서비스에서 모놀리식 아키텍처에서 마이크로서비스 아키텍처로 마이그레이션 하는 추세이다. 모놀리식 아키텍처의 경우 어느 정도 한계가 존재한다. 해당 아키텍처의 경우 거대한 코드 베이스로 이루어져 있어, 특정 서비스의 변경이 전체 시스템에 미치는 영향이 크다. 그리고 새로운 기능을 추가 또는 업데이트할 때 배포하기 어렵고, 느린 배포 주기를 가지고 있다. 또한 특정 서비스에 사용자가 늘어나게 되면 해당 서비스만의 확장이 불가능하고, 전체 애플리케이션을 확장해야만 한다. 이러한 단점 때문에 MSA로 마이그레이션을 하고 있는 추세이다.
위의 그림1에서 볼 수 있듯 마이크로서비스 아키텍처는 각각의 서비스를 독립적으로 관리한다. 데이터베이스도 각 서비스에 따라 독립적으로 관리하다 보니 데이터의 동기화 문제 즉, 데이터의 일관성 및 무결성을 신경 써야 한다. 이 문제를 메시지 큐를 통해 해결할 수 있다. 데이터의 트랜잭션 처리 등을 위한 서비스 간 통신은 Message Queueing Server를 통해 이뤄진다. 주로 Kafka나 RabbitMQ와 같은 메시지 브로커를 사용해서 메시지를 구현한다.
메시지 큐는 모놀리식 아키텍처에서 마이크로 서비스 아키텍처로의 전환과정에서 핵심적인 역할을 한다. 비동기 통신, 이벤트 기반 아키텍처, 데이터 일관성 및 무결성, 비동기 작업 처리 등의 측면에서 메시지큐의 활용은 유연하고 확장 가능한 시스템을 설계하는데 도움을 준다.
2. 핵심기능보다는 부가기능에
간단한 요청과 응답을 처리하는 서버구조에서는 사용자의 요청과 응답에 시간이 소요되는 메시지 큐를 사용할 필요가 없다. 메시지 큐의 비동기적 특징 때문에 Producer가 메시지를 생성해도 언제 Consumer가 메시지를 가져가서 처리할지 모른다. 따라서 대용량 데이터 처리를 위한 배치작업이라던가, 이메일 전송 서비스, SNS의 알림 메시지 등에서 사용할 수 있다.
메시지 큐의 2가지 타입
Point-to-Point Message Queue[기본]
- 메시지 큐 타입 중 가장 기본적인 형태
- 단일 송신자가 메시지를 보내면, 메시지 큐는 특정 소비자가 받을 때까지 저장하고 있고, 특정 소비자가 받았다면 해당메시지는 큐에서 제거.
- 각 메시지는 오직 하나의 수신자에게만 전달
- Task Queue(작업 큐) 등에서 사용되며, 한 번에 하나의 소비자가 특정 메시지를 처리해야 하는 상황에 유용
Publish-Subscribe Message Queue(발행/구독 메시징 모델)
- publish/subscribe 메시지 큐는 여러 송신자가 메시지를 생성하고, 이를 여러 수신자가 동시에 구독하여 처리하는 패턴
- 메시지를 발행한 송신자는 모든 해당 메시지를 구독한 수신자에게 전달
- 각 수신자는 동일한 메시지를 독립적으로 처리
- 메시지의 처리가 완료되어도 메시지는 주제(Topic)를 구독하는 다른 수신자에게 계속해서 전달
- 이벤트 기반 아키텍처에서 사용되며, 여러 컴포넌트 간에 이벤트를 전파하고 각각의 컴포넌트가 특정 이벤트에 반응할 수 있도록 하는데 유용
- 소셜미디어, 주식시장과 같은 실시간 스트리밍 애플리케이션에서 사용
메시지 큐를 사용함으로써 얻는 이점 7가지
1. Asynchronous Communication(비동기 통신)
- 메시지 큐는 응용프로그램이 응답을 기다릴 필요 없이 메시지를 보내고 받을 수 있게 해 준다.
- 생성된 메시지 저장, 전송에 대해 동기화 처리를 하지 않고 큐에 넣어두기 때문에 나중에 처리가 가능하다.
2. Decoupling(분리, 낮은 결합도)
- 메시지 큐는 애플리케이션들을 서로 분리하여 독립적인 작업이 가능하도록 한다. → 시스템이 더 유연해지고, 유지관리에 편함
- 생산자 서비스와 소비자 서비스가 독립적으로 행동함으로써 서비스가 결합도가 낮아진다.
3. Scalability(확장성)
- 메시지 큐는 더 많은 서버를 추가함으로써(scale-out) 많은 양의 메시지를 처리할 수 있다. 따라서 트래픽이 많은 애플리케이션일 경우에 서버를 확장하는 것이 이상적
- 생산자 서비스 혹은 소비자 서비스를 원하는 대로 확장할 수 있기 때문에 확장성이 좋음
4. Reliability(안정성)
- 메시지 큐는 메시지 지속성, 재시도, 데드레터 큐와 같은 기능을 통해 매우 안정적으로 설계될 수 있다. 이를 통해 장애가 발생하더라도 메시지가 손실되지 않는다.
- DLQ(Dead Letter Queue) : 소프트웨어 시스템에서 오류로 인해 처리할 수 없는 메시지를 임시로 저장하는 메시지 큐[참고]
5. Resilience(탄력성)
- 소비자 서비스에 장애가 발생하더라도 전체 애플리케이션에 문제발생으로 이어지지 않는다. 메시지는 메시지 큐에 남아있으므로, 소비자 서비스가 다시 시작되면 메시지를 처리할 수 있다.
6. Guarantees(보장성)
- 메시지 큐는 큐에 보관되는 모든 메시지가 결국 소비자 서비스에게 전달된다는 보장을 제공
- 작업이 처리된 것을 확인할 수 있다.
7. Workflow관리
- 메시지 큐는 주문처리, 결제 처리와 같은 복잡한 워크플로우를 구현하는 데 사용될 수 있다. 이는 프로세스의 효율 및 정확성을 향상하는데 도움을 준다.
오픈소스의 메시지 큐 종류
- RabbitMQ
- ActiveMQ
- ZeroMQ
- Kafka
참고 사이트(참고하면 좋은 사이트)
'CS' 카테고리의 다른 글
17. Git으로 버전 관리하기 (0) | 2021.08.04 |
---|