Пейджер

🌍 Привет мир! 👋

🌍 Привет мир! 👋

Продолжим говорить о типах exchange в #RABBITMQ. И сегодня речь пойдет про Dead Letter Exchange (DLX), читаем и делаем систему более стабильной.

🚀 Мотивация

Использование DLX в проекте обеспечит надежность и устойчивость системы, позволит эффективно обрабатывать, анализировать и повторно пытаться доставить сообщения, которые не были успешно обработаны, тем самым улучшается управление ошибками и повышается общая стабильность архитектуры приложения.

Что такое DLX

DLX — специальный exchange, получающий сообщения, которые не удалось успешно доставить к consumers.

«Мертвые письма» могут появляться по причине того что:

1️⃣ Сообщение просрочено, превышен TTL сообщения;
2️⃣ Сообщение было отклонено с помощью channel.nack() или channel.reject() с requeue: false;
3️⃣ Достигнут предел queue length.

⚙️ Процесс обработки

Сообщение попадает в DLX, затем перенаправляется в "мертвую" очередь (DLQ). Можно направлять в нужную очередь, в зависимости от типа сбоя или ключа маршрутизации.

📝 Расширофровка Dead-Letter

При чтении из DLQ, можно получить дополнительную информацию о том, почему сообщение было помещено в "очередь мертвых писем", используя заголовок x-death в свойствах сообщения.

channel.consume('dead_letter_queue', (msg) => {
    if (!msg) {
        return;
    }

   const xDeath = msg.properties.headers['x-death'];
        if (xDeath) {
            console.log('Причина:', xDeath[0].reason);
            console.log('Исходный exchange:', xDeath[0].exchange);
            console.log('Исходный routing-key:', xDeath[0]['routing-key']);
        channel.ack(msg);
    }
});


Что происходит в коде выше ⁉️


1️⃣ Чтение сообщения: Функция consume подписывается на очередь dead_letter_queue. Когда в этой очереди появляется сообщение, эта функция вызывается с объектом msg.

2️⃣ Проверка сообщения: проверка что msg не является null.

3️⃣ Получение информации: Заголовок x-death в свойствах сообщения предоставляет информацию о том, почему сообщение оказалось в "очереди мертвых писем". Извлекается заголовок, чтобы получить дополнительные сведения.

4️⃣ Логирование причины и маршрута: Если заголовок x-death существует, извлекаются данные:
- Причина: Поле reason указывает, почему сообщение было перемещено в dead-letter очередь.
- Исходный exchange: Поле exchange показывает, на какой exchange сообщение было изначально отправлено.
- Исходный routing-key: Поле routing-key содержит ключ маршрутизации, использовавшийся при первоначальной отправке сообщения.

5️⃣ Подтверждение сообщения: Функция channel.ack(msg) подтверждает получение сообщения и удаляет из DLQ, предотвращая повторное потребление.

📢 Полезные советы

📌 Реализация механизма повторных попыток (Retry Mechanism)

🅰️ TTL для сообщений: Настраивается через параметр x-message-ttl на "мертвой" очереди для автоматического перемещения сообщений.
🅱️ Циклические очереди: Создается несколько очередей с разным TTL для управления повторными попытками.

📌 Внедрение системы мониторинга, например через Prometheus или Grafana, для контроля количества сообщений в "мертвых" очередях.

📌 Добавление пользовательских заголовков к сообщениям для хранения информации о происхождении или количестве повторных попыток.

📌 Использование параметра x-dead-letter-routing-key: Этот параметр необязателен, но если его задать, "мертвое" сообщение сначала попадет в DLE, а затем будет перенаправлено в нужную DLQ с указанным ключом маршрутизации.

💬 Делитесь своим мнением в комментариях👇! Если вам понравилась статья, не забудьте поставить лайк! 👍

#RABBITMQ
Медиа 1
Хотите больше таких постов?
Подпишитесь на канал и читайте продолжение в Telegram.
Подписаться на @ivanchikovitclub Открыть пост в Telegram