Вопрос проверяет, понимаете ли вы паттерны обмена сообщениями, гарантии доставки, обработку ошибок и правила проектирования контрактов сообщений.
Через брокер сервисы могут общаться асинхронно: отправитель публикует сообщение, получатель потребляет его из очереди или подписывается на события. Важно выбрать модель (команды или события), определить гарантии доставки (обычно at-least-once), настроить подтверждения, ретраи и очередь “мертвых писем” (DLQ). Также нужно продумать идемпотентность обработчиков и версионирование формата сообщения.
Брокер сообщений решает две задачи: снижает связность сервисов и дает буфер между производителем и потребителем.
Определение: Брокер сообщений — инфраструктурный компонент, который принимает сообщения от продюсеров и доставляет их консюмерам по заданным правилам (очереди, маршрутизация, подписки).
Команда (command)
“Сделай X” (адресно, ожидается обработка конкретным сервисом).
Пример: GenerateReport.
Событие (event)
“X произошло” (может заинтересовать много подписчиков).
Пример: UserRegistered.
Практическое правило:
Команды — когда нужен конкретный исполнитель.
События — когда важен факт и возможны несколько реакций.
At-most-once: быстро, но возможны потери.
At-least-once: сообщений не теряем, но возможны дубликаты.
Exactly-once: дорого и сложно, часто достигается комбинацией идемпотентности + транзакционных паттернов.
В реальных системах чаще выбирают at-least-once и делают обработчики идемпотентными.
Ack/Nack (подтверждения)
Консюмер подтверждает успешную обработку (ack), иначе брокер/клиент решает, что делать дальше.
Retry policy
Ограничение попыток, задержки (backoff), джиттер.
DLQ (dead-letter queue)
Сообщения, которые не удалось обработать после N попыток, уходят в отдельную очередь для разборов.
Способы:
Дедупликация по message_id в хранилище.
Upsert-логика по бизнес-ключу.
“Состояния” обработки задачи (pending → done), чтобы повтор не ломал систему.
Мини-пример (идея дедупликации):
# Воркер: если message_id уже обработан — выходим
if processed_store.exists(message_id):
return
# ... обработка ...
processed_store.save(message_id)
Нормальная схема через брокер — это не только “отправили и забыли”: она включает контракты (command/event), ack, ретраи, DLQ и идемпотентность, иначе при сбоях появятся потери, дубликаты и хаос.