본문 바로가기
개발(프로그래밍)/MessageQueue

Message Queue란?

by 캔두500 2024. 12. 20.

이번 프로젝트에서는 메시지 큐를 이용하여 서버-클라이언트간 통신(메시지 전달)을 구현할 예정이다. 메시지 큐는 약 5년 전에 다뤄보았으나, 이미 다 까먹은지 한참이 되어 다시 정리해보는 시간을 가진다.

메시지 큐를 보기에 앞서, MOM을 먼저 살펴보겠다.

 

MOM (Message Oriented Middleware)

메시지 지향 미들웨어로, 응용 소프트웨어 간 비동기적(Asynchronous, Async) 데이터 통신을 위한 소프트웨어

메시지를 전달하는 과정에서 보관, 라우팅 및 변환의 장점을 가짐

보관: 메시지 백업. 지속성을 제공하여 어플리케이션이 모두 네트워크 연결을 유지할 필요가 없음

라우팅: 미들웨어에서 직접 메시지를 라우팅하여 하나의 메시지를 여러 수신자에게 보낼 수 있음

변환: 송수신 측에 따라 전달하는 메시지를 변환 할 수 있음. 


AMQP: MOM을 위한 개방형 표준 응용 계츨 프로토콜. 

 

Message Queue(MQ)

어플리케이션 간에 비동기적으로 메시지를 교환하는 프로토콜.

MOM의 한 솔루션으로,독립적인 어플리케이션과 서비스에서 정보를 교환할 수 있도록 지원

Message라는 데이터 패킷이 생성되고, 전송되는 순서대로 이용하는 어플리케이션에서 해당 메시지를 처리할 수 있는 상태가 될 때까지 저장한다. 따라서, 네트워크 문제나 수신하는 곳에 문제가 생기더라도 메시지 큐의 메시지는 사라지지 않는다.

Producer: 메시지를 발행 및 전달하는 부분

Consumer: 메시지를 받아 소비하는 부분

 

장점

- 비동기(Asynchronous): 메시지를 비동기로 처리. 나중에 처리가 가능

- 비동조(Decoupling): 어플리케이션간 낮은 결합도. 어플리케이션과 분리하여 독립적으로 개발. 

- 확장성(Scailability): 더 많은 서버를 추가하여 대량의 메시지를 처리 할 수 있음. 

- 복원성(Resilience): 어플리케이션 관련 오류가 시스템에 영향을 미치지 않음. 어느 한 부분의 오류로 인해 시스템 전체의 안정성이 영향 받을 가능성이 줄음. Producer 프로세스는 consumer 프로세스가 다운되어 있어도 메시지를 발행할 수 있고, Consumer는 producer가 다운되어 있어도 메시지를 정상적으로 수신할 수 있음. 

- 신뢰성(Reliability): 메시지의 손실 없이 수신 어플리케이션에 단 한번만 전달. 별도의 중복 제거 / 손실 방지 로직 불필요

 

Message Queue의 타입

1. Point - to - point 메시지 큐

가장 간단한 타입으로, producer가 point-to-point 큐에 메시지를 보내면 consumer가 소비할때까지 큐에 보관된다. consumer가 메시지를 가져가면 큐에서 삭제되며 다른 consumer로부터는 처리되지 않는다. (메시지는 한번 이용된다)

 

2. Publish-Subscribe 메시지 큐

Pub/Sub에서는 메시지를 생성하는 어플리케이션이 publisher, 이용하는 어플리케이션이 subscriber가됨. 각 메시지가 하나의 토픽에 발행되며 해당 토픽을 subscribe(구독)하는 모든 어플리케이션이 토픽에 발행된 메시지의 사본을 받음. 

대부분의 MOM 솔루션은 point-to-point와 pub/sub 메시징 모델 둘 다 지원함. 

 

종류

대표적인 메시지 큐 종류는 다음과 같다. 

- RabbitMQ

- ActiveMQ

- Kafka

 

 

RabbitMQ

Producer: 요청을 보내는 주체. 메시지를 exchanger에 publish. 

Consumer: Producer로부터 메시지를 받아 처리

Exchanger: Producer로부터 받은 메시지를 어떤 메시지 큐로 전송할지 결정하는 장소. (라우팅)

Queue: Consumer가 가져가기 전까지 메시지가 보관되는 장소

Binding: Exchange와 Queue와의 관계. 특정 Exchange가 특정 큐에 메시지를 보내도록 정의

 

Kafka

확장성과 고성능. 높은 처리량. 메시지 브로커와는 달리 이벤트 브로커임. consumer가 broker로부터 메시지를 직접 가져가는(pull) 방식. consumer의 처리 능력만큼만 메시지를 가져와 처리. 따라서 대용량 분산 시스템에 적합. 

 

 

 

 

참고

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

https://www.cloudamqp.com/blog/what-is-message-queuing.html