0
0
RabbitMQdevops~5 mins

Queue TTL and auto-expiry in RabbitMQ - Commands & Configuration

Choose your learning style9 modes available
Introduction
Sometimes messages or queues in RabbitMQ should only live for a limited time. Queue TTL and auto-expiry help automatically remove old messages or unused queues to keep the system clean and efficient.
When you want messages to be discarded if they are not consumed within a certain time.
When you want queues to be deleted automatically if they are unused for a while.
When you want to avoid building up stale messages that waste memory.
When you want to ensure temporary queues do not stay forever after use.
When you want to control resource usage by cleaning up old data automatically.
Config File - queue_ttl_policy.json
queue_ttl_policy.json
{
  "name": "ttl-policy",
  "pattern": "^ttl-queue$",
  "definition": {
    "message-ttl": 60000,
    "expires": 120000
  },
  "priority": 0,
  "apply-to": "queues"
}

This JSON defines a policy named ttl-policy that applies to queues named exactly ttl-queue.

message-ttl sets messages to expire after 60000 milliseconds (1 minute).

expires sets the queue to auto-delete if unused for 120000 milliseconds (2 minutes).

This policy helps remove old messages and delete unused queues automatically.

Commands
This command creates a policy named ttl-policy that sets message TTL to 60000 ms and queue auto-expiry to 120000 ms for queues named ttl-queue.
Terminal
rabbitmqctl set_policy ttl-policy "^ttl-queue$" '{"message-ttl":60000,"expires":120000}' --apply-to queues
Expected OutputExpected
Setting policy "ttl-policy" for pattern "^ttl-queue$" to "{\"message-ttl\":60000,\"expires\":120000}" with priority 0 and apply-to queues
--apply-to - Specifies that the policy applies to queues
This command creates a queue named ttl-queue that the policy will apply to.
Terminal
rabbitmqadmin declare queue name=ttl-queue durable=false
Expected OutputExpected
{ "queue": "ttl-queue", "message_count": 0, "consumer_count": 0 }
This command lists queues with their ready and unacknowledged message counts to verify the queue state.
Terminal
rabbitmqctl list_queues name messages_ready messages_unacknowledged
Expected OutputExpected
Listing queues ... name messages_ready messages_unacknowledged ttl-queue 0 0
Key Concept

If you remember nothing else from this pattern, remember: message TTL removes old messages automatically, and queue expires deletes unused queues to keep RabbitMQ clean.

Common Mistakes
Setting message TTL on the queue without applying a policy or creating the queue with TTL arguments.
The TTL settings won't take effect unless applied correctly via policy or queue arguments.
Use rabbitmqctl set_policy with --apply-to queues or declare the queue with TTL arguments.
Confusing message TTL with queue expiry and expecting one to do the other's job.
Message TTL only expires messages, queue expiry deletes the queue if unused; they are separate settings.
Set both message-ttl and expires if you want both behaviors.
Using very short TTL or expiry values in production without testing.
Messages or queues may be deleted too soon, causing lost data or service disruption.
Test TTL and expiry values carefully to balance cleanup and availability.
Summary
Create a policy with message-ttl and expires to control message and queue lifetimes.
Apply the policy to queues matching a name pattern to automate cleanup.
Verify queue creation and message counts to monitor TTL and expiry effects.