Проверяет понимание паттерна fan-out в брокерах сообщений и умения применять его для параллельной обработки событий.
Fan-out producer — это продюсер, который публикует одно сообщение так, чтобы его получили сразу несколько независимых потребителей. В отличие от обычной очереди, где сообщение забирает только один consumer, fan-out размножает событие по всем подписчикам. Это ключевой паттерн для событийно-ориентированных архитектур, где одно действие (например, регистрация пользователя) должно запустить несколько независимых процессов: отправку письма, начисление бонусов, запись в аналитику.
В RabbitMQ продюсер отправляет сообщение не в очередь напрямую, а в exchange. Exchange типа fanout игнорирует routing key и копирует сообщение во все очереди, привязанные к нему. Каждая очередь получает свою копию, и её обрабатывает свой consumer.
// producer.js
const amqp = require('amqplib');
async function publish() {
const conn = await amqp.connect('amqp://localhost');
const ch = await conn.createChannel();
await ch.assertExchange('events', 'fanout', { durable: true });
ch.publish('events', '', Buffer.from('user.registered'));
console.log('Event published to all subscribers');
}
publish();
В Kafka fan-out достигается через consumer groups: одно сообщение в топике читается каждой группой независимо. Внутри одной группы сообщение получает только один consumer, но разные группы получают полную копию потока.
// consumer group A
consumer.subscribe({ topic: 'user-events', groupId: 'email-service' });
// consumer group B
consumer.subscribe({ topic: 'user-events', groupId: 'analytics-service' });
Итог: fan-out producer стоит применять, когда одно событие должно быть обработано несколькими независимыми подписчиками без связи между ними — это упрощает масштабирование и развязывает сервисы.