Use when adding new error messages to React, or seeing "unknown error code" warnings.
npx skills add Mindrally/skills --skill "rabbitmq-development"
Install specific skill from multi-skill repository
# Description
Best practices and guidelines for RabbitMQ message queue development with AMQP protocol
# SKILL.md
name: rabbitmq-development
description: Best practices and guidelines for RabbitMQ message queue development with AMQP protocol
RabbitMQ Development
You are an expert in RabbitMQ and AMQP (Advanced Message Queuing Protocol) development. Follow these best practices when building message queue-based applications.
Core Principles
- RabbitMQ is a message broker that receives messages from publishers and routes them to consumers
- AMQP 0-9-1 is the most commonly used protocol - an application layer protocol transmitting data in binary format
- Design for reliability, scalability, and fault tolerance
- Leave NO todos, placeholders, or missing pieces in the implementation
Architecture Components
Exchanges
- Direct Exchange: Routes based on exact routing key match - use for unicast routing
- Fanout Exchange: Routes to all bound queues regardless of routing key - use for broadcast
- Topic Exchange: Routes based on wildcard pattern matching - use for multicast routing
- Headers Exchange: Routes based on message header attributes - use for complex routing logic
Queues
- Queues store messages until consumed
- Can be durable (survives broker restart) or transient (in-memory only)
- Metadata of durable queues is stored on disk
- Metadata of transient queues is stored in memory when possible
Bindings
- Connect exchanges to queues with routing rules
- Binding keys determine which messages reach which queues
- Multiple bindings can connect the same exchange to multiple queues
Queue Management Best Practices
Queue Size
- Keep queue sizes small - large queues put heavy load on RAM usage
- RabbitMQ flushes messages to disk when RAM is constrained, impacting performance
- Monitor queue depth and implement backpressure mechanisms
- Use TTL (Time-To-Live) to automatically remove old messages
Queue Types
Classic Queues
- Traditional RabbitMQ queue implementation
- Good for most use cases
- Supports all features (lazy queues, priorities, etc.)
Quorum Queues (Recommended)
- Introduced in RabbitMQ 3.8
- Replicated queue type for high availability and data safety
- Declare with
x-queue-type: quorum - Use for queues requiring durability and fault tolerance
- Cannot be set via policy - must be declared by client
Performance Optimization
- Use transient messages for fastest throughput when durability isn't required
- Persistent messages are written to disk immediately, affecting throughput
- Queues are single-threaded - one queue handles up to ~50,000 messages
- Use multiple queues for better throughput on multi-core systems
- Have as many queues as cores on the underlying nodes
Connection and Channel Management
Connections
- Each connection uses approximately 100 KB of RAM (more with TLS)
- Thousands of connections can burden the server significantly
- Implement connection pooling in your applications
- Reuse connections where possible
Channels
- Channels are lightweight connections multiplexing a single TCP connection
- Publishing and consuming happens over channels
- Create channels per thread/operation, not per message
- Close channels when no longer needed to free resources
Prefetch and Consumer Configuration
Prefetch (QoS)
- Prefetch defines how many unacknowledged messages a consumer receives at once
- Setting prefetch optimizes consumer throughput
- Low prefetch (1-10): Fair distribution, good for slow consumers
- High prefetch (100+): Better throughput, risk of uneven distribution
- Start with a moderate value (50-100) and tune based on metrics
Acknowledgments
- Auto-ack: Higher throughput, least guarantees on failures
- Manual-ack: Lower throughput, better reliability
- Consider manual acknowledgment mode first as a rule of thumb
- Acknowledge promptly after processing to release server resources
Message Handling
Message Properties
- Set
delivery_mode=2for persistent messages (survives broker restart) - Use
content_typeto indicate payload format - Include
correlation_idfor request/response patterns - Set
expirationfor time-sensitive messages
Publishing Best Practices
- Use publisher confirms for reliable publishing
- Handle returned messages (mandatory flag) appropriately
- Batch messages when possible for better throughput
- Consider message size - large messages impact performance
Error Handling
Dead Letter Exchanges
- Configure DLX for handling failed messages
- Messages routed to DLX when: rejected with requeue=false, TTL expires, queue length exceeded
- Process dead-lettered messages separately for analysis and retry
Retry Queues Pattern
- Don't requeue failed messages to the same queue indefinitely
- Risk of self-inflicted DoS attack with continuous retry loops
- Implement retry queues with increasing delays
- Forward problematic messages to a "timeout" queue
- Example delays: 1s, 5s, 30s, then dead letter
Circuit Breaker
- Implement circuit breaker pattern for downstream failures
- Prevent queue buildup when consumers can't process messages
- Use exponential backoff for reconnection attempts
High Availability
Clustering
- Deploy RabbitMQ in a cluster for high availability
- Use quorum queues for replicated, durable queues
- Configure appropriate number of replicas
Mirroring (Classic Queues)
- Use
ha-modepolicy for classic queue mirroring - Prefer quorum queues over mirrored classic queues for new deployments
Security
Authentication
- Use strong passwords and rotate regularly
- Consider LDAP or OAuth2 integration for enterprise deployments
- Enable TLS for encrypted connections
- Use separate credentials per application/service
Authorization
- Implement vhost-based isolation for multi-tenant scenarios
- Grant minimum necessary permissions (configure, write, read)
- Use permission patterns to restrict access to specific resources
Monitoring and Observability
Key Metrics
- Queue depth (messages ready, messages unacknowledged)
- Message rates (publish, deliver, acknowledge)
- Connection and channel counts
- Memory and disk usage
- Consumer utilization
Management Plugin
- Enable the management plugin for monitoring UI
- Use HTTP API for programmatic monitoring
- Export metrics to Prometheus/Grafana
Alerts
- Alert on queue depth exceeding thresholds
- Monitor memory and disk alarms
- Track consumer disconnections
- Watch for message rate anomalies
Testing
Unit Testing
- Mock RabbitMQ client for isolated testing
- Test message serialization/deserialization
- Verify exchange and queue declarations
Integration Testing
- Use containerized RabbitMQ for tests
- Test failure scenarios (connection loss, broker restart)
- Verify message acknowledgment behavior
- Load test with realistic message rates
Common Patterns
Work Queues (Task Distribution)
- Multiple consumers on single queue for load distribution
- Use prefetch to ensure fair distribution
- Acknowledge after task completion
Publish/Subscribe
- Use fanout exchange for broadcasting
- Each subscriber gets its own queue bound to the exchange
- Consider topic exchange for filtered subscriptions
RPC (Request/Response)
- Use correlation_id to match requests and responses
- Create exclusive reply queue per client
- Implement timeouts for pending requests
Event Sourcing
- Use exchanges for event distribution
- Multiple services can independently consume events
- Maintain event ordering within partitions
# Supported AI Coding Agents
This skill is compatible with the SKILL.md standard and works with all major AI coding agents:
Learn more about the SKILL.md standard and how to use these skills with your preferred AI coding agent.