关于 rabbitmq-master
面向使用 RabbitMQ 的开发者与运维人员的实践技能,涵盖消息传递模式、高可用性、性能调优和监控。内容还包括连接与队列管理脚本、配置模板及排障参考。
主要功能
- 01可靠发布与消费模式
- 02死信交换器和延迟消息模式
- 03仲裁队列与流队列配置
- 04预取和批量发布调优
- 05监控、健康检查与排障资料
- 06连接池及队列管理脚本
适用场景
- 01构建可靠的 RabbitMQ 消息处理流程
- 02配置高可用队列和消息重放
- 03调优消费者预取及批量发布
- 04检查集群健康状况和队列积压
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ modra40/ claude-codex-skills-directory --skill rabbitmq-master安装后在 Claude Code 中输入/rabbitmq-master确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
MANIFEST.jsonreferences/capacity-planning.mdclustering.mdconsumer-design.mddisaster-recovery.mdmonitoring.mdmulti-tenant-rabbitmq.mdoperations-and-upgrades.mdpatterns.mdperformance.mdpublisher-confirms-and-delivery.mdquorum-vs-classic-vs-streams.mdretries-dlq-and-backoff.mdsecurity.mdtopology-design.mdtroubleshooting.mdscripts/async_publisher.pyconnection_pool.pypackage_skill.py详细介绍
RabbitMQ 专家技能
构建坚如磐石的消息系统所需的 RabbitMQ 专家级知识。
快速参考
连接最佳实践
# WRONG - Connection per message (kills performance)
def send_bad(msg):
conn = pika.BlockingConnection(params) # 7-way TCP handshake + AMQP handshake
ch = conn.channel()
ch.basic_publish(...)
conn.close()
# CORRECT - Connection pooling with heartbeat
import pika
from pika import ConnectionParameters, PlainCredentials
params = ConnectionParameters(
host='rabbitmq.prod',
port=5672,
credentials=PlainCredentials('user', 'pass'),
heartbeat=60, # Detect dead connections
blocked_connection_timeout=300, # Handle flow control
connection_attempts=3,
retry_delay=5,
socket_timeout=10,
stack_timeout=15,
# CRITICAL: TCP keepalive untuk cloud/NAT environments
tcp_options={'TCP_KEEPIDLE': 60, 'TCP_KEEPINTVL': 10, 'TCP_KEEPCNT': 3}
)
# Use connection pool - see scripts/connection_pool.py
通道最佳实践
# Channels are NOT thread-safe - use 1 channel per thread
# Channels are cheap - create many, but not per message
# OPTIMAL: Dedicated channels per purpose
publish_channel = conn.channel()
publish_channel.confirm_delivery() # Enable publisher confirms
consume_channel = conn.channel()
consume_channel.basic_qos(prefetch_count=50) # Tuned prefetch
核心模式
1. 可靠发布(发布者确认)
# Synchronous confirms (simple, slower)
channel.confirm_delivery()
try:
channel.basic_publish(
exchange='orders',
routing_key='new',
body=json.dumps(order),
properties=pika.BasicProperties(
delivery_mode=2, # Persistent
content_type='application/json',
message_id=str(uuid4()), # Idempotency key
timestamp=int(time.time()),
headers={'retry_count': 0}
),
mandatory=True # Return if unroutable
)
except pika.exceptions.UnroutableError:
handle_unroutable()
except pika.exceptions.NackError:
handle_nack()
# Asynchronous confirms (complex, 10x faster) - see scripts/async_publisher.py
2. 可靠消费
def callback(ch, method, properties, body):
try:
# ALWAYS process idempotently using message_id
if is_duplicate(properties.message_id):
ch.basic_ack(method.delivery_tag)
return
process_message(body)
mark_processed(properties.message_id)
ch.basic_ack(method.delivery_tag)
except RecoverableError as e:
# Requeue with exponential backoff via DLX
retry_count = (properties.headers or {}).get('retry_count', 0)
if retry_count < MAX_RETRIES:
republish_with_delay(ch, body, retry_count + 1)
ch.basic_ack(method.delivery_tag) # Ack original
else:
ch.basic_nack(method.delivery_tag, requeue=False) # To DLQ
except FatalError:
# Permanent failure - dead letter immediately
ch.basic_nack(method.delivery_tag, requeue=False)
channel.basic_qos(prefetch_count=50) # CRITICAL - tune this!
channel.basic_consume(queue='orders', on_message_callback=callback)
3. 死信交换机模式
# DLX captures: rejected, expired, queue-full messages
channel.exchange_declare('dlx.exchange', 'direct', durable=True)
channel.queue_declare('dlq.orders', durable=True)
channel.queue_bind('dlq.orders', 'dlx.exchange', 'orders')
# Main queue with DLX
channel.queue_declare(
'orders',
durable=True,
arguments={
'x-dead-letter-exchange': 'dlx.exchange',
'x-dead-letter-routing-key': 'orders',
'x-message-ttl': 86400000, # 24h max age
'x-max-length': 1000000, # Max 1M messages
'x-overflow': 'reject-publish-dlx' # DLX on overflow
}
)
4. 延迟/定时消息
# Method 1: Plugin (rabbitmq_delayed_message_exchange)
channel.exchange_declare(
'delayed.exchange',
'x-delayed-message',
arguments={'x-delayed-type': 'direct'}
)
channel.basic_publish(
exchange='delayed.exchange',
routing_key='scheduled',
body=payload,
properties=pika.BasicProperties(
headers={'x-delay': 60000} # 60 seconds delay
)
)
# Method 2: TTL + DLX chain (no plugin needed) - see references/patterns.md
5. 优先级队列
# CAUTION: Priority queues have overhead, use sparingly
channel.queue_declare(
'priority.orders',
durable=True,
arguments={
'x-max-priority': 10, # 1-10 priorities, keep low!
'x-queue-type': 'classic' # Not supported on quorum
}
)
# Publishing with priority
channel.basic_publish(
exchange='',
routing_key='priority.orders',
body=payload,
properties=pika.BasicProperties(
delivery_mode=2,
priority=8 # Higher = more important
)
)
高可用性
仲裁队列(推荐用于高可用)
# Raft-based replication - ALWAYS use for critical queues
channel.queue_declare(
'orders.quorum',
durable=True,
arguments={
'x-queue-type': 'quorum',
'x-quorum-initial-group-size': 3, # Replicas
'x-delivery-limit': 5, # Auto-DLQ after 5 redeliveries
'x-dead-letter-exchange': 'dlx',
'x-dead-letter-strategy': 'at-least-once' # Safe DLQ
}
)
流队列(高吞吐量、可重放)
# Kafka-like streams in RabbitMQ 3.9+
channel.queue_declare(
'events.stream',
durable=True,
arguments={
'x-queue-type': 'stream',
'x-max-length-bytes': 20_000_000_000, # 20GB retention
'x-max-age': '7D', # 7 days retention
'x-stream-max-segment-size-bytes': 500_000_000
}
)
# Consuming from offset
channel.basic_qos(prefetch_count=100)
channel.basic_consume(
'events.stream',
callback,
arguments={
'x-stream-offset': 'first' # first|last|next|timestamp|offset
}
)
性能调优
预取优化公式
optimal_prefetch = (avg_processing_time_ms / avg_network_rtt_ms) * consumer_count * 1.5
Examples:
- Same datacenter (1ms RTT), 50ms processing, 1 consumer: (50/1) * 1 * 1.5 = 75
- Cross-region (50ms RTT), 50ms processing, 1 consumer: (50/50) * 1 * 1.5 = 2
- Batch processing (500ms), local: (500/1) * 1 * 1.5 = 750
批量发布(吞吐量提升 10 倍)
# Single publish: ~2000 msg/s
# Batch publish: ~20000+ msg/s
def batch_publish(channel, messages, batch_size=100):
channel.confirm_delivery()
for i in range(0, len(messages), batch_size):
batch = messages[i:i+batch_size]
for msg in batch:
channel.basic_publish(
exchange='batch.exchange',
routing_key=msg['key'],
body=msg['body'],
properties=pika.BasicProperties(delivery_mode=2)
)
# Confirm entire batch
channel.wait_for_confirms(timeout=30)
内存管理
%% rabbitmq.conf - Production settings
vm_memory_high_watermark.relative = 0.6
vm_memory_high_watermark_paging_ratio = 0.75
disk_free_limit.absolute = 5GB
%% Queue memory limits
queue_index_embed_msgs_below = 4096
lazy_queue_explicit_gc_run_operation_threshold = 1000
%% Flow control tuning
credit_flow_default_credit = {400, 200}
监控与告警
关键指标
# Prometheus alerts - see references/monitoring.md for full config
- alert: RabbitMQHighMemory
expr: rabbitmq_process_resident_memory_bytes / rabbitmq_resident_memory_limit_bytes > 0.8
- alert: RabbitMQQueueBacklog
expr: rabbitmq_queue_messages_ready > 100000
- alert: RabbitMQConsumerUtilization
expr: rabbitmq_queue_consumer_utilisation < 0.5 # Consumers idle = problem
- alert: RabbitMQUnackedMessages
expr: rabbitmq_queue_messages_unacknowledged > 10000
- alert: RabbitMQDiskAlarm
expr: rabbitmq_alarms_free_disk_space_watermark == 1
健康检查脚本
# See scripts/health_check.sh for complete implementation
rabbitmqctl node_health_check
rabbitmqctl cluster_status
rabbitmq-diagnostics check_port_connectivity
rabbitmq-diagnostics check_running
rabbitmq-diagnostics check_local_alarms
应避免的反模式
| 反模式 | 问题 | 解决方案 |
|---|---|---|
| 每条消息创建一个连接 | 开销增加 1000 倍 | 使用连接池 |
| 不设置预取(无限制) | 内存耗尽 | 调整 prefetch_count |
auto_ack=True | 消息丢失 | 处理完成后手动确认 |
| 使用经典队列实现高可用 | 脑裂风险 | 使用仲裁队列 |
| 使用 basic_get 轮询 | 浪费 CPU,增加延迟 | 使用 basic_consume |
| 巨型消息(>128KB) | 内存压力 | 使用外部存储并保存引用 |
| 未设置消息 TTL | 队列膨胀 | 设置 x-message-ttl |
| 队列无限增长 | 磁盘/内存耗尽 | 设置 x-max-length 和溢出策略 |
文件参考
scripts/connection_pool.py- 生产级连接池scripts/async_publisher.py- 支持确认机制的高吞吐量异步发布者scripts/consumer_template.py- 带重试逻辑的健壮消费者scripts/health_check.sh- 全面的健康检查脚本scripts/queue_migrate.py- 零停机队列迁移工具scripts/dlq_processor.py- 死信队列重新处理references/patterns.md- 高级消息模式深入解析references/clustering.md- 高可用集群配置references/security.md- 安全加固指南references/monitoring.md- 完整监控配置references/troubleshooting.md- 问题诊断指南references/performance.md- 性能调优深入解析assets/rabbitmq.conf- 生产环境配置模板assets/docker-compose.yml- 开发集群配置assets/k8s/- Kubernetes 部署清单
评论
支持 Markdown