메시지 큐

메시지 큐

프로세스나 프로그램 간에 데이터를 교환할 때 사용하는 통신 방법 중 하나.

MOM(메시지 지향 미들웨어)구현하는 시스템

MOM(메시지 지향 미들웨어)

애플리케이션 소프트웨어 간의 데이터 통신(비동기 메시지)을 위한 소프트웨어

  • 메시지: 요청, 응답, 오류 메시지 또는 간단한 정보와 같은 작은 데이터입니다.

메시지 지향 미들웨어는 메시지를 전달하는 과정에서 메시지를 저장, 라우팅 및 변환할 수 있다는 장점이 있습니다.

  • 메시지 백업을 유지하면 지속성이 제공되므로 발신자와 수신자가 동시에 네트워크 연결을 유지할 필요가 없습니다.
  • 단일 메시지를 여러 수신자에게 배포할 수 있습니다.
  • 메시지는 발신자와 수신자의 요청에 따라 변환될 수 있습니다.


=> 메시지 대기열은 메시지를 임시로 저장하는 간단한 버퍼입니다!

중간에 메시지 대기열을 넣어 메시지를 보내고 받습니다.

메시지 대기열의 사용을 일대일 통신이라고 합니다.

메시지 큐의 특징

  • 비동기식 : 데이터가 바로 수신자에게 전달되지 않고 큐에 넣어 관리되기 때문에 추후 처리가 가능합니다.
  • 낮은 디커플링 : 생산자 서비스와 소비자 서비스가 독립적으로 작동함에 따라 서비스 간의 결합이 줄어듭니다.
  • 회복력 : 한 부분이 망가져도 전체에 영향을 주지 않습니다.
  • 중복성 : 실패시 재실행 가능
  • 보증 : 메시지 대기열은 대기열에 보관된 모든 메시지가 최종적으로 소비자 서비스로 전달된다는 일반적인 보증을 제공합니다.
  • 확장 가능 : 생산자 서비스나 소비자 서비스를 원하는 대로 확장할 수 있기 때문에 확장 가능합니다.

메시지 큐를 사용하는 경우

일반적인 클라이언트-서버 구조에서는 사용자가 요청을 하면 서버에서 이를 처리한 후 클라이언트에 응답합니다.

따라서 간단한 서버 구조에서는 메시지 큐를 사용할 필요가 없습니다.

사용자가 응답을 기다려야 하는 HTTP 요청 중간에 메시지 대기열을 배치하는 것은 바람직하지 않습니다.

메시지 큐는 애플리케이션의 추가 기능에 사용하기에 적합합니다.

대용량 데이터 처리를 위한 일괄 작업, 채팅 서비스, 비동기 데이터 처리 등에 사용됩니다.

예를 들어 10,000개의 요청이 발생했을 때 모든 요청을 서버로 보내는 것이 아니라 메시지 큐로 보내고, 서버 측에서 처리할 수 있는 요청만 메시지 큐에서 가져와서 처리한다면 서버에 부담이 된다. 줄일 수 있습니다.

  • 다른 곳의 API에서 데이터 송수신
  • 다양한 Application에서 비동기 통신 가능
  • 이메일 보내기 및 문서 업로드
  • 대량의 프로세스 처리 가능

일반적인 메시지 큐

래빗MQ, 액티브MQ, 카프카

토끼MQ

  • AMQP(고급 메시지 대기열 프로토콜) 프로토콜 구현 오픈 소스 메시지 브로커
    • AMQP: 메시지 지향 미들웨어를 위한 개방형 표준 애플리케이션 계층 프로토콜입니다.
  • 신뢰성, 안정성, 성능을 충족하는 다양한 기능 제공
  • 메시지 대기열은 도착하기 전에 라우팅되며 플러그인을 통해 더 복잡한 라우팅이 가능합니다.
  • 로컬 네트워크의 여러 RabbitMQ 서버를 논리적으로 클러스터링할 수 있으며 논리적 브로커도 가능합니다.
  • 관리 UI가 있어 쉽게 관리할 수 있습니다.
  • 거의 모든 언어와 운영 체제를 지원합니다.

사용할 케이스

  • 여러 사용자에게 요청을 전달할 때
  • 요청 처리 시간이 긴 경우
  • 작업이 많이 요청되어 처리가 필요한 경우

해당 요청을 다른 API에 위임하고 빠른 응답을 할 때 자주 사용됩니다. MQ는 또한 애플리케이션 간의 결합을 줄이는 이점이 있습니다.

액티브MQ

  • Java로 작성된 오픈 소스 메시지 브로커
  • JMS를 통한 다양한 언어 및 프로토콜 지원(Java, C, C++, C#, Ruby, Perl, Python, PHP 클라이언트 지원)
  • 메시지 그룹, 가상 목적지, 와일드카드 및 복합 목적지지원
  • JMS 1.1 및 J2EE 1.4를 완전히 지원하고 임시, 영구, 트랜잭션 및 XA 메시징을 지원합니다.
  • Spring 지원을 통해 ActiveMQ를 Spring 애플리케이션에 매우 쉽게 내장할 수 있으며 Spring의 XML 구성 메커니즘으로 쉽게 구성할 수 있습니다.
  • 고성능 클러스터링, 클라이언트-서버, 피어 기반 통신을 지원하도록 설계
  • REST API를 통한 웹 기반 메시징 API 지원

AMQP 대 JMS

  • AMQP는 ISO 애플리케이션 계층의 MOM 표준이며 JMS는 Java에서 MOM을 지원하는 표준 API입니다.
  • JMS는 서로 다른 Java 애플리케이션 간의 통신을 허용하지만 서로 다른 MOM(AMQP, SMTP 등) 간의 통신은 허용하지 않습니다.
  • AMQP는 프로토콜이 올바른 경우 AMQP를 사용하여 다른 애플리케이션과 통신할 수 있습니다.
  • JMS 라이브러리는 AMQP를 지원하지 않습니다.

카프카

  • 대용량 실시간 로그 처리를 위해 특별히 설계된 메시징 시스템
  • 분산 시스템을 기반으로 설계되었기 때문에 기존 메시징 시스템에 비해 분산 및 복제 구성이 용이합니다.
  • AMQP 프로토콜이나 JMS API를 사용하지 않고 프로토콜 오버헤드를 줄이기 위해 간단한 메시지 헤더가 있는 TCP 기반 프로토콜을 사용합니다.
  • 메시지는 파일 시스템에 저장되므로 별도의 설정 없이도 데이터 내구성이 보장됩니다.
  • 풀 방식으로 메시지를 가져오기 때문에 주기적으로 메시지를 모아서 처리하는 일괄 소비자 구현이 가능하다.
  • 여러 메시지를 배치 형식으로 한 번에 브로커에 전달할 수 있으므로 TCP/IP 왕복 횟수가 줄어듭니다.

RabbitMQ 대 ActiveMQ 대 카프카 ?

일반적으로 RabbitMQ와 ActiveMQ는 신뢰할 수 있는 메시지 브로커가 필요할 때 사용되며,

Kafka는 처리량이 많은 분산 메시징 시스템에 사용됩니다.

토끼MQ 빠르고 구성하기 쉽고 직관적입니다.

  • AMQT 프로토콜, 신뢰성, 유연한 라우팅 및 UI 편의성을 구현하는 프로그램

액티브MQ 효율적이고 사용하기 쉬운 오픈 소스입니다.

  • Java로 작성된 오픈 소스 메시지 브로커
  • 다양한 언어 및 프로토콜 지원

카프카 확장 가능하고 고성능이며 처리량이 높습니다.

  • 대용량 실시간 로그 처리에 특화, 간단한 메시지 헤더로 TCP 기반 프로토콜을 사용하여 오버헤드 감소