Сообщения, которые не удалось обработать после N попыток, отправляют в DLQ для разбора и ручной обработки. В Go: при ошибке обработки не коммитить offset (или nack); после N ретраев публиковать сообщение в отдельный топик/очередь (DLQ). Отдельный воркер или оператор обрабатывает DLQ (логи, алерты, повторная публикация после исправления).
if err := process(msg); err != nil {
if attempt >= maxAttempts {
dlqProducer.Produce(ctx, msg)
return
}
return err
}
consumer.Commit(msg)