Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Design RabbitMQ architectures with exchanges, quorum queues, routing patterns, clustering, dead letter exchanges, and AMQP best practices.
.claude/skills/williamzujkowski-rabbitmq-architecture-designer/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-06 | ✗→✓ | ▲ Improved | 169% | 0% |
| case-01 | ✓→✓ | = Same ✓ | 107% | 0% |
| case-04 | ✓→✓ | = Same ✓ | 191% | 0% |
| case-05 | ✓→✓ | = Same ✓ | 280% | 0% |
| case-07 | ✓→✓ | = Same ✓ | 320% | 0% |
Trigger conditions:
Complements:
integration-messagequeue-designer: For generic message queue pattern selection (RabbitMQ vs Kafka vs SQS)messaging-kafka-architect: For Kafka-specific event streaming architecturesmicroservices-pattern-architect: For saga, CQRS, event sourcing patterns that use RabbitMQOut of scope:
observability-stack-configurator)Time normalization:
NOW_ET using NIST/time.gov semantics (America/New_York, ISO-8601)NOW_ET for all access dates in citationsVerify inputs:
Validate requirements:
Source freshness:
NOW_ET)Abort if:
Scenario: Single exchange, single queue, direct routing, no clustering, basic error handling.
Steps:
order.created → order-processing-queue)* (1 word) and # (0+ words) (e.g., audit.events.# matches audit.events.users.signup)x-queue-type=quorum argumentevents)order-processing-queue)order.created → order-processing-queue)events exchange with routing key order.createdorder-processing-queue with manual ack + prefetch=10Output:
Token budget: ≤2000 tokens
Scenario: Multiple exchanges with complex routing, dead letter exchange for errors, quorum queues, retry with backoff.
Steps:
Pattern: Separate exchanges for different message types or bounded contexts
orders-exchange (topic) → routes to order-processing-queue, order-audit-queuepayments-exchange (topic) → routes to payment-processing-queuenotifications-exchange (fanout) → broadcasts to all notification queuesWildcards:
* matches exactly one word (e.g., order.*.created matches order.online.created but not order.created)# matches zero or more words (e.g., audit.# matches audit.users, audit.users.signup, audit)Example bindings:
order.created → order-processing-queue (exact match)order.# → order-audit-queue (all order events)payment.processed → payment-processing-queuenotification.* → notification-email-queue, notification-sms-queue (broadcast via topic)Use cases:
Configuration via policy (recommended): json { "pattern": "order-processing-queue", "definition": { "dead-letter-exchange": "dlx-exchange", "dead-letter-routing-key": "order.processing.failed", "message-ttl": 86400000, "delivery-limit": 20 } }
DLX topology:
order-processing-queue (quorum)dlx-exchange (topic)dlx-order-processing-queue (quorum, for manual inspection)order.processing.failed → dlx-order-processing-queuePattern: Use TTL + DLX to implement delayed retries
retry-queue-5s (TTL=5s)Example:
order-processing-queueretry-order-5s (TTL=5s, DLX=orders-exchange)retry-order-30s (TTL=30s, DLX=orders-exchange)dlx-order-processing-queue (manual inspection)Arguments:
x-queue-type=quorum (replicated queue)x-quorum-initial-group-size=3 (replication factor, odd number for Raft consensus)x-delivery-limit=20 (max redeliveries before DLX, default in RabbitMQ 4.0+)x-max-priority=2 (RabbitMQ 4.0+ supports exactly 2 priorities: normal and high)Publisher priority:
priority=5 (high priority, delivered 2:1 ratio vs normal)priority=0 or no priority (normal priority)Manual ack (recommended):
basic.ack (remove from queue)basic.nack + requeue=true (redelivery)basic.nack + requeue=false (send to DLX)Prefetch tuning:
Output:
Token budget: ≤6000 tokens
Scenario: Multi-node cluster with quorum queue replication, stream queues for high throughput, federation for multi-DC.
Steps:
Best practices:
Example 3-node cluster:
rabbit@node1.example.comrabbit@node2.example.comrabbit@node3.example.comQuorum queue replication:
x-quorum-initial-group-size)Use case: Event streaming, audit logs, high-volume data ingestion (millions of messages/sec)
Characteristics:
Configuration: json { "x-queue-type": "stream", "x-max-age": "7D", "x-stream-max-segment-size-bytes": 500000000 }
Consumer offset tracking:
first, last, next, or timestampUse case: Shard messages across multiple queues for horizontal scaling
Pattern:
Example:
sharded-orders (type=x-consistent-hash)orders-shard-0, orders-shard-1, orders-shard-2user-123 → always routes to same shardUse case: Replicate messages across datacenters without clustering (clusters require low-latency networks)
Pattern:
orders-exchangeorders-exchange-federated (receives messages from DC1)orders-exchangeBenefits:
Transactional publishing (avoid, heavyweight):
tx.select, tx.commit) → very slow, blocks channelBatch publishing:
Use case: Ensure messages processed in order by allowing only one consumer at a time
Configuration:
x-single-active-consumer=trueRabbitMQ 4.0+ feature:
priority=5 (high) or priority=0/unset (normal)Output:
Token budget: ≤12000 tokens
Exchange type selection:
Queue type selection:
Clustering decisions:
Prefetch tuning:
Error handling strategy:
nack + requeue=true (network timeout, downstream unavailable)nack + requeue=false → DLX (invalid data, schema mismatch)Abort conditions:
Topology schema:
yamlexchanges: - name: <exchange_name> type: direct|topic|fanout|headers durable: true|false auto_delete: true|false queues: - name: <queue_name> type: classic|quorum|stream durable: true|false arguments: x-queue-type: quorum x-quorum-initial-group-size: 3 x-delivery-limit: 20 x-max-priority: 2 # RabbitMQ 4.0+ only x-single-active-consumer: true|false bindings: - exchange: <exchange_name> queue: <queue_name> routing_key: <pattern> # e.g., order.created, order.#, * policies: - name: <policy_name> pattern: <queue_regex> definition: dead-letter-exchange: <dlx_exchange> dead-letter-routing-key: <dlx_routing_key> message-ttl: <milliseconds> delivery-limit: 20
Publisher config:
python# Publisher confirms channel.confirm_delivery() # Persistent messages channel.basic_publish( exchange='orders-exchange', routing_key='order.created', body=message, properties=pika.BasicProperties( delivery_mode=2, # persistent priority=5 # high priority (RabbitMQ 4.0+) ) )
Consumer config:
python# Manual ack + prefetch channel.basic_qos(prefetch_count=10) def callback(ch, method, properties, body): try: process(body) ch.basic_ack(delivery_tag=method.delivery_tag) except TransientError: ch.basic_nack(delivery_tag=method.delivery_tag, requeue=True) except PermanentError: ch.basic_nack(delivery_tag=method.delivery_tag, requeue=False) # → DLX channel.basic_consume(queue='order-processing-queue', on_message_callback=callback)
Required fields:
exchanges[], queues[], bindings[]name, typename, type (classic/quorum/stream)exchange, queue, routing_keyTopology:
orders-exchange (topic)order-processing-queue (quorum, x-quorum-initial-group-size=3)dlx-exchange (topic)dlx-order-processing-queue (quorum, manual inspection)order.created → order-processing-queueorder.processing.failed → dlx-order-processing-queuePolicy (DLX config):
json{ "pattern": "order-processing-queue", "definition": { "dead-letter-exchange": "dlx-exchange", "dead-letter-routing-key": "order.processing.failed", "delivery-limit": 20 } }
Publisher:
pythonchannel.basic_publish( exchange='orders-exchange', routing_key='order.created', body=json.dumps(order), properties=pika.BasicProperties(delivery_mode=2) )
Consumer:
pythondef process_order(ch, method, properties, body): try: order = json.loads(body) # Process order (may fail) charge_payment(order) ch.basic_ack(delivery_tag=method.delivery_tag) except PaymentGatewayDown: # Transient error ch.basic_nack(delivery_tag=method.delivery_tag, requeue=True) except InvalidPaymentMethod: # Permanent error ch.basic_nack(delivery_tag=method.delivery_tag, requeue=False) # → DLX
Token budgets:
Safety:
Auditability:
Determinism:
Performance:
Official Documentation:
NOW_ET)NOW_ET)NOW_ET)NOW_ET)NOW_ET)NOW_ET)NOW_ET)Client Libraries:
Related Skills:
integration-messagequeue-designer: Generic message queue pattern selectionmessaging-kafka-architect: Kafka-specific event streamingmicroservices-pattern-architect: Saga, CQRS, event sourcing with RabbitMQobservability-stack-configurator: Monitoring RabbitMQ with Prometheus + Grafana| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-03 | fail→fail | 18,616 | 17,313 | -7% | 1 | 1 | 0% | 4,384 | 10,038 | +129% | 0 | 0 | — |
case-01 | pass→pass | 20,195 | 17,229 | -15% | 1 | 1 | 0% | 4,577 | 9,458 | +107% | 0 | 0 | — |
case-02 | fail→fail | 14,581 | 12,640 | -13% | 1 | 1 | 0% | 3,198 | 8,751 | +174% | 0 | 0 | — |
case-04 | pass→pass | 14,522 | 14,042 | -3% | 1 | 1 | 0% | 2,971 | 8,646 | +191% | 0 | 0 | — |
case-05 | pass→pass | 10,053 | 9,724 | -3% | 1 | 1 | 0% | 2,086 | 7,919 | +280% | 0 | 0 | — |
case-06 | fail→pass | 15,474 | 15,354 | -1% | 1 | 1 | 0% | 3,264 | 8,773 | +169% | 0 | 0 | — |
case-07 | pass→pass | 10,254 | 13,222 | +29% | 1 | 1 | 0% | 2,074 | 8,701 | +320% | 0 | 0 | — |
case-13 | pass→pass | 15,355 | 16,815 | +10% | 1 | 1 | 0% | 2,920 | 9,142 | +213% | 0 | 0 | — |
case-08 | pass→pass | 18,382 | 17,596 | -4% | 1 | 1 | 0% | 3,200 | 9,137 | +186% | 0 | 0 | — |
case-09 | pass→pass | 18,627 | 18,224 | -2% | 1 | 1 | 0% | 3,514 | 9,296 | +165% | 0 | 0 | — |
case-10 | pass→pass | 17,768 | 18,807 | +6% | 1 | 1 | 0% | 3,910 | 9,645 | +147% | 0 | 0 | — |
case-11 | pass→pass | 13,150 | 7,990 | -39% | 1 | 1 | 0% | 2,264 | 7,232 | +219% | 0 | 0 | — |
case-12 | pass→pass | 17,715 | 18,769 | +6% | 1 | 1 | 0% | 3,321 | 9,405 | +183% | 0 | 0 | — |
case-14 | pass→pass | 15,733 | 18,527 | +18% | 1 | 1 | 0% | 2,668 | 9,096 | +241% | 0 | 0 | — |
case-15 | pass→pass | 13,395 | 13,724 | +2% | 1 | 1 | 0% | 2,686 | 8,581 | +219% | 0 | 0 | — |
case-16 | pass→pass | 6,014 | 6,037 | +0% | 1 | 1 | 0% | 1,361 | 7,099 | +422% | 0 | 0 | — |
case-17 | pass→pass | 10,332 | 9,476 | -8% | 1 | 1 | 0% | 2,102 | 7,749 | +269% | 0 | 0 | — |
case-18 | fail→fail | 12,444 | 16,128 | +30% | 1 | 1 | 0% | 2,509 | 8,873 | +254% | 0 | 0 | — |
case-19 | pass→pass | 10,546 | 12,199 | +16% | 1 | 1 | 0% | 2,237 | 8,368 | +274% | 0 | 0 | — |
case-20 | pass→pass | 13,480 | 12,952 | -4% | 1 | 1 | 0% | 2,524 | 8,540 | +238% | 0 | 0 | — |
case-21 | pass→pass | 16,825 | 13,591 | -19% | 1 | 1 | 0% | 3,148 | 8,226 | +161% | 0 | 0 | — |
case-22 | pass→pass | 11,814 | 8,306 | -30% | 1 | 1 | 0% | 2,256 | 7,460 | +231% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 22 cases were attempted. The headline lift of +5 percentage points is the difference between those two pass rates over the 22 comparable cases.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
Other measured skills in the registry, with their headline benchmark lift.