Dead letter queue (DLQ) — очередь, куда попадают сообщения, которые не удалось обработать после нескольких попыток. Вместо бесконечного retry или потери — откладываем проблемное сообщение в отдельную очередь для разбора.
func consume(msg Message) error {
err := process(msg)
if err != nil {
msg.RetryCount++
if msg.RetryCount >= 3 {
// отправляем в DLQ
dlqProducer.Send(msg)
return nil // ack оригинал
}
return err // nack, пойдёт на retry
}
return nil
}
Зачем: одно сломанное сообщение не должно блокировать всю очередь. Без DLQ poison message будет ретраиться вечно, блокируя обработку следующих сообщений. DLQ позволяет: не терять данные, не блокировать очередь, разбирать проблемы потом. На DLQ обычно вешают алерт — если туда что-то прилетело, значит нужно разобраться.