메시지큐에 대하여
메시지큐는 왜 필요하며 여러가지 종류가 있다. 우리는 무엇을 어떻게 사용해야할까?
MSA에서 필요하다
이걸 메시지 지향 미들웨어(MOM)가 해준다
MOM이란?
메시지큐와 그 두 방식(메시지 부로커와 이벤트 브로커)
MSA에 필수적 요소, 메시지큐
MSA란?
- Micro Service Architecture는 작은 서비스이 모여 이루어진 구조로 느슨하게 결합된 서비스들로 애플리케이션을 구조화하는 개발 기법
- 전통적인 방식의 단일 구조(Monolithic)와 비교하였을 때 각 모듈들이 작은 단위의 Microservice로 나뉘어진 구조
- 위와 같은 구성 요소들이 있는데 이를 하나씩 성취하기 위해서는 서비스들끼리의 소통 필요
- 중앙 관리 모듈과 서비스의 소통 (오토스케일링, Config 관리, 로깅)
- 서비스와 서비스의 소통 (연계 서비스간 정보/산출물 전달)
- 그리고 이렇게 세분화된 서비스간의 소통에는 메시지 지향 미들웨어인 메시지큐가 주로 사용됨
메시지 지향 미들웨어 (MOM)
- Message Oriented Middleware는 응용 소프트웨어 간의 데이터 통신을 위한 소프트웨어이며 비동기 메시지 전달에 기초한다.
장점
- 메시지 기반 통신 프로토콜의 장점은 메시지를 전달하는 과정에서 보관하거나 라우팅(일대다) 및 변환할 수 있다는 점이다.
- 서비스 아키텍쳐에 외부 구성 요소인 메시지 전송 에이전트(프로세스)를 필요로 한다는 점이다. 별도의 관리 포인트가 추가로 필요하다.
- 메시지 기반 통신은 본질적으로 비동기라서 불일치가 발생할 수 있다. (A -> B, B -> C 순서의 작업이 있을 때 A -> B -> C가 연속적인 동기작업이 아니기 때문에 B -> C 작업에서 B가 제대로 이루어진 것이 보장되지 않음)
- 예시 주문 처리 시스템(wrote by gpt-4o)
- 상황: 한 온라인 쇼핑몰에서는 주문 처리 시스템을 운영하고 있습니다. 이 시스템은 다음과 같은 여러 서비스로 구성되어 있습니다:
- 주문 서비스(Order Service): 주문 요청을 받는 서비스
- 결제 서비스(Payment Service): 결제를 처리하는 서비스
- 재고 서비스(Inventory Service): 재고를 확인하고 관리하는 서비스
- 배송 서비스(Shipping Service): 주문이 완료되면 배송을 준비하는 서비스
- 비동기 메시지 기반 통신
- 주문 생성: 고객이 주문을 하면 주문 서비스는 주문 정보를 메시지 큐에 보냅니다.
- 결제 처리: 결제 서비스는 메시지 큐에서 주문 메시지를 읽고 결제를 처리한 후, 결과를 다른 큐에 보냅니다.
- 재고 확인: 재고 서비스는 결제가 성공하면 재고를 확인하고, 재고가 충분한지 여부를 메시지 큐에 보냅니다.
- 배송 준비: 재고가 확인되면 배송 서비스는 배송 준비를 시작하고, 완료 메시지를 큐에 보냅니다.
- 불일치 문제 각 서비스는 비동기적으로 동작하므로, 시스템의 상태는 일시적으로 일관되지 않을 수 있습니다. 예를 들어:
- 결제는 성공했지만 재고가 부족한 경우
- 재고는 충분하지만 결제가 실패한 경우
이러한 불일치를 해결하기 위해 메시지 지향 미들웨어는 여러 개의 요청을 그룹화하여 하나의 의사 동기 트랜잭션으로 처리할 수 있습니다.
- 의사 동기 트랜잭션 예시
- 트랜잭션 시작: 주문 서비스는 주문 생성, 결제, 재고 확인, 배송 준비를 하나의 트랜잭션으로 그룹화합니다.
- 메시지 그룹화: 각 서비스는 트랜잭션 ID를 포함하여 메시지를 전송합니다. 미들웨어는 이 트랜잭션 ID를 사용하여 관련 메시지를 그룹화합니다.
- 상태 추적: 미들웨어는 각 단계의 상태를 추적하여, 모든 단계가 성공적으로 완료되었는지 확인합니다.
- 의사 동기 응답: 모든 단계가 완료되면, 미들웨어는 최종 결과를 하나의 응답으로 묶어 주문 서비스에 전달합니다.
- 상황: 한 온라인 쇼핑몰에서는 주문 처리 시스템을 운영하고 있습니다. 이 시스템은 다음과 같은 여러 서비스로 구성되어 있습니다:
메시지의 전달 방식에 따른 분류 (메세지 브로커 vs 이벤트 브로커)
- 메시지 큐에 메시지 혹은 이벤트를 넣어주고 중개하는 것을 브로커라고 한다.
메시지 브로커
- Producer가 생성한 메시지를 큐에 저장하고, Consumer가 저장된 메시지를 가져갈 수 있도록 한다.
- 메시지가 소모(consume)되면 메시지 큐에서 사라집니다.
- 이벤트 브로커는 메시지 브로커 역할을 수행할 수 있다. 하지만 반대로는 불가능 (메시지 브로커가 이벤트 브로커 기능 x)
- 큐에서 Consume된 데이터는 삭제되지 않고 필요에 따라 다시 Consume할 수 있다.
- 메시지 브로커보다 큰 규모의 데이터를 처리할 수 있다.
- ex) Kafka
사용 후보군: RabbitMQ와 ZeroMQ
- 둘 다 AMQP를 구현한 오픈소스 메시지큐 관련 소프트웨어이다. 둘 제외하고도 많지만 무엇을 써야하나 고민이 될 수 있으니 천천히 알아보자.
- 하지만 위키백과에서 찾아보면 둘의 차이점은 메시지 지향 미들웨어 , 메시지 브로커 에 있다.
- producer/publisher가 consumer에게 메시지를 전달(요청)할 때 중간에서 브로커 역할을 한다.
- 웹 형태로 메시지 브로커를 제공하여 큐와 메시지들의 현황을 모니터링할 수 있다.
- 메시지 브로커가 있기 때문에 메시지 송수신 사이에 ACK을 넣어 신뢰도가 높다.
ZeroMQ
- 브로커가 없어 더 빠른 비동기 통신 성능을 제공한다.
- 다양한 방식을 제공한다.
- pub-sub (publisher/subscriber인데 생산자/소비자와 동일하다)
- push-pull (단방향 통신, 부하 분산 가능)
- client-server
+참고 https://velog.io/@choidongkuen/%EC%84%9C%EB%B2%84-%EB%A9%94%EC%84%B8%EC%A7%80-%ED%81%90Message-Queue-%EC%9D%84-%EC%95%8C%EC%95%84%EB%B3%B4%EC%9E%90
이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.