1. 메시지큐란?
메시지 지향 미들웨어(Message Oriented Middleware), 즉 MOM은 독립된 서비스간에 데이터를 주고받을 수 있는 형태의 미들웨어를 말한다. 메시지를 통해 여러 분산되어 있는 시스템간의 Connector 역할을 통해 결합성을 낮추고, 실시간으로 비동기식 데이터를 교환할 수 있도록 하는 소프트웨어를 말한다.
그렇다면 Message Queue(MQ)는 무엇일까?
MOM을 구현한 솔루션으로 비동기 메시지를 사용하는 서비스들간에 데이터를 교환해주는 역할을 한다. Producer, Consumer가 존재하고 Producer는 메시지를 큐에 전송하고 Consumer가 큐의 메시지를 처리한다.
MQ를 사용하면 비동기로 요청을 처리하고 Queue에 저장하여 Consumer에게 병목을 줄여 줄 수 있다.
2. MQ를 사용하는 이유?
· 애플리케이션 & 시스템간의 통신
서버 간 데이터를 주고 받은 작업을 할 때는 항상 시스템 장애를 고려해야한다. 서버가 죽거나 알 수 없는 장애로 인해 데이터를 받을 수 없는 상황이 발생할 수 있다. 이를 위해 요청하는 서버에서는 Failover처리를 하는 방법도 있지만 MQ를 사용하면 더 간단하게 처리할 수 있다.
아래 이미지와 같이 P에서 C로 데이터를 전송할 때 MQ를 이용한다. P는 C가 아닌 MQ로 데이터를 전달한다. C는 MQ로부터 요청 데이터를 수신하여 처리하게 되고 C가 장애 상황이라면 C가 받기 전까지 MQ에 남아있게 된다. 이후 장애 복구 이후 다시 MQ를 통해 데이터를 수신받아 처리가 가능하다.
· 부하 분산 처리
MQ를 이용하면 부하 분산도 가능하다. 아래 이미지와 같이 P에서 MQ로 데이터를 전달한다. 수신측 서버를 한개가 아닌 여러개를 구성함으로써 각 서버 처리량에 맞게 태스크를 가져와 처리함으로써 분산 처리도 가능하게 된다. 이를 통해 부하가 많은 작업도 여러 서버가 나누어서 작업함으로써 동시에 처리할 수 있다.
3. kafka와 rabbitMQ란?
1) kafka
kafka는 LinkedIn에서 개발된 분산 메시징 시스템이고 동작 원리는 아래와 같다.
동작 순서 설명에 앞서 용어부터 정리하자
· Broker : kafka 클러스터는 각각의 kafka server들로 이루어졌고 각각의 kafka server를 Broker라고 한다.
· topic : Producer에서 전달한 메시지가 저장되는 곳으로 메시지들의 카테고리라고 생각하면 된다. 카프카는 데이터를 주고 받을 때 지정된 토픽으로 주고 받게 된다.
· 파티션 : topic은 여러 파티션으로 구성되어 있다. 이 파티션은 topic내에서 메시지가 분산되어 실제로 저장된다. 여러 파티션으로 구성하는 이유는 병렬 처리가 가능해지고 이는 분산처리를 할 수 있는 구조이기 때문이다. replication 설정 값에 따라 데이터가 다른 파티션에 저장된다.
· 오프셋(Offset) : 하나의 메시지 단위를 레코드라고 표현하는데 이 레코드들의 ID가 오프셋이다. 배열의 index개념을 생각하면 된다. Producer로부터 Broker가 데이터를 받게 되면 오프셋 숫자는 하나씩 늘어나게 된다.
· Zookeeper : kafka Cluster에서 분산 메시지 큐의 정보를 관리해주는 역할을 한다.
· Consumer Group : 하나의 토픽을 읽어가기 위해 Cusumer들을 모아노은 집단, 그룹
kafka의 동작 순서
① Producer에서 데이터를 kafka 클러스터에 전달한다.
② 지정된 topic내 partition에 메시지를 저장한다.
③ 설정된 replication 값에 따라 또 다른 topic내 partition에 복제를 위한 메시지를 저장한다.
④ Consumer Group안에 있는 어느 하나의 컨슈머가 수신하고 메신 처리를 수행한다.
2) rabbitMQ
rabbitMQ를 간략하게 설명하면 AMQP 프로토콜을 구현한 메시지 브로커이다.
그렇다면 AMQP란 무엇일까? Advanced Message Queueing Protocol의 줄임말로써 클라이언트가 메시지 브로커와 통신할 수 있게 해주는 메시지 프로토콜이다.
Producer(메시지를 보내는쪽)에서 Broker로 메시지를 전달하면, Broker는 다시 Consumer들에게 전달하는 구조이다.
다시 rabbitMQ를 설명하면 중요한 개념으로는 Producer, Exchange, Binding, Queue, Consumer가 있다.
kafka에는 없는 용어에 대해 간략히 알아보면 다음과같다.
· Exchange : 수신한 메시지에 특정 알고리즘을 적용, 메시지를 담게될 Queue를 찾는 과정이다.
Exchange Type은 fanout, direct, topic, header 4개가 존재하고 간단한게 설명하면 아래와 같다.
- fanout은 모든 queue에 메세지를 전달한다.
- direct는 producer에서 전달한 key와 완전 일치하는 queue에 메시지를 전달한다.
- topic은 direct와 다르게 전달한 key와 패턴을 정하고 패턴과 일치하는 queue에 메시지를 전달한다.
- header는 key:value로 이루어진 header값을 기준으로 일치하는 queue에 메시지를 전달한다.
· Binding : Exchange에 type 의해 전달된 메시지 Queue에 보내게 되는데 이를 Binding이라고 한다.
rabbitMQ의 동작 순서는 다음과 같다.
① Producer에서 데이터를 Broker에 전달한다.
② Exchage가 어떤 Queue에 저장할지 찾고 해당 Queue에 저장한다.
③ 데이터가 저장되고 나서 각각의 Consumer에서 데이터를 가져가고 수신된 데이터는 삭제된다.
4. kafka vs rabbitMQ
위에서 kafka와 rabbitMQ를 간단하게 알아본후 그 차이점을 간단하게 표로 정리해보았다.
kafka | rabbitMQ | |
접근 방식 | 풀 방식 : Consumer는 메시지 처리를 위해 kafka cluster로 요청 | 푸시 방식 : Brok |
방식 | · pub/sub방식 · 생산자 중심적인 설계로 구성 · 생성자가 원하는 각 메시지를 게시할 수 있도록 메시지 배포 패턴 |
· 메시지 브로커 방식 · 브로커 중심적인 설계로 구성 · 지정된 수신인에게 메시지를 확인, 라이팅,저장 및 배달하는 역할 수행 · 보장되는 메시지 전달에 초점 |
메시지 삭제 여부 | · Consumer가 메시지를 가져가더라도 계속 유지 | · Consumer가 Queue에서 메시지를 가져가면 삭제 |
용도 | · 스트리밍 데이터를 저장, 읽기,분석 등에 적합 |
· 높은 처리량과 안정적인 백그라운드 작업에 적합 · 애플리케이션 내부 및 애플리케이션 간의 통신에 적합 |