지연 메시지 플러그인
RabbitMQ Delayed Message Exchange 플러그인을 사용하여 지연된 메시지 전달을 구현합니다. 사용자 지정 타이머 없이 메시지가 미래의 특정 시점에 처리되도록 예약합니다.
지연 메시지 플러그인은(는) CoddyKit의 무료 RabbitMQ Messaging & Async Systems 강의입니다. 이것은 4개 중 1번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 RabbitMQ Messaging & Async Systems 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. RabbitMQ Messaging & Async Systems 강의에는 총 4개의 강의가 포함되어 있습니다.
이 강의의 일부는 아직 번역되지 않았으며 영어로 표시됩니다.
What are Delayed Messages?
Sometimes you don't want a message processed immediately. Think of sending a reminder email an hour from now, or processing a payment 30 minutes after an order is placed.
Delayed messages allow you to publish a message to RabbitMQ, but tell the broker to hold onto it for a specific duration before delivering it to consumers.
Scheduling Without the Plugin
Without a dedicated feature, scheduling messages can be complex:
- Custom Timers: You might build your own service with timers, but this adds complexity and a single point of failure.
- Polling Databases: Storing messages in a database and periodically checking for due times is inefficient.
- External Schedulers: Using CRON jobs or other external schedulers still requires your application to manage the message state.
RabbitMQ's Delayed Message Plugin simplifies this greatly!
Meet the `x-delayed-message` Plugin
The RabbitMQ Delayed Message Exchange plugin provides a special exchange type that can hold messages and release them after a specified delay.
It acts like a buffer, managing the delay internally without requiring your application to keep track of message timings.
This makes scheduling messages much simpler and more robust.
Delayed Exchange Mechanics
When you publish a message to an `x-delayed-message` exchange, you include a special header: x-delay. This header's value is the delay in milliseconds.
The exchange holds the message until its delay expires. Once expired, the message is routed to queues exactly as if it were a regular message published to an exchange of its original type (e.g., direct, fanout, topic).
Enabling the Plugin (Admin)
Before using it, the plugin must be enabled on your RabbitMQ server. This is typically done via the command line:
rabbitmq-plugins enable rabbitmq_delayed_message_exchangeA server restart might be required for the changes to take effect. Always ensure your broker has the plugin enabled before attempting to use it.
Declaring a Delayed Exchange
To use delayed messages, you first declare an exchange with the type x-delayed-message. You also specify its underlying type (e.g., direct, fanout, topic) which determines how messages are routed after the delay.
Here's how to declare a delayed direct exchange in Java:
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
import java.util.HashMap;
import java.util.Map;
public class DeclareDelayedExchange {
private static final String EXCHANGE_NAME = "my_delayed_exchange";
public static void main(String[] argv) throws Exception {
ConnectionFactory factory = new ConnectionFactory();
factory.setHost("localhost"); // Assuming RabbitMQ is local
try (Connection connection = factory.newConnection();
Channel channel = connection.createChannel()) {
Map<String, Object> args = new HashMap<>();
args.put("x-delayed-type", "direct"); // Underlying exchange type
channel.exchangeDeclare(EXCHANGE_NAME, "x-delayed-message", true, false, args);
System.out.println("Delayed exchange '" + EXCHANGE_NAME + "' declared.");
}
}
}Sending with `x-delay` Header
When publishing to your x-delayed-message exchange, you add an x-delay header to your message properties. The value is an integer representing the delay in milliseconds.
Let's send a message that will be delivered after 5 seconds (5000 milliseconds).
import com.rabbitmq.client.AMQP;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
import java.util.HashMap;
import java.util.Map;
public class DelayedMessageProducer {
private static final String EXCHANGE_NAME = "my_delayed_exchange";
private static final String ROUTING_KEY = "delayed.key";
public static void main(String[] argv) throws Exception {
ConnectionFactory factory = new ConnectionFactoryFactory();
factory.setHost("localhost");
try (Connection connection = factory.newConnection();
Channel channel = connection.createChannel()) {
// Ensure the delayed exchange is declared (from previous scene)
Map<String, Object> args = new HashMap<>();
args.put("x-delayed-type", "direct");
channel.exchangeDeclare(EXCHANGE_NAME, "x-delayed-message", true, false, args);
System.out.println("Exchange declared (if not exists).");
String message = "Hello, delayed world!";
int delayInMs = 5000; // 5 seconds
Map<String, Object> headers = new HashMap<>();
headers.put("x-delay", delayInMs); // Set the delay header
AMQP.BasicProperties props = new AMQP.BasicProperties.Builder()
.headers(headers)
.build();
channel.basicPublish(EXCHANGE_NAME, ROUTING_KEY, props, message.getBytes("UTF-8"));
System.out.println(" [x] Sent '" + message + "' with delay " + delayInMs + "ms");
}
}
}Consuming Delayed Messages
Consumers don't need any special logic to receive delayed messages. Once the delay expires, the x-delayed-message exchange routes the message to the bound queues, and consumers receive it like any other message.
The key is that the message arrives at the consumer after the specified delay. You'll need to bind a queue to your delayed exchange with the appropriate routing key.
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
import com.rabbitmq.client.DeliverCallback;
import java.nio.charset.StandardCharsets;
import java.util.Date;
public class DelayedMessageConsumer {
private static final String EXCHANGE_NAME = "my_delayed_exchange";
private static final String QUEUE_NAME = "delayed_queue";
private static final String ROUTING_KEY = "delayed.key";
public static void main(String[] argv) throws Exception {
ConnectionFactory factory = new ConnectionFactory();
factory.setHost("localhost");
Connection connection = factory.newConnection();
Channel channel = connection.createChannel();
// Declare the queue and bind it to the delayed exchange
channel.queueDeclare(QUEUE_NAME, true, false, false, null);
channel.queueBind(QUEUE_NAME, EXCHANGE_NAME, ROUTING_KEY);
System.out.println(" [*] Waiting for messages. To exit press CTRL+C");
DeliverCallback deliverCallback = (consumerTag, delivery) -> {
String message = new String(delivery.getBody(), StandardCharsets.UTF_8);
System.out.println(" [x] Received '" + message + "' at " + new Date());
};
channel.basicConsume(QUEUE_NAME, true, deliverCallback, consumerTag -> {});
}
}Common Use Cases
Delayed messages are incredibly useful for:
- Reminders: Send a notification after a user's trial expires.
- Scheduled Tasks: Process a batch job at a specific time in the future.
- Retry Mechanisms: Requeue a failed message to be retried after a delay.
- Drip Campaigns: Send a series of emails over several days.
They remove the need for complex external scheduling services.
Quick Check: Delayed Message Basics
You've learned how to declare an x-delayed-message exchange and publish messages with a delay. Let's test your understanding.
Recap: Delayed Messages Plugin
In this lesson, you learned about the RabbitMQ Delayed Message Exchange plugin. It allows you to schedule messages to be delivered at a future time.
- You declare an exchange with type
x-delayed-messageand an underlying exchange type. - You publish messages with an
x-delayheader (value in milliseconds). - Consumers receive these messages normally, but only after the specified delay.
This powerful feature simplifies many time-based messaging patterns.
자주 묻는 질문
“지연 메시지 플러그인” 강의는 무료인가요?
네 — “지연 메시지 플러그인” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 RabbitMQ Messaging & Async Systems 강의 전체를 잠금 해제할 수 있습니다. RabbitMQ Messaging & Async Systems 강의에는 총 4개의 강의가 포함되어 있습니다.
“지연 메시지 플러그인”에서 뭘 배우나요?
RabbitMQ Delayed Message Exchange 플러그인을 사용하여 지연된 메시지 전달을 구현합니다. 사용자 지정 타이머 없이 메시지가 미래의 특정 시점에 처리되도록 예약합니다. 브라우저에서 직접 실행하는 실습 코드로 RabbitMQ Messaging & Async Systems을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.
RabbitMQ Messaging & Async Systems을(를) 시작하는 데 경험이 필요한가요?
사전 경험은 필요하지 않습니다. CoddyKit의 RabbitMQ Messaging & Async Systems은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 1번째 강의입니다.
“지연 메시지 플러그인” 강의는 얼마나 걸리나요?
대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.
이 RabbitMQ Messaging & Async Systems 강의에서 코드를 작성하고 실행할 수 있나요?
네. 모든 RabbitMQ Messaging & Async Systems 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.