본문 바로가기

Programming/Spring

[Spring/이벤트 기반 아키텍쳐]메시지 큐란?

1) 메시지 큐

메신저의 특성상 사용자가 많아지게 되면, 채팅의 양이 늘어남에 따라 대용량 데이터가 실시간으로 전달되는 상황이 오게 된다. 기존의 동기식 요청-응답 방식으로 이를 구현하게 되면 발생하는 많은 문제점들을 해결하기 위해 비동기식 발행-소비 방식인 메시지 큐를 사용하기로 결정하였고 이에 대해 학습하는 시간을 가졌다.

 

2) 왜 메시지 큐를 써야하는가?

- 동기식 요청-응답 방식

채팅 시스템을 동기식 요청-응답 방식으로 처리하게 되면, 끊임없이 메시지를 주고받는 채팅시스템에 유연하게 대처하지 못하게 된다. 수백명의 사람이 채팅방에 들어와 있을 때, 한 사람의 네트워크 상태가 좋지 않아서 그 사람이 보낸 메시지가 제대로 처리되지 않고 있는 상황이 발생하면 이로 인하여 나머지 수백명의 사람이 해당 메시지의 완전한 처리에 대한 응답이 올 때가지 메시지를 전송하지 못하게 된다.

 

- 메시지 큐 방식

메시지를 발행하는 사용자와 이를 소비하는 사용자 간의 강한 결합으로 인하여 발생하는 깨지기 쉬운 성질 등을 가지는 동기식 방식은 마이크로서비스가 가지는 느슨한 결합이라는 특성과 어울리지 않는다. 메시지를 발행하는 클라이언트가 이용하는 서비스를 조직 서비스, 메시지를 소비하는 클라이언트가 이용하는 서비스를 라이선싱 서비스라고 가정해보겠다. 메시지 큐 방식을 사용하면 라이선싱 및 조직 서비스 사이에 큐를 삽입한다. 이 큐는 조직 서비스의 데이터를 읽는 데 사용되는 것이 아니라, 조직 서비스가 관리하는 조직 데이터의 상태가 변할 때 조직 서비스가 메시지를 발행하는데 사용이 된다. , 메시지 전달에서 메시지 큐는 라이선싱 서비스와 조직 서비스 사이의 중개자 역할을 하게 됨으로써 마이크로서비스의 특징인 느슨한 결합’, ‘내구성’, ‘확장성’, ‘유연성을 제공하게 된다.

 

- 메시지 큐의 특징

비동기(Asynchronous): Queue에 넣기 때문에 나중에 처리할 수 있다.

비동조(Decoupling): 애츨리케이션과 분리할 수 있다.

탄력성(Resilience): 일부가 실패 시 전체에 영향을 받지 않는다.

확장성(Scalable): 다수의 프로세스들이 큐에 메시지를 보낼 수 있다.

 

- 메시지 큐의 종류

메시지 큐의 종류를 보기 전에 메시지 지향 미들웨어(MOM)에 대해 이해해야 한다. MOM은 비동기 메시지를 사용하는 다른 응용 프로그램 사이에서의 데이터 송수신을 의미한다. 이러한 MOM을 구현한 시스템을 메시지 큐(MessageQueue: MQ)라고 한다. 이때, 서로 다른 프로세스나 프로그램 사이에서 메시지를 교환할 때 사용하는 메시지 교환 프로토콜이 AMQP이다. 그릐고 이러한 AMQP 프로토콜을 구현한 메시지 큐에는 RabbitMQ, ActiveMQ, ZeroMQ, Kafka 등 이 있다.

 

초반에는 RabbitMQ를 이용하여 메시지큐를 구현하고자 하였으나, 토론을 거친 결과 메시지 처리 기능이 다양한 기능위주인 RabbitMQ 보다 대용량 메시지를 처리하는데 효과적인 Kafka를 사용하기로 결정하였다. Kafka 의 경우 다른 메시지 큐 시스템과 다른 강점이 있는데, 다음과 같다.

메시지 소비자가 메시지 브로커로부터 직접 메시지를 가지고 오는 pull 방식으로 동작 => 메시지 소비자는 자신의 처리능력만큼의 메시지만 broker 로부터 직접 메시지를 가지고 옴으로써성능을 최적화 시킬 수 있다.

기존의 push 방식의 메시징 시스템의 경우 broker 가 직접 각 consumer 가 어떤 메시지를 처리해야 하는지 계산하고 어떤 메시지를 처리 중인지 트랙킹하였다면, Kafka 에서는 consumer 가 직접 필요한 메시지를 broker 로 부터 pull 하므로 broker consumer 와 메시지 관리에 대한 부담이 경감된다.

메시지를 pull 방식으로 가져오므로, 메시지를 쌓아두었다가 주기적으로 처리하는 batch consumer 의 구현이 가능하다.

큐의 기능상 RabbitMQ(데이터 기반 라우팅, 페데레이션 기능 등 지원)등에 비해서는 부족하지만 대용량 메시지를 지원한다는 장점이 있다. 특히 분산환경에서 용량 뿐 아니라, 데이터 복사본을 다른 노드에 저장함으로써 노드 장애에 대한 대응성을 가지고 있으므로 용량에 대해서는 확실한 강점을 지닌다.

 

 

 

 

참고자료