Логотип YeaHub

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

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

Тренажёр

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

Обучение

Навыки

Задачи

Войти

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

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

© 2026 YeaHub

AI info

Карта сайта

Документы

Медиа

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

Как организовать взаимодействие сервисов через брокер сообщений?

Вопрос проверяет, понимаете ли вы паттерны обмена сообщениями, гарантии доставки, обработку ошибок и правила проектирования контрактов сообщений.

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

Через брокер сервисы могут общаться асинхронно: отправитель публикует сообщение, получатель потребляет его из очереди или подписывается на события. Важно выбрать модель (команды или события), определить гарантии доставки (обычно at-least-once), настроить подтверждения, ретраи и очередь “мертвых писем” (DLQ). Также нужно продумать идемпотентность обработчиков и версионирование формата сообщения.

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

Брокер сообщений решает две задачи: снижает связность сервисов и дает буфер между производителем и потребителем.

Определение: Брокер сообщений — инфраструктурный компонент, который принимает сообщения от продюсеров и доставляет их консюмерам по заданным правилам (очереди, маршрутизация, подписки).

1) Выбор модели: команды vs события

  1. Команда (command)

  • “Сделай X” (адресно, ожидается обработка конкретным сервисом).

  • Пример: GenerateReport.

  1. Событие (event)

  • “X произошло” (может заинтересовать много подписчиков).

  • Пример: UserRegistered.

Практическое правило:

  • Команды — когда нужен конкретный исполнитель.

  • События — когда важен факт и возможны несколько реакций.

2) Гарантии доставки и последствия

  1. At-most-once: быстро, но возможны потери.

  2. At-least-once: сообщений не теряем, но возможны дубликаты.

  3. Exactly-once: дорого и сложно, часто достигается комбинацией идемпотентности + транзакционных паттернов.

В реальных системах чаще выбирают at-least-once и делают обработчики идемпотентными.

3) Ошибки, ретраи и DLQ

  1. Ack/Nack (подтверждения)

  • Консюмер подтверждает успешную обработку (ack), иначе брокер/клиент решает, что делать дальше.

  1. Retry policy

  • Ограничение попыток, задержки (backoff), джиттер.

  1. DLQ (dead-letter queue)

  • Сообщения, которые не удалось обработать после N попыток, уходят в отдельную очередь для разборов.

4) Идемпотентность (чтобы дубликаты были безопасны)

Способы:

  • Дедупликация по message_id в хранилище.

  • Upsert-логика по бизнес-ключу.

  • “Состояния” обработки задачи (pending → done), чтобы повтор не ломал систему.

Мини-пример (идея дедупликации):

# Воркер: если message_id уже обработан — выходим
if processed_store.exists(message_id):
    return
# ... обработка ...
processed_store.save(message_id)

Вывод

Нормальная схема через брокер — это не только “отправили и забыли”: она включает контракты (command/event), ack, ретраи, DLQ и идемпотентность, иначе при сбоях появятся потери, дубликаты и хаос.

  • Аватар

    Python Guru

    Sergey Filichkin

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

Уровень

  • Рейтинг:

    5

  • Сложность:

    7

Навыки

  • RabbitMQ

    RabbitMQ

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

#broker

#message

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

  • Аватар

    Python Guru

    Sergey Filichkin

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