Логотип YeaHub

База вопросов

Собеседования

Тренажёр

База ресурсов

Обучение

Навыки

Задачи

Войти

Выбери, каким будет IT завтра — вместе c нами!

YeaHub — это полностью открытый проект, призванный объединить и улучшить IT-сферу. Наш исходный код доступен для просмотра на GitHub. Дизайн проекта также открыт для ознакомления в Figma.

© 2026 YeaHub

AI info

Карта сайта

Документы

Медиа

Назад
Вопрос про RabbitMQ: poison, message

Что делать, если одно сообщение вызывает падение демона и блокирует обработку последующих сообщений?

Этот вопрос проверяет понимание проблемы “плохих” сообщений (poison message) и способов изоляции ошибок, чтобы очередь не блокировалась.

Короткий ответ

Если одно сообщение постоянно вызывает падение воркера, оно может бесконечно переотправляться и блокировать очередь. В таких случаях вводят лимит повторных попыток и отправляют сообщение в DLQ после превышения порога. Также важно оборачивать обработку в try/except, чтобы процесс не падал целиком. Дополнительно используют изоляцию воркеров и отдельные очереди для проблемных задач.

Длинный ответ

Проблема “плохого” сообщения возникает, когда входные данные или логика обработки приводят к исключению, и сообщение повторно доставляется снова и снова.

Почему очередь может блокироваться

Если используется prefetch=1 или малое число воркеров:

  1. сообщение доставляется

  2. обработка падает

  3. сообщение возвращается в очередь

  4. тот же воркер снова получает его

В итоге прогресс не происходит.

Практические меры

1) Ограничение количества попыток

Обычно применяют счетчик попыток:

  • сохраняют число ретраев в заголовке сообщения

  • после N попыток отправляют в DLQ

2) Использование Dead Letter Queue

Сообщения, которые не удалось обработать:

  • не блокируют основную очередь

  • могут анализироваться отдельно

3) Изоляция обработки

Подходы:

  • обработка в отдельном процессе

  • worker pool, где падение одного процесса не влияет на другие

4) Обработка ошибок внутри воркера

Обработчик должен перехватывать исключения:

def on_message(ch, method, properties, body):
    try:
        process(body)
        ch.basic_ack(delivery_tag=method.delivery_tag)
    except Exception:
        # отправка в DLQ или retry
        ch.basic_nack(delivery_tag=method.delivery_tag, requeue=False)

Дополнительные техники

  1. Валидация входных данных до тяжелой обработки

  2. Таймауты на внешние вызовы

  3. Идемпотентная обработка

Вывод
Если одно сообщение падает постоянно, его нужно изолировать: ограничить ретраи, отправить в DLQ и не позволять ему блокировать очередь.

  • Аватар

    Python Guru

    Sergey Filichkin

    Guru – это эксперты YeaHub, которые помогают развивать комьюнити.

Уровень

  • Рейтинг:

    5

  • Сложность:

    7

Навыки

  • RabbitMQ

    RabbitMQ

Ключевые слова

#poison

#message

Подпишись на Python Developer в телеграм

  • Аватар

    Python Guru

    Sergey Filichkin

    Guru – это эксперты YeaHub, которые помогают развивать комьюнити.