[데브원영]아파치 카프카 for beginners
https://12bme.tistory.com/176
https://kji6252.github.io/2015/12/18/message-quere/
메세지 큐(Message Queue:MQ)
메시지 큐(Message Queue)는 프로세스 또는 프로그램 인스턴스가 데이터를 서로 교환할 때 사용하는 통신 방법이다. 더 큰 개념으로는 메시지 지향 미들웨어(Message Oriented Middleware:MOM)를 구현한 시스템으로서 비동기 메시지를 사용하는 서비스들 사이에서 데이터를 교환해주는 역할을 한다.

Producer(sender)가 메시지를 큐에 전송하면 Consumer(reciever)가 처리하는 방식으로, producer와 consumer에 message 프로세스가 추가되는 것이 특징이다. 중간에 메시지 큐를 둠으로써 동기방식의 데이터 통신에서 발생할 수 있는 병목 현상을 방지 할 수 있으며, 중간 미들웨어에게 메시지를 위임하여 순차적으로 처리하게끔 하게 된다.
장점
- 비동기(Asynchronous) : 메세지를 Queue에 넣기 때문에 나중에 처리할 수 있음
- 비동조(Decoupling) : 애플리케이션과 분리할 수 있음
- 탄력성(Resilience) : 일부가 실패 시 전체에 영향을 받지 않음
- 과잉(Redundancy) : 실패할 경우 재실행 가능함
- 보증(Guarantees) : 작업이 처리된걸 확인할 수 있음
- 확장성(Scalable) : 다수의 프로세스들이 큐에 메시지를 보낼 수 있음
메시지 큐 사용처
Message Qeueing은 대용량 데이터를 처리하기 위한 배치 작업이나, 채팅 서비스, 비동기 데이터를 처리할 때 사용한다. 사용자가 많아지거나 데이터가 많아지면 요청에 대한 응답을 기다리는 수가 증가하거나, 나중에는 대기 시간이 지연되어 서비스가 정상적으로 되지 못하는 상황이 온다. 그렇기 때문에 기존에 분산되어 있던 데이터 처리를 한 곳에 집중하면서 메세지 브로커를 두어서 필요한 프로그램에 작업을 분산시키는 방법을 하는 것이 그 목적이다.
- 다른 곳의 API로부터 데이터 송수신 가능
- 다양한 애플리케이션에서 비동기 통신을 할 수 있음
- 이메일 발송 및 문서 업로드 가능
- 많은 양의 프로세스들을 처리할 수 있음
JMS vs AMQP
- AMQP는 ISO 응용 계층의 MOM 표준
- JMS는 MOM을 자바에서 지원하는 표준 API
- JMS는 다른 자바 어플리케이션끼리 통신이 가능하지만 다른 MOM의 통신은 불가능함 (AMQP, SMTP 등)
- ActiveMQ의 JMS 라이브러리를 사용한 자바 어플리케이션들끼리 통신이 가능하긴 하지만, ActiveMQ를 사용하지 않은 자바 어플리케이션의 JMS와 통신할 수는 없음
- AMQP는 프로토콜만 맞다면 다른 AMQP를 사용한 어플리케이션끼리 통신이 가능함. (SMTP와도 통신 가능)
- JMS 라이브러리는 AMQP를 지원하지 않음
오픈 소스 메시지 큐
- RabbitMQ
- ActiveMQ
- ZeroMQ
- Kafka
RabbitMQ
-
AMQP 프로토콜을 구현 해 놓은 프로그램
-
신뢰성 - 안정성과 성능을 충족할 수 있도록 다양한 기능을 제공함
-
유연한 라우팅 - Message Queue가 도착하기 전에 라우팅 되며, 플러그인을 통해 더 복잡한 라우팅 가능
-
클러스터링 - 로컬 네트워크에 있는 여러 RabbitMQ 서버를 논리적으로 클러스터링 할 수 있고 논리적인 브로커도 가능함
-
거의 모든 언어와 운영체제 지원하고, 오픈소스이며 상업적 지원을 함
ActiveMQ
https://swiftymind.tistory.com/9
- 자바 메시지 서비스(JMS) 클라이언트와 함께 자바로 만든 오프소스 메시지 브로커(JMS 서버)
- 다양한 언어 환경의 클라이언트들과 프로토콜을 지원함
- Java, C, C++, C#, Ruby, Perl, Python, PHP
- JMS를 지원하는 클라이언트를 포함하는 브로커, 자바 뿐만 아니라 다양한 언어를 이용하는 시스템간의 통신을 할 수 있게 함
- 클러스터링기능 및 DB 그리고 FileSystem을 통해 각 시스템간의 일관성 및 지속성을 유지 시켜줌
- JMS 1.1과 J2EE 1.4를 완벽하게 지원하며, transient, persistent, transactional, 그리고 XA 메시징을 지원
- Spring 지원으로 ActiveMQ는 Spring 애플리케이션에 매우 쉽게 임베딩될 수 있으며, Spring의 XML 설정 메커니즘에 의해 쉽게 설정됨
ZeroMQ(ØMQ, 0MQ, ZMQ)
https://velog.io/@chy0428/zeroMQ-Introduction
- 분산/동시성 응용 프로그램에서 사용하도록 개발된
고성능 비동기 메시징 라이브러리
0
은 브로커 없음 (ZeroMQ는 브로커 없음), 대기 시간 없음, 비용 없음(무료) 및 관리 없음의 의미를 지님
- 메시지 큐를 제공하지만 메시지 지향 미들웨어(MOM)와 달리 전용 메시지 브로커 없이 동작이 가능함
- TCP, in-process, inter-process, multicast, WebSocket 과 같은 다양한 방식으로 메시지를 전송하는 소켓을 제공함
- pub/sub, request/reply, client/server and others 처럼 공통 메시징 패턴을 지원하여 프로세스 간 메시징을 간단하게 만들어 줌
- 스레드 간 메시징으로 코드를 명확하게 모듈화하며 확장이 매우 쉬움
- 확장성, 빠른 속도, 단순함
Kafka
-
대용랑의 실시간 로그 처리에 특화되어 설계된 메시징 시스템
- 기존 범용 메시징 시스템 대비 TPS가 우수함
-
분산 시스템을 기본으로 설계되었기 때문에, 기존 메시징 시스템에 비해 분산 및 복제 구성을 손쉽게 할 수 있음
-
AMQP 프로토콜이나 JMS API를 사용하지 않고, 단순한 메시지 헤더를 지닌 TCP 기반의 프로토콜을 사용하여 프로토콜에 의한 오버헤드를 감소시킴
-
다수의 메시지를 batch형태로 broker에게 한 번에 전달할 수 있어 TCP/IP 라운드 트립 횟수를 줄임
-
기존 메시징 시스템과 달리 메모리가 아닌 파일시스템에 메시지를 저장함
-
처리된 메시지를 삭제하지않고, 파일 시스템에 두었다가 설정된 수명이 지나면 삭제함
- 메시지 처리 도중 문제가 발생했거나 로직이 변경됐을 경우 consumer가 메시지를 처음부터 다시 처리하도록 할 수 있음
-
consumer가 broker로부터 직접 메시지를 가지고 가는 pull 방식으로 동작함
- 기존의 메시징 시스템은 broker가 consumer에게 메시지를 push 해 줌
- consumer는 자신의 처리능력만큼의 메시지만 broker로부터 가져오기 때문에 최적의 성능을 낼 수 있음
- broker는 메시지 관리에 대한 부담이 적어짐
- 메시지를 쌓아두었다가 주기적으로 처리하는 batch consumer 구현이 가능함
-
큐의 기능은 기존의 JMS나 AMQP 기반의 RabbitMQ 등에 비해서는 부족하지만, 대용량 메시지를 지원할 수 있는 것이 가장 큰 특징