Back to guides
Cheatsheet

RabbitMQ Cheatsheet: Complete Reference Guide

| |
RabbitMQ 3.13
| rabbitmq, messaging, amqp, cheatsheet, cli

Quick Start

Installation

# Docker (recommended for development)
docker run -d --name rabbitmq \
  -p 5672:5672 -p 15672:15672 \
  -e RABBITMQ_DEFAULT_USER=admin \
  -e RABBITMQ_DEFAULT_PASS=secret \
  rabbitmq:3.13-management

# Ubuntu/Debian
curl -1sLf 'https://packagecloud.io/rabbitmq/rabbitmq-server/gpgkey' | sudo gpg --dearmor -o /usr/share/keyrings/rabbitmq.gpg
sudo apt-get install rabbitmq-server

# Enable management plugin
rabbitmq-plugins enable rabbitmq_management

Access Points

ServiceDefault URL/PortDescription
AMQP Protocollocalhost:5672Client connections
Management UIhttp://localhost:15672Web interface
Management APIhttp://localhost:15672/apiREST API
Default Credentialsguest/guestLocal only, change in production

CLI Commands (rabbitmqctl)

Cluster Management

# Check cluster status
rabbitmqctl cluster_status

# Join cluster
rabbitmqctl stop_app
rabbitmqctl join_cluster rabbit@node1
rabbitmqctl start_app

# Change cluster node type
rabbitmqctl change_cluster_node_type disc  # or ram

# Remove node from cluster
rabbitmqctl forget_cluster_node rabbit@node2

# Force boot (use when cluster metadata is corrupted)
rabbitmqctl force_boot

User Management

# List users
rabbitmqctl list_users

# Add user
rabbitmqctl add_user username password

# Delete user
rabbitmqctl delete_user username

# Change password
rabbitmqctl change_password username newpassword

# Set user tags (roles)
rabbitmqctl set_user_tags username administrator
rabbitmqctl set_user_tags username monitoring management

# Set permissions (vhost, configure, write, read regex)
rabbitmqctl set_permissions -p / username ".*" ".*" ".*"
rabbitmqctl set_permissions -p /production username "^app-.*" "^app-.*" "^app-.*"

# List permissions
rabbitmqctl list_permissions -p /
rabbitmqctl list_user_permissions username

Virtual Hosts (vhosts)

# List vhosts
rabbitmqctl list_vhosts

# Add vhost
rabbitmqctl add_vhost /production

# Delete vhost (deletes all exchanges, queues, bindings)
rabbitmqctl delete_vhost /old-vhost

# Set vhost limits
rabbitmqctl set_vhost_limits -p / '{"max-connections": 1000}'
rabbitmqctl set_vhost_limits -p / '{"max-queues": 500}'

Queue Management

# List queues with details
rabbitmqctl list_queues name messages consumers memory state

# List all queue info
rabbitmqctl list_queues name messages_ready messages_unacknowledged

# Purge queue
rabbitmqctl purge_queue queue_name -p /

# Delete queue
rabbitmqctl delete_queue queue_name -p /

Exchange Management

# List exchanges
rabbitmqctl list_exchanges name type durable auto_delete

# Delete exchange
rabbitmqctl delete_exchange exchange_name -p /

Connections & Channels

# List connections
rabbitmqctl list_connections name peer_host peer_port state channels

# List channels
rabbitmqctl list_channels connection name number messages_unacknowledged

# Close connection
rabbitmqctl close_connection "<connection_name>" "Maintenance"

# Close all connections
rabbitmqctl close_all_connections "Cluster maintenance"

Health Checks

# Node health
rabbitmqctl node_health_check

# Check if node is running
rabbitmqctl status

# Disk space check
rabbitmqctl check_running
rabbitmqctl check_local_alarms

# Memory check
rabbitmqctl environment | grep memory

Maintenance

# Stop app (keeps Erlang VM running)
rabbitmqctl stop_app

# Start app
rabbitmqctl start_app

# Full restart
rabbitmqctl shutdown
systemctl start rabbitmq-server

# Rotate logs
rabbitmqctl rotate_logs

# Reset node (WARNING: deletes all data)
rabbitmqctl stop_app
rabbitmqctl reset
rabbitmqctl start_app

Configuration (rabbitmq.conf)

Core Settings

# Network & Listeners
listeners.tcp.default = 5672
listeners.ssl.default = 5671

# Management plugin
management.tcp.port = 15672
management.ssl.port = 15671

# Memory limits
vm_memory_high_watermark.relative = 0.6  # 60% of available RAM
vm_memory_high_watermark.absolute = 2GB

# Disk space limits
disk_free_limit.absolute = 5GB
disk_free_limit.relative = 1.5  # 1.5x RAM

# Heartbeat
heartbeat = 60

# Channel max
channel_max = 2048

# Frame max (max message size)
frame_max = 131072  # 128KB

# Default vhost
default_vhost = /

# Default user
default_user = guest
default_pass = guest
default_user_tags.administrator = true

Performance Tuning

# Queue settings
queue_master_locator = min-masters  # Balance queue masters
queue_index_embed_msgs_below = 4096

# Lazy queues (disk-based)
queue_mode = lazy

# Message TTL (milliseconds)
message_ttl = 3600000  # 1 hour

# Consumer timeout
consumer_timeout = 1800000  # 30 minutes

# Connection & channel limits per vhost
vhost_limits.max_connections = 1024
vhost_limits.max_queues = 512

Clustering

# Cluster name
cluster_name = production-cluster

# Cluster partition handling
cluster_partition_handling = autoheal  # or pause_minority

# Network tick time (cluster heartbeat)
net_ticktime = 60

TLS/SSL

listeners.ssl.default = 5671
ssl_options.cacertfile = /path/to/ca_certificate.pem
ssl_options.certfile = /path/to/server_certificate.pem
ssl_options.keyfile = /path/to/server_key.pem
ssl_options.verify = verify_peer
ssl_options.fail_if_no_peer_cert = true
ssl_options.versions.1 = tlsv1.3
ssl_options.versions.2 = tlsv1.2

Management API

Authentication

# Basic auth
curl -u admin:secret http://localhost:15672/api/overview

# Get all vhosts
curl -u admin:secret http://localhost:15672/api/vhosts

Common Endpoints

MethodEndpointDescription
GET/api/overviewCluster overview
GET/api/nodesList all nodes
GET/api/connectionsList connections
GET/api/channelsList channels
GET/api/queuesList all queues
GET/api/queues/{vhost}/{name}Queue details
GET/api/exchangesList exchanges
POST/api/queues/{vhost}/{name}Declare queue
DELETE/api/queues/{vhost}/{name}Delete queue
POST/api/exchanges/{vhost}/{name}Declare exchange
POST/api/bindings/{vhost}/e/{ex}/q/{queue}Create binding

Examples

# Get queue details
curl -u admin:secret http://localhost:15672/api/queues/%2F/my-queue

# Create queue
curl -u admin:secret -X PUT \
  -H "content-type:application/json" \
  -d '{"durable":true,"auto_delete":false}' \
  http://localhost:15672/api/queues/%2F/new-queue

# Purge queue
curl -u admin:secret -X DELETE \
  http://localhost:15672/api/queues/%2F/my-queue/contents

# Get messages (non-destructive)
curl -u admin:secret -X POST \
  -H "content-type:application/json" \
  -d '{"count":10,"ackmode":"ack_requeue_true","encoding":"auto"}' \
  http://localhost:15672/api/queues/%2F/my-queue/get

# Publish message
curl -u admin:secret -X POST \
  -H "content-type:application/json" \
  -d '{"properties":{},"routing_key":"my-queue","payload":"hello","payload_encoding":"string"}' \
  http://localhost:15672/api/exchanges/%2F/amq.default/publish

Client Libraries

Python (pika)

import pika

# Connection
connection = pika.BlockingConnection(
    pika.ConnectionParameters(
        host='localhost',
        port=5672,
        credentials=pika.PlainCredentials('admin', 'secret'),
        heartbeat=60,
        blocked_connection_timeout=300
    )
)
channel = connection.channel()

# Declare queue
channel.queue_declare(
    queue='tasks',
    durable=True,
    arguments={'x-max-length': 10000}
)

# Publish message
channel.basic_publish(
    exchange='',
    routing_key='tasks',
    body='Hello World',
    properties=pika.BasicProperties(
        delivery_mode=2,  # persistent
        content_type='application/json',
        expiration='3600000'  # 1 hour TTL
    )
)

# Consume messages
def callback(ch, method, properties, body):
    print(f"Received {body}")
    ch.basic_ack(delivery_tag=method.delivery_tag)

channel.basic_qos(prefetch_count=10)
channel.basic_consume(queue='tasks', on_message_callback=callback)
channel.start_consuming()

Java (Spring AMQP)

@Configuration
public class RabbitConfig {
    @Bean
    public ConnectionFactory connectionFactory() {
        CachingConnectionFactory factory = new CachingConnectionFactory("localhost");
        factory.setUsername("admin");
        factory.setPassword("secret");
        factory.setRequestedHeartBeat(60);
        factory.setConnectionTimeout(30000);
        return factory;
    }

    @Bean
    public Queue tasksQueue() {
        return QueueBuilder.durable("tasks")
            .maxLength(10000L)
            .ttl(3600000) // 1 hour
            .build();
    }

    @Bean
    public RabbitTemplate rabbitTemplate(ConnectionFactory factory) {
        RabbitTemplate template = new RabbitTemplate(factory);
        template.setMandatory(true);
        template.setMessageConverter(new Jackson2JsonMessageConverter());
        return template;
    }
}

// Publisher
@Service
public class Publisher {
    @Autowired
    private RabbitTemplate template;

    public void send(String message) {
        template.convertAndSend("tasks", message);
    }
}

// Consumer
@Service
public class Consumer {
    @RabbitListener(queues = "tasks", concurrency = "5-10")
    public void process(String message) {
        System.out.println("Received: " + message);
    }
}

Node.js (amqplib)

const amqp = require('amqplib');

async function main() {
  // Connect
  const conn = await amqp.connect({
    protocol: 'amqp',
    hostname: 'localhost',
    port: 5672,
    username: 'admin',
    password: 'secret',
    heartbeat: 60
  });

  const channel = await conn.createChannel();

  // Declare queue
  await channel.assertQueue('tasks', {
    durable: true,
    arguments: { 'x-max-length': 10000 }
  });

  // Publish
  channel.sendToQueue('tasks', Buffer.from('Hello'), {
    persistent: true,
    expiration: '3600000' // 1 hour
  });

  // Consume
  channel.prefetch(10);
  channel.consume('tasks', async (msg) => {
    console.log('Received:', msg.content.toString());
    channel.ack(msg);
  });
}

main().catch(console.error);

Exchange Types & Patterns

Direct Exchange

# Use case: Point-to-point routing
# Routing: Exact routing key match

rabbitmqadmin declare exchange name=logs type=direct durable=true
rabbitmqadmin declare queue name=error-logs durable=true
rabbitmqadmin declare binding source=logs destination=error-logs routing_key=error

Fanout Exchange

# Use case: Broadcast to all queues
# Routing: Ignores routing key

rabbitmqadmin declare exchange name=notifications type=fanout durable=true
rabbitmqadmin declare queue name=email-queue durable=true
rabbitmqadmin declare queue name=sms-queue durable=true
rabbitmqadmin declare binding source=notifications destination=email-queue
rabbitmqadmin declare binding source=notifications destination=sms-queue

Topic Exchange

# Use case: Pattern-based routing
# Routing: Wildcard matching (* = one word, # = zero or more words)

rabbitmqadmin declare exchange name=events type=topic durable=true
rabbitmqadmin declare binding source=events destination=user-created routing_key="user.created.*"
rabbitmqadmin declare binding source=events destination=all-errors routing_key="*.*.error"

Headers Exchange

# Use case: Route by message headers
# Routing: Matches header key-value pairs

rabbitmqadmin declare exchange name=tasks type=headers durable=true
rabbitmqadmin declare binding source=tasks destination=high-priority \
  arguments='{"x-match":"all","priority":"high","type":"critical"}'

Monitoring & Metrics

Key Metrics to Watch

MetricCommandWarning Threshold
Memory Usagerabbitmqctl status | grep memory>70% of limit
Disk Freerabbitmqctl environment | grep disk_free<1.5x RAM
Connectionsrabbitmqctl list_connections | wc -l>80% of limit
Queuesrabbitmqctl list_queues | wc -l>1000 queues
Unacked Messagesrabbitmqctl list_queues messages_unacknowledgedGrowing over time
Message RateCheck Management UISustained >10k msg/s
File Descriptorsrabbitmqctl status>80% of ulimit

Prometheus Metrics

# Enable Prometheus plugin
rabbitmq-plugins enable rabbitmq_prometheus

# Metrics endpoint
curl http://localhost:15692/metrics

# Key metrics:
# - rabbitmq_queue_messages
# - rabbitmq_queue_messages_ready
# - rabbitmq_queue_messages_unacknowledged
# - rabbitmq_connections
# - rabbitmq_channels
# - rabbitmq_erlang_vm_memory_bytes

Production Best Practices

High Availability

PracticeConfigurationBenefit
Quorum Queuesx-queue-type: quorumData safety, replication
Lazy Queuesx-queue-mode: lazyHandle millions of messages
Cluster Size3 or 5 nodes (odd number)Fault tolerance
Load BalancerHAProxy/nginx in frontConnection distribution
Publisher ConfirmsEnable in clientGuaranteed delivery

Queue Configuration

# Production-ready queue
channel.queue_declare(
    queue='tasks',
    durable=True,              # Survive restarts
    arguments={
        'x-queue-type': 'quorum',           # HA queue
        'x-max-length': 100000,             # Limit queue size
        'x-message-ttl': 86400000,          # 24h TTL
        'x-dead-letter-exchange': 'dlx',    # DLX for failed msgs
        'x-dead-letter-routing-key': 'failed.tasks',
        'x-max-priority': 10                # Priority support
    }
)

Performance Tuning

SettingProduction ValueReason
Prefetch Count10-50Balance throughput & fairness
Connection Pool5-10 per appReuse connections
Channel Pool1 per threadChannels not thread-safe
Heartbeat60sDetect dead connections
Publisher ConfirmsEnabledDurability guarantee
Consumer ACK ModeManualControl processing

Security Checklist

# 1. Change default credentials
rabbitmqctl change_password guest "$(openssl rand -base64 32)"
rabbitmqctl delete_user guest  # In production

# 2. Create app-specific users
rabbitmqctl add_user myapp "$(openssl rand -base64 32)"
rabbitmqctl set_permissions -p / myapp "^myapp-.*" "^myapp-.*" "^myapp-.*"

# 3. Enable TLS
# Add to rabbitmq.conf:
# listeners.ssl.default = 5671
# ssl_options.cacertfile = /path/to/ca.pem
# ssl_options.certfile = /path/to/cert.pem
# ssl_options.keyfile = /path/to/key.pem

# 4. Limit vhost resources
rabbitmqctl set_vhost_limits -p / '{"max-connections": 1024, "max-queues": 500}'

# 5. Enable audit logging
rabbitmq-plugins enable rabbitmq_event_exchange

Troubleshooting

Common Issues

# 1. Connection refused
# Check: Is RabbitMQ running?
systemctl status rabbitmq-server
rabbitmqctl status

# 2. Memory alarm
# Check memory usage
rabbitmqctl environment | grep memory
# Purge unnecessary queues
rabbitmqctl list_queues name messages | sort -k2 -nr
rabbitmqctl purge_queue <large_queue>

# 3. Disk alarm
# Check disk space
df -h
rabbitmqctl environment | grep disk_free_limit
# Clean old logs
rabbitmqctl rotate_logs

# 4. Authentication failed
# List users and permissions
rabbitmqctl list_users
rabbitmqctl list_permissions -p /

# 5. Queue stuck/not processing
# Check consumers
rabbitmqctl list_queues name consumers
rabbitmqctl list_consumers
# Check for blocking
rabbitmqctl list_connections state

# 6. Messages not routing
# Check bindings
rabbitmqctl list_bindings
# Enable tracing (temporarily)
rabbitmqctl trace_on -p /
rabbitmqctl trace_off -p /

Debug Logging

# Enable debug logging
rabbitmqctl set_log_level debug

# Check logs
tail -f /var/log/rabbitmq/[email protected]

# Revert to info level
rabbitmqctl set_log_level info

Quick Reference Tables

Message Properties

PropertyTypeDescriptionExample
delivery_modeint1=transient, 2=persistent2
priorityint0-255 (if queue supports)5
expirationstringTTL in milliseconds"60000"
content_typestringMIME type"application/json"
reply_tostringCallback queue"rpc-replies"
correlation_idstringRequest ID"req-12345"
message_idstringUnique ID"msg-uuid"
timestampintUnix timestamp1640000000

Queue Arguments

ArgumentTypeDescription
x-message-ttlintMessage TTL (ms)
x-expiresintQueue auto-delete after (ms)
x-max-lengthintMax queue size (messages)
x-max-length-bytesintMax queue size (bytes)
x-dead-letter-exchangestringDLX name
x-dead-letter-routing-keystringDLX routing key
x-max-priorityintMax priority (0-255)
x-queue-modestringlazy or default
x-queue-typestringclassic or quorum

Common Ports

PortService
4369Erlang Port Mapper Daemon (epmd)
5672AMQP
5671AMQPS (TLS)
15672Management HTTP
15671Management HTTPS
15692Prometheus metrics
25672Inter-node communication

Resources

Cite this guide

If you reference this guide, please link to the original URL and credit the author.

Michal Drozd. "RabbitMQ Cheatsheet: Complete Reference Guide". https://www.michal-drozd.com/en/guides/rabbitmq-cheatsheet/ (Published December 22, 2025).