[java] ActiveMQ와 RabbitMQ의 메시지 배달 보장
메시지 큐는 분산 시스템에서 효율적인 메시지 교환을 위한 중요한 기술입니다. ActiveMQ와 RabbitMQ는 인기있는 오픈소스 메시지 큐 솔루션으로 널리 사용되고 있습니다. 이 블로그 포스트에서는 ActiveMQ와 RabbitMQ의 메시지 배달 보장 기능에 대해 알아보겠습니다.
1. 메시지 배달 보장
메시지 배달 보장은 메시지 큐에서 가장 중요한 요구사항 중 하나입니다. 이는 메시지가 안전하게 전달되고 처리되는 것을 보장한다는 의미입니다. ActiveMQ와 RabbitMQ는 다음과 같은 메시지 배달 보장 기능을 제공합니다.
1.1. ActiveMQ
ActiveMQ는 JMS(Java Message Service)를 기반으로 하는 메시지 큐 솔루션입니다. ActiveMQ는 다음과 같은 메시지 배달 보장 기능을 제공합니다.
- At-Least-Once: 메시지는 최소 한 번 이상 전달됩니다. 메시지 큐가 서비스 중지 또는 장애 상황에서도 메시지는 유실되지 않고 보관됩니다.
- Transaction: 메시지를 트랜잭션 단위로 처리할 수 있습니다. 메시지 송수신이 모두 성공적으로 완료되어야만 메시지가 큐에서 제거되고 처리됩니다.
1.2. RabbitMQ
RabbitMQ는 AMQP(Advanced Message Queuing Protocol)를 기반으로 하는 메시지 큐 솔루션입니다. RabbitMQ는 다음과 같은 메시지 배달 보장 기능을 제공합니다.
- Acknowledge: 메시지를 소비자가 명시적으로 확인(acknowledge)해야합니다. 소비자가 메시지를 처리한 후에만 메시지가 큐에서 제거되고 처리됩니다.
- Exchanges and Queues: RabbitMQ는 메시지를 송신하는 측과 수신하는 측을 분리합니다. 메시지는 Exchange를 통해 큐로 라우팅되며, 각 큐는 자신에게 할당된 메시지만 소비합니다.
2. 예제 코드
2.1. ActiveMQ
아래는 ActiveMQ로 메시지를 송신하고 수신하는 예제 코드입니다.
import org.apache.activemq.ActiveMQConnectionFactory;
import javax.jms.*;
public class ActiveMQExample {
public static void main(String[] args) {
try {
// ActiveMQ 연결 설정
ConnectionFactory connectionFactory = new ActiveMQConnectionFactory("tcp://localhost:61616");
Connection connection = connectionFactory.createConnection();
connection.start();
// 메시지 송신
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
Queue queue = session.createQueue("myQueue");
MessageProducer producer = session.createProducer(queue);
Message message = session.createTextMessage("Hello, ActiveMQ!");
producer.send(message);
// 메시지 수신
MessageConsumer consumer = session.createConsumer(queue);
Message receivedMessage = consumer.receive();
if (receivedMessage instanceof TextMessage) {
String text = ((TextMessage) receivedMessage).getText();
System.out.println("Received: " + text);
}
// 연결 종료
session.close();
connection.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
2.2. RabbitMQ
아래는 RabbitMQ로 메시지를 송신하고 수신하는 예제 코드입니다.
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
import com.rabbitmq.client.DeliverCallback;
public class RabbitMQExample {
private final static String QUEUE_NAME = "myQueue";
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);
String message = "Hello, RabbitMQ!";
channel.basicPublish("", QUEUE_NAME, null, message.getBytes());
System.out.println("Sent: " + message);
// 메시지 수신
DeliverCallback deliverCallback = (consumerTag, delivery) -> {
String receivedMessage = new String(delivery.getBody(), "UTF-8");
System.out.println("Received: " + receivedMessage);
};
channel.basicConsume(QUEUE_NAME, true, deliverCallback, consumerTag -> {});
// 연결 종료
channel.close();
connection.close();
}
}
3. 결론
ActiveMQ와 RabbitMQ는 메시지 큐에서 메시지 배달 보장을 위한 다양한 기능을 제공합니다. 이를 통해 분산 시스템에서 안전하고 신뢰성 있는 메시지 교환을 구현할 수 있습니다.
더 자세한 내용은 ActiveMQ 공식 문서와 RabbitMQ 공식 문서를 참조하세요.