← Назад к вопросам

В чем разница между kafka и RabbitMQ?

2.0 Middle🔥 201 комментариев
#Брокеры сообщений и очереди

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI26 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Разница между Kafka и RabbitMQ

Kafka и RabbitMQ — это два популярных сообщающихся брокера, но с разными архитектурами и применением. Они предназначены для асинхронной обработки сообщений и взаимодействия между микросервисами.

RabbitMQ

Архитектура: традиционный message broker с моделью queue.

Характеристики:

  • Модель: AMQP (Advanced Message Queuing Protocol) — издатель-подписчик и очереди
  • Хранение: сообщения хранятся в памяти и на диске, удаляются после подтверждения
  • Гарантии: at-most-once и at-least-once доставка
  • Скорость: быстрая обработка для малых объемов
  • Масштабируемость: хорошо масштабируется для small-medium нагрузок
  • Применение: задачи (jobs), уведомления, микросервисное взаимодействие
  • Статус сообщений: сообщение удаляется после обработки

Пример в Node.js:

const amqp = require('amqplib');

// Издатель
async function publishMessage() {
  const conn = await amqp.connect('amqp://localhost');
  const channel = await conn.createChannel();
  const queue = 'task_queue';
  
  await channel.assertQueue(queue, { durable: true });
  await channel.sendToQueue(queue, Buffer.from('Task data'), { persistent: true });
  
  console.log('Message sent');
  setTimeout(() => conn.close(), 500);
}

// Потребитель
async function consumeMessage() {
  const conn = await amqp.connect('amqp://localhost');
  const channel = await conn.createChannel();
  const queue = 'task_queue';
  
  await channel.assertQueue(queue, { durable: true });
  await channel.prefetch(1);
  
  channel.consume(queue, (msg) => {
    console.log('Received:', msg.content.toString());
    channel.ack(msg);
  });
}

Kafka

Архитектура: распределённая система потоков (streaming platform).

Характеристики:

  • Модель: логи (event log) — все сообщения сохраняются и могут быть прочитаны повторно
  • Хранение: постоянное хранение в распределённом логе на диске
  • Гарантии: exactly-once семантика при правильной конфигурации
  • Скорость: очень быстрая для больших объемов данных
  • Масштабируемость: масштабируется для petabyte-scale данных
  • Применение: event streaming, аналитика, логирование, восстановление состояния
  • Статус сообщений: сообщения не удаляются (хранятся по времени/размеру)

Пример в Node.js:

const { Kafka } = require('kafkajs');

const kafka = new Kafka({
  clientId: 'my-app',
  brokers: ['localhost:9092']
});

// Издатель
async function publishEvent() {
  const producer = kafka.producer();
  await producer.connect();
  
  await producer.send({
    topic: 'events',
    messages: [
      { key: 'user1', value: JSON.stringify({ action: 'login' }) }
    ]
  });
  
  await producer.disconnect();
}

// Потребитель (consumer group)
async function consumeEvent() {
  const consumer = kafka.consumer({ groupId: 'my-group' });
  await consumer.connect();
  await consumer.subscribe({ topic: 'events' });
  
  await consumer.run({
    eachMessage: async ({ message }) => {
      console.log('Event:', message.value.toString());
    }
  });
}

Сравнительная таблица

ПараметрRabbitMQKafka
АрхитектураMessage BrokerEvent Streaming
МодельQueue/Pub-SubDistributed Log
ХранениеУдаляет после ackПостоянное хранение
МасштабируемостьSmall-MediumMassive Scale
Пропускная способностьВысокаяОчень высокая
ЗадержкаНизкая (ms)Низкая (ms)
Повторное чтениеНетДа
Consumer GroupsНетДа
Гарантииat-most/at-least onceexactly-once
СложностьПростаяСредняя

Когда использовать

RabbitMQ:

  • Простые task queues
  • Микросервисное взаимодействие
  • Request-reply паттерны
  • Не требуется история событий
  • Меньшие объемы данных

Kafka:

  • Event streaming в реальном времени
  • Требуется история всех событий
  • Большие объемы данных (big data)
  • Многоязычная обработка одного потока
  • Восстановление состояния приложения
  • Аналитика и логирование
В чем разница между kafka и RabbitMQ? | PrepBro