Цель: не терять и не залипать на «ядовитых» сообщениях — consumer должен ретраить временные сбои с бэкоффом, а безнадёжные сообщения парковать в Dead Letter Topic с возможностью ручной реобработки.
Зависимость: KAFKA-2.
Что сделать
- Настроить
DefaultErrorHandler с ExponentialBackOff (например, 3-5 попыток, нарастающий интервал) и DeadLetterPublishingRecoverer, публикующим в low-stock-alerts.DLT.
- Топик
low-stock-alerts.DLT создать программно (TopicBuilder), число партиций = исходному.
- Разделить ошибки: десериализация/валидация (
spring.json.trusted.packages, битый JSON) → non-retryable, сразу в DLT; временные (БД недоступна) → retryable. См. addNotRetryableExceptions / addRetryableExceptions.
- Механизм ручной реобработки: эндпоинт
POST /api/admin/dlq/low-stock/reprocess (ADMIN), который вычитывает DLT и шлёт обратно в основной топик. Стретч: не расписывать вычитку целиком — выбрать подход (отдельный KafkaConsumer / listener с ручным стартом).
Acceptance criteria
Цель: не терять и не залипать на «ядовитых» сообщениях — consumer должен ретраить временные сбои с бэкоффом, а безнадёжные сообщения парковать в Dead Letter Topic с возможностью ручной реобработки.
Зависимость: KAFKA-2.
Что сделать
DefaultErrorHandlerсExponentialBackOff(например, 3-5 попыток, нарастающий интервал) иDeadLetterPublishingRecoverer, публикующим вlow-stock-alerts.DLT.low-stock-alerts.DLTсоздать программно (TopicBuilder), число партиций = исходному.spring.json.trusted.packages, битый JSON) → non-retryable, сразу в DLT; временные (БД недоступна) → retryable. См.addNotRetryableExceptions/addRetryableExceptions.POST /api/admin/dlq/low-stock/reprocess(ADMIN), который вычитывает DLT и шлёт обратно в основной топик. Стретч: не расписывать вычитку целиком — выбрать подход (отдельныйKafkaConsumer/ listener с ручным стартом).Acceptance criteria
low-stock-alerts.DLT.kafka_dlt-exception-message).stock_alerts.