rust-rabbit π°
A simple, reliable RabbitMQ client library for Rust. Easy to use with minimal configuration and flexible retry mechanisms.
π Key Features
- Simple API: Just
PublisherandConsumerwith essential methods - Flexible Retry: Exponential, linear, or custom retry mechanisms
- Auto-Setup: Automatic queue/exchange declaration and binding
- Built-in Reliability: Default ACK behavior with intelligent error handling
- Zero Complexity: No enterprise patterns, no metrics - just core messaging
π¦ Quick Start
Add to your Cargo.toml:
[]
= "1.2"
= { = "1.0", = ["full"] }
= { = "1.0", = ["derive"] }
π― Basic Usage
Publisher - Send Messages
use ;
use Serialize;
async
Consumer - Receive Messages with Retry
use ;
use ;
async
π Retry Configurations
Built-in Retry Patterns
use RetryConfig;
use Duration;
// Exponential: 1s β 2s β 4s β 8s β 16s (5 retries)
let exponential = exponential_default;
// Custom exponential: 2s β 4s β 8s β 16s β 32s (max 60s)
let custom_exp = exponential;
// Linear: 10s β 10s β 10s (3 retries)
let linear = linear;
// Custom delays: 1s β 5s β 30s
let custom = custom;
// No retries - fail immediately
let no_retry = no_retry;
How Retry Works
// Failed messages are automatically:
// 1. Sent to retry queue with delay (e.g., orders.retry.1)
// 2. After delay, returned to original queue for retry
// 3. If max retries exceeded, sent to dead letter queue (e.g., orders.dlq)
Delay Strategies (TTL vs DelayedExchange)
rust-rabbit supports two strategies for implementing message delays:
1. TTL Strategy (Default) - No Plugin Required
Uses RabbitMQ's TTL feature with temporary retry queues. Simple but less precise.
use ;
use Duration;
let retry_config = exponential_default
.with_delay_strategy; // Default, no plugin needed
// Messages failed are sent to: orders.retry.1 (with TTL set)
// After TTL expires, automatically routed back to: orders
Pros:
- No external plugin required
- Works out-of-the-box with standard RabbitMQ
- Simple setup
Cons:
- Less precise timing (TTL granularity depends on RabbitMQ configuration)
- Creates many temporary queues (one per retry attempt)
- Requires cleanup of old retry queues
2. DelayedExchange Strategy - Better Precision
Uses the rabbitmq_delayed_message_exchange plugin for server-side delay management. More reliable and cleaner architecture.
use ;
use Duration;
let retry_config = exponential_default
.with_delay_strategy;
// Messages are published to: orders.delay (delay exchange)
// With x-delay header set to desired delay time
// Exchange automatically routes back to: orders after delay
Setup Requirements:
-
Install the plugin on RabbitMQ:
# Download from: https://github.com/rabbitmq/rabbitmq-delayed-message-exchange # Place .ez file in RabbitMQ plugins directory # Enable plugin # Restart RabbitMQ -
Use in code:
let retry_config = linear .with_delay_strategy; let consumer = builder .with_retry .build;
β οΈ Important: Plugin is Required
If you use DelayStrategy::DelayedExchange without installing the plugin on RabbitMQ:
- Your application will crash when trying to send messages to the delay exchange
- The delay exchange declaration will fail
- You'll get an error like:
NOT_FOUND - operation not permitted on this exchange
Always ensure the rabbitmq_delayed_message_exchange plugin is installed and enabled before deploying code that uses DelayStrategy::DelayedExchange.
Pros:
- More precise timing (microsecond-level)
- Cleaner architecture (single delay exchange)
- Better for high-volume scenarios
- Lower memory footprint on RabbitMQ
- Built-in reliability
Cons:
- Requires external plugin installation
- Plugin adds complexity to RabbitMQ setup
- Small performance overhead for delay management
Flow Diagram:
DelayedExchange Strategy Flow:
ββββββββββββ
β Queue β (e.g., "orders")
ββββββ¬ββββββ
β
ββ> Handler fails βββ
β β
β Publish to
β Delay Exchange
β β
ββββββββββββ ββββββββΌβββββββ
β orders.delay β (x-delay: 5000ms)
ββββββββ¬ββββββββ
β
After delay
β
ββββββββΌβββββββ
β Queue β
β (orders) β
βββββββββββββββ
Example:
See delayed_exchange_example.rs for a complete working example.
ποΈ Dead Letter Queue (DLQ) with Auto-Cleanup
For failed messages that exceed max retries, rust-rabbit automatically sends them to a Dead Letter Queue (DLQ). Now you can set automatic cleanup with TTL:
let retry_config = exponential_default
.with_dlq_ttl; // Auto-cleanup after 1 day
let consumer = builder
.with_retry
.build;
Flow:
Original Queue (orders)
β
Retries exhausted
β
Message β DLQ (orders.dlq) [TTL: 86400s]
β
After 1 day: Message auto-deleted by RabbitMQ
β
β No manual cleanup needed!
Configuration Options:
use Duration;
// 1 hour (fresh failed messages)
.with_dlq_ttl
// 1 day (default retention)
.with_dlq_ttl
// 1 week (long retention for analysis)
.with_dlq_ttl
// No TTL (manual cleanup only - default)
// Don't call .with_dlq_ttl()
Monitoring DLQ:
- Open RabbitMQ Management: http://localhost:15672
- Go to "Queues" tab
- Find "orders.dlq" queue
- Check "x-message-ttl" in queue details
- Monitor "Message count" to see failed messages
See dlq_ttl_example.rs for complete example.
π MassTransit Integration (v1.2.0)
rust-rabbit seamlessly integrates with C# services using MassTransit. You can both consume and publish MassTransit-compatible messages.
Publishing to MassTransit Services
New in v1.2.0: Publish messages that MassTransit will accept and route correctly. Use the with_masstransit() option:
use ;
use Serialize;
async
Key Features:
- β
Message Type Format: Accepts
"Namespace:TypeName"or"urn:message:Namespace:TypeName"(auto-converts to URN) - β
Full Compatibility: Sets
messageTypearray in envelope body andMT-Host-MessageTypeheader - β Validation: Messages pass MassTransit's strict validation (won't go to skip queue)
- β Backward Compatible: Existing code works without changes (MassTransit is optional)
See masstransit_option_example.rs for complete examples.
Consuming MassTransit Messages
When a C# service publishes messages via MassTransit's IBus, rust-rabbit automatically:
- Detects MassTransit's camelCase JSON envelope format
- Extracts the actual message payload from the
messagefield - Preserves
correlationIdfor tracking operations - Maintains all existing retry logic
use ;
use ;
async
How It Works
Publishing:
- When
with_masstransit()is used, your message is wrapped in MassTransit's envelope format - Message type is set as an array of URNs:
["urn:message:Namespace:TypeName"] - All required fields are auto-populated (messageId, sentTime, sourceAddress, etc.)
- MassTransit services will accept and route the message correctly
Consuming:
- Automatic Format Detection: The consumer tries to deserialize as MassTransit format first, then falls back to rust-rabbit format
- Message Extraction: MassTransit's
messagefield is automatically extracted to your Rust type - Correlation Tracking: The
correlationIdfrom MassTransit is preserved for retries - Retry Compatibility: Failed messages are retried using rust-rabbit's format (simpler, maintains retry tracking)
MassTransit Message Format
MassTransit wraps messages in this structure (camelCase JSON):
rust-rabbit automatically handles both publishing and consuming this format seamlessly.
See examples:
- MassTransit Option Example - Publishing with MassTransit option
- MassTransit Publisher Example - Using dedicated MassTransit methods
βοΈ Advanced Features
MessageEnvelope System
For advanced retry tracking and error handling, use the MessageEnvelope system:
use ;
use ;
async
Connection Options
use Connection;
// Simple connection
let connection = new.await?;
// Different connection URLs
let local = new.await?;
let remote = new.await?;
let secure = new.await?;
Publisher Options
use PublishOptions;
let options = new
.mandatory // Make delivery mandatory
.priority; // Message priority (0-255)
publisher.publish_to_queue.await?;
Consumer Options
let consumer = builder
.with_retry
.bind_to_exchange // Exchange binding with routing key
.with_prefetch // Process 10 messages in parallel
.build;
π Documentation
For detailed guides and advanced topics:
- Retry Configuration Guide - Detailed retry patterns and configuration
- Exchange & Queue Management - Queue binding, exchange types, and best practices
- Error Handling - Error types and handling strategies
- Best Practices - Production tips and patterns
π οΈ Examples
See the examples/ directory for complete working examples:
- Basic Publisher - Simple message publishing
- Basic Consumer - Simple message consumption
- MassTransit Option Example - Publishing with MassTransit option
- MassTransit Publisher Example - Using dedicated MassTransit methods
- Retry Examples - Different retry configurations
- Delayed Exchange Example - Using rabbitmq_delayed_message_exchange plugin
- DLQ TTL Example - Auto-cleanup Dead Letter Queue with TTL
- Production Setup - Production-ready configuration
π§ͺ Testing
Run the tests:
For integration tests with real RabbitMQ:
# Start RabbitMQ with Docker
# Run integration tests
π§ Requirements
- Rust: 1.70+
- RabbitMQ: 3.8+
- Tokio: Async runtime
π¦ Migration from v0.x
If you're upgrading from the complex v0.x version:
// OLD (v0.x) - Complex
let consumer = new.await?;
// NEW (v1.0) - Simple
let consumer = builder
.with_retry
.with_prefetch
.build;
Major Changes:
- β
Simplified API with just
PublisherandConsumer - β Removed enterprise patterns (saga, event sourcing, request-response)
- β Removed metrics and health monitoring
- β Unified retry system with flexible mechanisms
- β Auto-declare queues and exchanges by default
π― Design Philosophy
rust-rabbit v1.0 follows these principles:
- Simplicity First: Only essential features, no bloat
- Reliability Built-in: Automatic retry and error handling
- Easy Configuration: Sensible defaults, minimal setup
- Production Ready: Persistent messages, proper ACK handling
- Developer Friendly: Clear errors, good documentation
πΊοΈ Roadmap
See ROADMAP.md for planned features:
- Connection pooling and load balancing
- Monitoring and metrics integration
- Advanced retry patterns and policies
- Performance optimizations
- Additional messaging patterns
π License
MIT License - see LICENSE for details.
π€ Contributing
Contributions welcome! Please read our contributing guide and submit pull requests.
π¬ Support
- Issues: GitHub Issues
- Discussions: GitHub Discussions
- Documentation: docs.rs
Made with β€οΈ by the rust-rabbit team