Вопрос проверяет понимание различий между двумя популярными системами обмена сообщениями и умение выбирать подходящий инструмент для конкретных задач.
Apache Kafka и RabbitMQ — это два популярных инструмента для обмена сообщениями, но они решают разные задачи. Kafka изначально создавался как распределенная платформа для потоковой обработки событий (event streaming), где данные хранятся на диске и могут быть повторно прочитаны. RabbitMQ — это классический брокер сообщений (message broker), который фокусируется на надежной доставке сообщений от отправителя к получателю с использованием очередей.
Kafka использует модель publish-subscribe с топиками (topics), где сообщения хранятся в виде логов и могут быть прочитаны несколькими потребителями (consumers) с разными offset. RabbitMQ использует модель очередей (queues) с поддержкой различных протоколов (AMQP, MQTT, STOMP) и сложной маршрутизацией через exchanges.
// Отправка сообщения в Kafka (Producer)
const { Kafka } = require('kafkajs');
const kafka = new Kafka({ clientId: 'my-app', brokers: ['localhost:9092'] });
const producer = kafka.producer();
await producer.connect();
await producer.send({ topic: 'test-topic', messages: [{ value: 'Hello Kafka' }] });
// Получение сообщения (Consumer)
const consumer = kafka.consumer({ groupId: 'test-group' });
await consumer.connect();
await consumer.subscribe({ topic: 'test-topic', fromBeginning: true });
await consumer.run({ eachMessage: async ({ message }) => console.log(message.value.toString()) });// Отправка сообщения в RabbitMQ (Producer)
const amqp = require('amqplib');
const connection = await amqp.connect('amqp://localhost');
const channel = await connection.createChannel();
await channel.assertQueue('test-queue');
channel.sendToQueue('test-queue', Buffer.from('Hello RabbitMQ'));
// Получение сообщения (Consumer)
const connection = await amqp.connect('amqp://localhost');
const channel = await connection.createChannel();
await channel.assertQueue('test-queue');
channel.consume('test-queue', msg => { console.log(msg.content.toString()); channel.ack(msg); });Выбор между Kafka и RabbitMQ зависит от требований к производительности, надежности и сложности маршрутизации. Kafka лучше для потоковой обработки, RabbitMQ — для традиционных очередей сообщений.