Ответ
Dead Letter Queue (DLQ, очередь "мёртвых" сообщений) — это специальная очередь-накопитель, в которую брокер сообщений автоматически перемещает сообщения, которые не могут быть доставлены или обработаны потребителем после исчерпания всех попыток.
Основные цели DLQ:
- Изоляция проблемных сообщений, чтобы они не блокировали основную очередь.
- Анализ и отладка причин сбоев обработки.
- Возможность повторной обработки сообщений после исправления ошибки.
Типичные причины попадания сообщения в DLQ:
- Ошибка потребителя: Необработанное исключение в методе-обработчике (
@RabbitListener,@KafkaListener). - Истечение TTL (Time To Live): Сообщение превысило установленное время жизни.
- Превышение лимита доставок: Сообщение было возвращено в очередь N раз (настраивается политикой повторных попыток).
- Ошибка десериализации: Невозможно преобразовать тело сообщения в целевой объект.
- Переполнение очереди: Достигнут лимит длины очереди.
Пример настройки DLQ в Spring Boot для RabbitMQ:
@Configuration
public class RabbitMQConfig {
@Bean
public Queue mainQueue() {
return QueueBuilder.durable("orders.queue")
.withArgument("x-dead-letter-exchange", "orders.dlx") // Обменник для DLQ
.withArgument("x-dead-letter-routing-key", "orders.dead") // Ключ маршрутизации
.build();
}
@Bean
public DirectExchange deadLetterExchange() {
return new DirectExchange("orders.dlx");
}
@Bean
public Queue deadLetterQueue() {
return new Queue("orders.queue.dlq");
}
@Bean
public Binding dlqBinding() {
return BindingBuilder.bind(deadLetterQueue())
.to(deadLetterExchange())
.with("orders.dead");
}
}
Важно: Сообщения в DLQ требуют мониторинга и ручного или автоматизированного (через механизм retry) вмешательства.