mcpField
R
rabbitmq-master

rabbitmq-master

github.com/modra40开发546 次安装32 周前更新
代码仓库

关于 rabbitmq-master

面向使用 RabbitMQ 的开发者与运维人员的实践技能,涵盖消息传递模式、高可用性、性能调优和监控。内容还包括连接与队列管理脚本、配置模板及排障参考。

主要功能

  1. 01可靠发布与消费模式
  2. 02死信交换器和延迟消息模式
  3. 03仲裁队列与流队列配置
  4. 04预取和批量发布调优
  5. 05监控、健康检查与排障资料
  6. 06连接池及队列管理脚本

适用场景

  1. 01构建可靠的 RabbitMQ 消息处理流程
  2. 02配置高可用队列和消息重放
  3. 03调优消费者预取及批量发布
  4. 04检查集群健康状况和队列积压

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/modra40/claude-codex-skills-directory --skill rabbitmq-master

安装后在 Claude Code 中输入/rabbitmq-master确认已加载。

包含的文件

除 SKILL.md 外,安装时一起下载的参考资料和脚本。

MANIFEST.json
references/
capacity-planning.md
clustering.md
consumer-design.md
disaster-recovery.md
monitoring.md
multi-tenant-rabbitmq.md
operations-and-upgrades.md
patterns.md
performance.md
publisher-confirms-and-delivery.md
quorum-vs-classic-vs-streams.md
retries-dlq-and-backoff.md
security.md
topology-design.md
troubleshooting.md
scripts/
async_publisher.py
connection_pool.py
package_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