Help us improve
Share bugs, ideas, or general feedback.
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 отправляется до обработки
Share bugs, ideas, or general feedback.
Плохо: 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 потеряны. Заказы застряли в промежуточном состоянии навсегда
npx claudepluginhub dex-it/claude-code-marketplace --plugin dex-skill-rabbitmqCreates, edits, and optimizes skills for Claude Code, including drafting, evaluating with test prompts, iterating on performance, and improving skill descriptions for better triggering accuracy.