Использовали ли паттерн для гарантированной отправки уведомлений
Что проверяют
Знаете ли вы, почему уведомление теряется между коммитом в базу и отправкой в брокер, и решали ли вы это сами. Вопрос поведенческий, поэтому ждут историю из проекта, а следом спросят, что будет, если сообщение доставлено дважды.
Как отвечать
Стройте рассказ так: какая была проблема, какой паттерн выбрали, как проверили, что он сработал. Цифры нужны ваши, например сколько уведомлений терялось до и после. Опорные технические элементы:
- Transactional Outbox: бизнес-изменение и запись о событии в таблицу
outboxсохраняются в одной транзакции. Отдельный процесс публикует записи в Kafka или RabbitMQ: опросом таблицы или через CDC, например Debezium. Так исчезает двойная запись, при которой база обновилась, а сообщение не ушло; - at-least-once и идемпотентный потребитель: гарантированная доставка на практике означает «минимум один раз». Потребитель хранит идентификаторы обработанных сообщений или передаёт провайдеру ключ идемпотентности, чтобы пользователь не получил два одинаковых письма;
- подтверждения брокера: в RabbitMQ durable-очереди, persistent-сообщения, publisher confirms и ручной ack после обработки. В Kafka
acks=allу продюсера и коммит смещения после обработки, а не до неё; - повторы и DLQ: повтор с экспоненциальной задержкой через Spring Retry или Resilience4j, а после исчерпания попыток сообщение уходит в dead letter queue, где его разбирают вручную или переотправляют.
Если опыта не было, так и скажите и опишите по тем же пунктам, как решали бы задачу. Это лучше выдуманного проекта: он развалится на втором уточняющем вопросе.
Где спотыкаются
Называют Observer. Это подписка внутри процесса: при падении приложения события в памяти пропадут, никакой гарантии доставки паттерн не даёт.
Путают Circuit Breaker с механизмом повторов. Он, наоборот, временно прекращает вызовы к сломанному провайдеру, а повторную отправку обеспечивают ретраи и outbox.
Публикуют событие через @TransactionalEventListener после коммита и считают это гарантией. Если процесс упадёт между коммитом и отправкой, уведомление потеряется, и именно эту дыру закрывает outbox.