Проверяет понимание механизмов распределения сообщений между несколькими консьюмерами одной очереди и способов избежать дублирующей обработки.
Когда несколько идентичных консьюмеров слушают один источник сообщений, задача сводится к тому, чтобы брокер гарантировал доставку каждого сообщения ровно одному получателю. Это классический паттерн competing consumers: несколько воркеров конкурируют за сообщения из одной очереди, и брокер отдаёт каждое сообщение только одному из них.
Даже при корректном распределении возможны повторные доставки: консьюмер упал после обработки, но до ack; сеть потеряла подтверждение; брокер переотправил сообщение. Поэтому обработку делают идемпотентной — повторная обработка того же сообщения не должна менять результат.
async function handleMessage(msg) {
const id = msg.id;
// Проверяем, не обрабатывали ли уже
if (await redis.get(`processed:${id}`)) return;
await processOrder(msg.payload);
// Помечаем как обработанное с TTL
await redis.set(`processed:${id}`, '1', 'EX', 86400);
await channel.ack(msg);
}
Итог: чтобы сообщение обработал только один консьюмер, используйте одну очередь с несколькими воркерами или consumer group в Kafka, а поверх этого делайте обработку идемпотентной — это защитит от повторных доставок и обеспечит корректность при сбоях.
Уровень
Рейтинг:
5
Сложность:
6
Навыки
RabbitMQ
Kafka
Ключевые слова
Подпишись на Node.js Developer в телеграм