관리 메뉴

개발노트

[메시지 지향 미들웨어:MOM] ActiveMQ, rabbitMQ, Kafka 본문

기타

[메시지 지향 미들웨어:MOM] ActiveMQ, rabbitMQ, Kafka

YoonGwon 2021. 1. 26. 13:19

메시지 큐란?

- 메시지 지향 미들웨어(Message Oriented Middleware: MOM)은 비동기 메시지를 사용하는 다른 응용프로그램 사이의 데이터 송수신을 의미하는데 MOM을 구현한 시스템을 메시지큐(Message Queue:MQ)라 한다.

- MOM(Message Oriented Middleware) 를 구현한 솔루션으로 비동기 메시지를 사용하는 서비스들 사이에서 데이터를 교환해주는 역할을 한다.

- Producer(sender) 가 메시지를 큐에 전송하면 Consumer(receiver) 가 처리하는 방식으로, producer 와 consumer 에 message 프로세스가 추가되는 것이 특징이다.

 MQ를 사용하면 메시지를 비동기로 요청을 처리하고 queue 에 저장하여 consumer 에게 병목을 줄여줄 수 있는 장점이 있는데 
그 종류들중 크게 3가지의 특성에 대해 알아보려한다.

 

 


A) kafka 란?

- 분산형 스트리밍 플랫폼(A distributed streaming platform)이다. LinkedIn에서 여러 구직 및 채용 정보들을 한곳에서 처리(발행/구독)할 수 있는 플래폼으로 개발이 시작 되었다고 한다.

(발행/구독: pub-sub은 메시지를 특정 수신자에게 직접적으로 보내주는 시스템이 아니고, 메시지를 받기를 원하는 사람이 해당 토픽(topic)을 구독함으로써 메시지를 읽어 올 수 있다.)

[특징]

대용량 실시간 로그처리에 특화되어 설계된 메시징 시스템으로 TPS가 매우 우수하고,

메시지를 메모리에 저장하는 기존 메시징 시스템과는 달리 파일에 저장을 하는데 그로 인해 카프카를 재시작해도 메시지 유실 우려가 감소된다.

기본 메시징 시스템(rabbitMQ, ActiveMQ)에서는 브로커(Broker)가 컨슈머(consumer)에게 메시지를 push해 주는 방식인데, 카프카는 컨슈머(Consumer)가 브로커(Broker)로부터 메시지를 직접 가져가는 PULL 방식으로 동작하기 때문에 컨슈머는 자신의 처리 능력만큼의 메시지만 가져와 최적의 성능을 낼 수 있다. 대용량처리에 특화 되었다는 것은 아마도 이러한 구조로 설계가 되어 가능하게 된게 아닌가 싶다.

 

여기서 한가지 의문이 든다. 일반적으로 파일보다 메모리가 성능이 우수한데 왜 카프카가 성능이 좋은 것일까? 그 이유는 카프카의 파일 시스템을 활용한 고성능 디자인에 있다. 일반적으로 하드디스크는 메모리보다 수백배 느리지만 하드디스크의 순차적 읽기에 대한 성능은 메모리보다 크게 떨어지지 않는다고 한다. 

 

Kafka 구성요소


B) Apache ActiveMQ 란?

- Apache ActiveMQ 는 가장 대중적이고 강력한 오픈 소스 메세징 그리고 통합 패턴 서버다.

- Apache ActiveMQ는 빠르며, 다양한 언어간의 클라이언트 및 프로토콜을 지원하고, 사용하기 쉬운 엔터프라이즈 통합 패턴 및 많은 고급 기능을 제공하면서 JMS 1.1  J2EE 1.4를 완벽하게 지원한다.

- ActiveMQ JMS를 지원하는 클라이언트를 포함하는 브로커, 자바 뿐만 아니라 다양한 언어를이용하는시스템간의 통신을 할 수 있게해준다또한 클러스터링기능 및 DB 그리고 FileSystem을 통해 각 시스템간의 일관성 및 지속성을 유지 시켜준다.

- 간단히 정의하면  클라이언트 간 메시지를 송수신 할 수 있는 오픈 소스 Broker(JMS 서버)다.  

* 중요!  activeMQ에서 JMS는 핵심요소입니다.

 

[참고 : JMS 란?]

- JMS 는 자바 기반의 MOM(메시지 지향 미들웨어) API 이며 둘 이상의 클라이언트 간의 메시지를 보낸다.

- JMS 는 자바 플랫폼엔터프라이즈 에디션(EE) 기반이며메시지 생성송수신읽기를 한다.  또한 비동기적이며 신뢰할 만하고 느슨하게 연결된 서로 다른 분산 어플리케이션 컴포넌트 간의 통신을 허용한다.

- JMS의 핵심 개념은 Message Broker 와 Destination 이.  

 

*Message Broker : 목적지에 안전하게 메시지를 건네주는 중개자 역할.

*Destination: 목적지에 배달될 2가지 메시지 모델 QUEUE, TOPIC.

*Queue: Point to Point ( Consumer 는 메시지를 받기 위해 경쟁한다.)
*Topic: Publish to Subscribe.

 

 

 


ActiveMQ 메시지 처리 구조

 

 

ActiveMQ 메시지 처리 구조

 

- 기본적으로 Message를 생산하는 Producer, activeMQ Broker(Server), Message를 소비하는 Consumer로  구성되어 있다.

 


 

 

 

 

 

 

- QUEUE 모델의 경우 메시지를 받는 Consumer가  다수일 때 연결된 순서로 메시지는 제공됩니다.

- TOPIC 모델의 경우 메시지를 받는 Consumer가 다수일 때 메시지는 모두에게 제공됩니다.

 

 


 

-  Consumer 에서는 메시지를 받을 때까지 block 상태인  Receive() 메소드와 리스너를 통해 nonblack 상태로 메시지를 가져올 수 있습니다.

 

 


ActiveMQ의 장점

 

 

(1) 분리: 대기열은 시스템 사이에 있으며, 하나의 시스템 장애는 다른 대기열에 영향을 주지 않는다. 메시지 통신은 대기열을 통해 이루어진다. 시스템이 가동 중일 때도 계속 작동한다.

 

( 클라이언트와 서버간의 연결과 큐 대기열의 역할이 분리)

 

 

(2) 복구 지원: 큐의 처리가 실패하면 나중에 메시지를 복원 할 수 있다.

 

 

(3) 신뢰성: 클라이언트 요청을 처리하는 시스템을 생각해보자. 정상적인 경우 시스템은 분당 100 건의 요청을 받고 이 시스템은 요청 수가 평균을 넘어서는 경우 신뢰할 수 없다. 이 경우 Queue는 요청을 관리 할 수 있으며 시스템 처리량을 기초로 주기적으로 메시지를 전달할 수 있다.

 

(큐에서 들어온 메시지에 대한 처리를 관리하기 때문에 신뢰할 수 있는 시스템)

 

 

 

(4) 비동기 처리: 클라이언트와 서버 통신이 비 차단되어있다. 클라이언트가 서버에 요청을 보내면 응답을 기다리지 않고 다른 작업을 수행 할 수 있다. 응답을 받으면 클라이언트는 언제든지 처리 할 수 있다.

 

 


C) rabbitMQ 란?

- 래빗MQ는 오픈소스 AMQP 브로커다. AMQP는 유선을 통해 전송되는 메시지 형식을 포함하는 개발형 프로토컬이며, JMS와 같은 다른 메시징 솔루션에 비해 인기가 높다.

- JMS는 API, AMQP는 프로토콜이다. JMS는 메시지의 형식이 아닌 브로커와 통신하는 방법을 정의한다. 또한 자바 애플리케이션에만 국한돼 있다. AMQP는 브로커와 통신하는 방법에 대해서 논하지 않지만. 메시지가 유선을 통해 큐에 어떻게 넣고 꺼내지는지에 대해 정의한다.

서로 다른 두 가지 애플리케이션을 생각해보자, 둘 다 자바면 JVMS를 통해 통신할 수 있지만 이중에 하나가 루비라면 JMS는 사용하지 못할것이다.

JMS 발송 브로커는 매시지 전송을 위해 AMQP를 사용할 수 있어 JMS와 AMQP의 차이점을 더 확연하게 해준다.

RabbitMQ 동작 구조(1)
RabbitMQ 동작 구조(2)

- Producer: 메시지를 보내는 Application

- Consumer: 메시지를 받는 User Application

- Publish: Producer 가 메시지를 보냄

- Subscribe: Consumer가 메시지를 수신하기 위해 Queue를 실시간으로 리스닝 하기로 만든다

- Exchange : Producer가 전달한 메시지를 Queue에 전달하는 역할,
 메시지가 Queue에 직접 전달되는 것이 아니라 Exchange Type이라는 속성에 정의한데로 동작

- RoutingKey: Exchange를 생성하거나 메시지를 Publish할 때 사용하는 Key, Exchange가 Queue에 메시지를 전달할지 결정하는 Key

- Queue: 메시지를 저장하는 버퍼(Queue는 Exchange에 Binding된다)

- durable 속성: 메세지를 디스크에 저장. memory에 저장하는 것은 transient라고 한다

- auto-delete 속성: 모든 consumer가 unsubscribe 하면, 해당 queue는 자동으로 없어진다

- 동일한 queue 가 들어오면 추가하지 않는다?

- Bindings: Exchange와 Queue를 연결

- Virtual Host : 웹서버의 virtual host concept과 같이, 하나의 물리적인 서버에 여러 개의 가상 서버를 만들 수 있다

- Channel : 하나의 물리적인 connection 내에 생성되는 가상 논리적인 connection들. Consumer의 process나 thread는 각자 이 channel을 통해서 queue에 연결 될 수 있다.

- Connection : 물리적인 TCP Connection, 보안이 필요할 경우 TLS(SSL) Connection을 사용할 수 있음

 

 

[참고 : AMQP 란?]

- 프로그래밍에서 MQ는 프로세스 또는 프로그램 인스턴스가 데이터를 서로 교환할 때 사용하는 방법을 말한다. 이러한 MQ를 오픈소스에 기반한 표준 프로토콜이 AMQP이다. AMQP 자체가 프로토콜을 의미하기 때문에 이 프로토콜을 구현한 MQ 제품들은 여러가지가 있으며 그 중하나가 RabbitMQ이다.

 

*AMQP의 구성요소와 라우팅 알고리즘

  • AMQP의 라우팅 모델은 Exchange, Queue, Binding으로 구성된다.

이름설명

Exchange Publisher(Producer)로부터 수신한 메시지를 큐에 분배하는 라우터 역할
Queue 메시지를 메모리나 디스크에 저장했다가 Cusomer에게 메시지를 전달하는 역할
Binding Exchange와 Queue의 관계를 정의한 것


출처 : team-platform.tistory.com/11
출처: https://mrsence.tistory.com/tag/RabbitMQ [감각적신사 의 멱살잡고 IT]

728x90

'기타' 카테고리의 다른 글

OSGI란?  (0) 2022.07.28
X25 와 TCP/IP  (0) 2022.07.28
Scale-out & Scale-up 이란  (0) 2021.01.14
윈도우에 개발도구 AtomEditor 설치법  (0) 2020.12.15
HTML - form형식으로 텍스트 입력하는 방법  (0) 2020.12.15