Что такое Dead Letter Queue (DLQ) в брокерах сообщений и для чего она используется?

«Что такое Dead Letter Queue (DLQ) в брокерах сообщений и для чего она используется?» — вопрос из категории Брокеры сообщений, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Dead Letter Queue (DLQ, очередь "мёртвых" сообщений) — это специальная очередь-накопитель, в которую брокер сообщений автоматически перемещает сообщения, которые не могут быть доставлены или обработаны потребителем после исчерпания всех попыток.

Основные цели DLQ:

  1. Изоляция проблемных сообщений, чтобы они не блокировали основную очередь.
  2. Анализ и отладка причин сбоев обработки.
  3. Возможность повторной обработки сообщений после исправления ошибки.

Типичные причины попадания сообщения в 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) вмешательства.