[java] ActiveMQ와 RabbitMQ의 메시지 푸시 및 풀 방식

ActiveMQ와 RabbitMQ는 모두 대표적인 오픈소스 메시지 브로커입니다. 그러나 메시지를 체계적으로 관리하고 전달하는 방식에는 약간의 차이가 있습니다. 이번 블로그에서는 ActiveMQ와 RabbitMQ의 메시지 푸시 및 풀 방식에 대해 알아보겠습니다.

1. 메시지 푸시 방식

메시지 푸시 방식은 메시지를 전송하는 시스템이 수신자에게 직접 메시지를 보내는 방식입니다. ActiveMQ는 메시지를 푸시 방식으로 처리합니다. 이 경우, 송신자가 메시지를 ActiveMQ에게 전송하면, ActiveMQ는 해당 메시지를 큐에 저장하고, 수신자는 큐에서 메시지를 가져와 처리합니다. 즉, ActiveMQ가 메시지의 배달을 관리하며, 수신자는 메시지를 처리하기 위해 큐에서 메시지를 가져와야 합니다.

예제 코드:

import javax.jms.*;

public class MessageSender {
    public static void main(String[] args) {
        try {
            // ActiveMQ 연결 설정
            ConnectionFactory connectionFactory = new ActiveMQConnectionFactory("tcp://localhost:61616");
            Connection connection = connectionFactory.createConnection();
            Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
            Destination destination = session.createQueue("queue1");
            
            // 메시지 생성 및 전송
            MessageProducer producer = session.createProducer(destination);
            TextMessage message = session.createTextMessage();
            message.setText("Hello, World!");
            producer.send(message);
            
            // 연결 종료
            session.close();
            connection.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

위 예제는 ActiveMQ를 사용하여 메시지를 푸시하는 방식의 간단한 코드입니다. ActiveMQConnectionFactory를 사용하여 ActiveMQ에 연결하고, createQueue 메서드를 통해 큐를 생성합니다. 그리고 createProducersend 메서드를 사용하여 메시지를 생성하고 전송합니다.

2. 메시지 풀 방식

메시지 풀 방식은 송신자가 메시지를 전송하면, 브로커에 메시지를 저장해두고, 수신자는 필요할 때 메시지를 요청하여 가져오는 방식입니다. 이런 방식을 메시지 풀 방식이라고 합니다. RabbitMQ는 메시지 풀 방식으로 동작합니다. 송신자는 메시지를 RabbitMQ에게 전달하면, RabbitMQ는 해당 메시지를 유지하고, 수신자는 필요할 때 RabbitMQ에게 메시지를 요청하여 가져와 처리합니다.

예제 코드:

import com.rabbitmq.client.*;

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

    public static void main(String[] args) throws Exception {
        // RabbitMQ 연결 설정
        ConnectionFactory factory = new ConnectionFactory();
        factory.setHost("localhost");
        Connection connection = factory.newConnection();
        Channel channel = connection.createChannel();

        // 큐 선언
        channel.queueDeclare(QUEUE_NAME, false, false, false, null);

        // 메시지 수신
        Consumer consumer = new DefaultConsumer(channel) {
            @Override
            public void handleDelivery(String consumerTag, Envelope envelope,
                                       AMQP.BasicProperties properties, byte[] body) throws IOException {
                String message = new String(body, "UTF-8");
                System.out.println("Received message: " + message);
            }
        };
        channel.basicConsume(QUEUE_NAME, true, consumer);
    }
}

위 예제는 RabbitMQ를 사용하여 메시지를 풀 방식으로 수신하는 방식의 간단한 코드입니다. ConnectionFactory를 사용하여 RabbitMQ에 연결하고, queueDeclare 메서드를 통해 큐를 선언합니다. 그리고 basicConsume 메서드를 사용하여 메시지를 수신합니다.

결론

ActiveMQ와 RabbitMQ는 모두 메시지를 관리하고 전달하는 우수한 오픈소스 메시지 브로커입니다. ActiveMQ는 메시지를 푸시 방식으로 처리하며, RabbitMQ는 메시지를 풀 방식으로 처리합니다. 이러한 차이점을 이해하고, 프로젝트의 요구사항에 맞게 적절한 메시지 브로커를 선택할 수 있습니다.

참고 자료