본문 바로가기

IT · 인터넷

[JAVA] 메시지 큐(Message Queue) 이해와 활용

반응형

메시지 큐(Message Queue)는 비동기 메시징 시스템으로,

서로 다른 시스템 간의 통신을 용이하게 해주는 기술입니다.

Java에서는 다양한 메시지 큐 구현체를 사용하여 메시지를 안전하게 전송하고 처리할 수 있습니다.

이 글에서는 Java에서 메시지 큐의 기본 개념, 주요 라이브러리, 활용 방법에 대해 설명하겠습니다.

 

메시지 큐의 기본 개념

메시지 큐는 생산자(Producer)와 소비자(Consumer) 간의 메시지를 저장하는 중간 저장소 역할을 합니다. 

생산자는 메시지를 큐에 보내고, 소비자는 큐에서 메시지를 가져와 처리합니다. 

 

메시지 큐 사용 이유

  • 비동기 처리: 생산자는 메시지를 전송한 후 즉시 다음 작업을 진행할 수 있으며, 소비자는 필요할 때 메시지를 처리할 수 있습니다.
  • 로드 밸런싱: 여러 소비자가 동일한 큐에서 메시지를 처리함으로써 부하를 분산할 수 있습니다.
  • 신뢰성: 메시지가 큐에 안전하게 저장되므로, 소비자가 일시적으로 다운되더라도 메시지를 잃어버리지 않습니다.

 

주요 메시지 큐 라이브러리

  • RabbitMQ: AMQP(Advanced Message Queuing Protocol)를 기반으로 한 메시지 브로커로, 다양한 언어와 플랫폼에서 지원됩니다.
  • Apache Kafka: 대용량 데이터 스트리밍을 위해 설계된 분산 메시징 시스템으로, 높은 처리량과 내구성을 제공합니다.
  • ActiveMQ: JMS(Java Message Service)를 지원하는 메시지 브로커로, 다양한 메시징 패턴을 지원합니다.

각 라이브러리는 특정한 사용 사례에 따라 장단점이 있으므로, 프로젝트의 요구사항에 맞는 라이브러리를 선택하는 것이 중요합니다.

RabbitMQ 예제

저는 우선 RabbitMQ를 사용하여 메시지를 보내고 받는 간단한 예제를 작성해보겠습니다. 

 

#1 Maven 의존성 추가

<dependency>
    <groupId>com.rabbitmq</groupId>
    <artifactId>amqp-client</artifactId>
    <version>5.15.0</version>
</dependency>

 

#2 메시지 생산자 (Producer)

import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;

public class Producer {
    private final static String QUEUE_NAME = "hello";

    public static void main(String[] argv) throws Exception {
        ConnectionFactory factory = new ConnectionFactory();
        factory.setHost("localhost");
        try (Connection connection = factory.newConnection(); 
             Channel channel = connection.createChannel()) {
            channel.queueDeclare(QUEUE_NAME, false, false, false, null);
            String message = "Hello, World!";
            channel.basicPublish("", QUEUE_NAME, null, message.getBytes());
            System.out.println(" [x] Sent '" + message + "'");
        }
    }
}

 

#3 메시지 소비자 (Consumer)

import com.rabbitmq.client.*;

public class Consumer {
    private final static String QUEUE_NAME = "hello";

    public static void main(String[] argv) throws Exception {
        ConnectionFactory factory = new ConnectionFactory();
        factory.setHost("localhost");
        try (Connection connection = factory.newConnection(); 
             Channel channel = connection.createChannel()) {
            channel.queueDeclare(QUEUE_NAME, false, false, false, null);
            System.out.println(" [*] Waiting for messages. To exit press Ctrl+C");
            DeliverCallback deliverCallback = (consumerTag, delivery) -> {
                String message = new String(delivery.getBody(), "UTF-8");
                System.out.println(" [x] Received '" + message + "'");
            };
            channel.basicConsume(QUEUE_NAME, true, deliverCallback, consumerTag -> { });
        }
    }
}

 

마무리

Java에서 메시지 큐는 비동기 통신을 통해 시스템의 유연성과 확장성을 높이는 데 중요한 역할을 합니다. 

RabbitMQ와 Apache Kafka와 같은 다양한 메시지 큐 구현체는 각각의 특성과 장점을 가지고 있어, 특정한 요구사항에 맞춰 선택할 수 있습니다. 

메시지 큐를 활용함으로써 대규모 분산 시스템에서도 안정적이고 효율적인 데이터 처리가 가능합니다.

반응형