8. Troubleshooting
Это практическая тема для инцидентов: как диагностировать, когда сообщения “зависли”, очередь растёт, consumer’ы падают, включились memory/disk alarms, или случился network partition. Фокус — быстрый triage, проверка гипотез и минимальный набор команд/метрик.
Быстрый triage (5–10 минут)
1) Что именно болит?
Очередь растёт (backlog), задержки выросли, появились ошибки publish/consume, падают consumer’ы?
2) Где узкое место?
Broker (alarms, диск), consumer’ы (ошибки, медленные), сеть (partition/latency), producer (шторм/ретраи)?
3) Какая очередь/маршрут?
В RabbitMQ почти всё решается на уровне конкретных очередей/exchange/vhost.
Симптом: очередь растёт (messages_ready ↑)
Частые причины
- consumer’ов меньше, чем нужно (или они “умерли”)
- consumer’ы работают медленнее входящего потока (БД/HTTP зависимость, throttling)
- retry‑петля (сообщения возвращаются и снова попадают в очередь)
Проверки (CLI)
rabbitmqctl list_queues name messages_ready messages_unacknowledged consumers durable
Интерпретация:
consumers = 0→ outage consumer’ов (смотреть деплой/процессы/коннекты)messages_unacknowledgedвысокое → consumer’ы “взяли в работу”, но не ack (зависли/падают)
Действия
- временно масштабировать consumer’ов (если безопасно)
- проверить prefetch (слишком высокий → много in‑flight и memory‑пики)
- убедиться, что есть DLQ и ретраи ограничены (см. тему 2)
Симптом: messages_unacknowledged ↑ (in-flight растёт)
Причины
- consumer завис (I/O, блокировки, таймауты)
- слишком высокий prefetch
- consumer падает до ack (CrashLoop)
Проверки
rabbitmqctl list_queues name messages_ready messages_unacknowledged consumers
rabbitmqctl list_channels connection pid number consumer_count messages_unacknowledged
Действия
- уменьшить prefetch
- добавить timeouts в consumer (БД/HTTP)
- проверять, что ack делается после фиксации результата (иначе будет “потеря” работы)
Симптом: consumer’ы падают
Проверки
- логи consumer‑приложения (исключения, timeouts, OOM)
- количество соединений/каналов (нет ли “штормов”)
RabbitMQ‑сторона:
rabbitmqctl list_connections name user peer_host peer_port state channels
Production best practices
- consumer должен быть идемпотентным (повторы неизбежны)
- ошибки классифицировать:
- временные → retry с задержкой (TTL/DLX)
- постоянные (bad payload) → DLQ, без бесконечного requeue
Симптом: memory alarm
Когда включается memory alarm, RabbitMQ активирует backpressure: producers начинают замедляться/получать ошибки, latency растёт.
Проверки
- memory alarm активен? (смотреть в Management UI или метрики)
- растёт ли
messages_unacknowledged(часто из-за prefetch)
Действия
- снизить prefetch / ограничить параллелизм consumer’ов
- проверить размер сообщений (слишком большие payload’ы)
- убедиться, что Kubernetes limits не слишком малы (иначе OOMKilled и flapping)
Симптом: disk alarm / заканчивается место
Это критично: диск нужен для метаданных и (часто) сообщений. Disk alarm также приводит к блокировкам публикации.
Проверки
- disk free на ноде/volume
- быстрый рост backlog (сообщения складываются на диск)
Действия
- увеличить volume / расширить PVC (если поддерживается)
- включить/проверить ретеншн‑политику и TTL для “временных” сообщений
- убедиться, что DLQ не растёт бесконтрольно (и есть процесс разборки DLQ)
Симптом: network partition / split cluster
Признаки
- часть нод не видит другие
- ошибки соединения/кластерной синхронизации
- деградация quorum очередей (потеря кворума)
Проверки
rabbitmqctl cluster_status
rabbitmqctl status
Действия
- стабилизировать сеть (это первопричина)
- не делать “ручных чудес”, пока не понятно, какая часть кластера в большинстве/меньшинстве
- иметь заранее выбранную стратегию partition handling и протестированный план восстановления (см. тему 4)
Практика: симуляции (на стенде)
1) Падение consumer: остановить consumer’ы → увидеть рост messages_ready → проверить алерты.
2) Переполнение очереди: запустить producer‑шторм → смотреть disk/memory alarms.
3) Network partition: “разрезать” сеть между нодами → посмотреть cluster_status и поведение quorum очередей.
Цель — чтобы во время реального инцидента вы действовали по знакомому сценарию.