From dex-skill-rabbitmq
RabbitMQ — MassTransit, retry, dead-letter, idempotency, ловушки. Активируется при rabbitmq, message queue, masstransit, consumer, dead-letter, saga, amqp, amqplib, exchange, queue, binding, prefetch, ack, nack
How this skill is triggered — by the user, by Claude, or both
Slash command
/dex-skill-rabbitmq:rabbitmqThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
Плохо: `channel.BasicConsume("orders", autoAck: true, consumer)` — ack отправляется до обработки
Плохо: channel.BasicConsume("orders", autoAck: true, consumer) — ack отправляется до обработки
Правильно: autoAck: false → BasicAck(deliveryTag) после успешной обработки, BasicNack(requeue: false) → DLQ при ошибке
Почему: consumer crash после получения, но до обработки → сообщение потеряно навсегда. Broker считает delivered
Плохо: await _service.ChargeCustomer(context.Message.OrderId) — без проверки дубликата
Правильно: проверка MessageId перед обработкой: if (await _cache.GetStringAsync(messageId) != null) return
Почему: RabbitMQ = at-least-once delivery. Retry, redelivery, network glitch → двойное списание, двойная отправка email
Плохо: prefetchCount = 0 (unlimited) — broker отправляет все сообщения consumer'у сразу
Правильно: channel.BasicQos(prefetchSize: 0, prefetchCount: 10, global: false) — по 10 сообщений
Почему: 100K сообщений в памяти consumer → OOM. Другие consumers простаивают — весь backlog у одного
Плохо: SaveChangesAsync() → Publish(new OrderCreated(...)) — crash между ними = event потерян
Правильно: Outbox pattern — event сохраняется в той же транзакции, BackgroundService публикует из outbox
Почему: DB commit прошёл, publish упал → order создан, но никто не узнал. Inconsistency между сервисами
Плохо: QueueDeclare(durable: false) или BasicPublish(persistent: false) — данные в памяти
Правильно: durable: true для queue + persistent: true (DeliveryMode=2) для messages
Почему: RabbitMQ restart → non-durable queue исчезает с содержимым. Non-persistent messages теряются при нехватке RAM
Плохо: UseMessageRetry(r => r.Immediate(int.MaxValue)) — ошибка повторяется вечно
Правильно: трёхуровневая стратегия: retry (in-memory, 3 раза) → scheduled redelivery (через очередь, 3 раза) → DLQ ({queue}_error)
Почему: poison message → бесконечный retry → CPU 100%, очередь не движется, все остальные сообщения ждут
Плохо: OrderShipped consumer ожидает что OrderPaid уже обработан
Правильно: consumer обрабатывает сообщение в любом порядке, или используй Saga для координации
Почему: RabbitMQ не гарантирует порядок при нескольких consumers, redelivery, или разных очередях
Плохо: Saga без маппинга CorrelateById(ctx => ctx.Message.OrderId) → каждое событие создаёт новый state machine
Правильно: Event(() => OrderSubmitted, x => x.CorrelateById(ctx => ctx.Message.OrderId)) — все events одного заказа → один инстанс
Почему: без корреляции 100 events = 100 инстансов Saga. Compensation никогда не сработает — она ищет несуществующий инстанс
Плохо: Order → Payment → Shipping. Payment прошёл, Shipping упал → деньги списаны, товар не отправлен
Правильно: каждый шаг имеет compensating action: When(PaymentFailed).Publish(new CancelOrder(...))
Почему: без compensation система застревает в неконсистентном состоянии. Ручной откат = самая дорогая ошибка
Плохо: InMemorySagaRepository в production
Правильно: EntityFrameworkSagaRepository или RedisSagaRepository
Почему: app restart → все in-flight sagas потеряны. Заказы застряли в промежуточном состоянии навсегда
Creates, edits, and optimizes skills for Claude Code, including drafting, evaluating with test prompts, iterating on performance, and improving skill descriptions for better triggering accuracy.
npx claudepluginhub dex-it/claude-code-marketplace --plugin dex-skill-rabbitmq