← Назад к вопросам
В чем разница между 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());
}
});
}
Сравнительная таблица
| Параметр | RabbitMQ | Kafka |
|---|---|---|
| Архитектура | Message Broker | Event Streaming |
| Модель | Queue/Pub-Sub | Distributed Log |
| Хранение | Удаляет после ack | Постоянное хранение |
| Масштабируемость | Small-Medium | Massive Scale |
| Пропускная способность | Высокая | Очень высокая |
| Задержка | Низкая (ms) | Низкая (ms) |
| Повторное чтение | Нет | Да |
| Consumer Groups | Нет | Да |
| Гарантии | at-most/at-least once | exactly-once |
| Сложность | Простая | Средняя |
Когда использовать
RabbitMQ:
- Простые task queues
- Микросервисное взаимодействие
- Request-reply паттерны
- Не требуется история событий
- Меньшие объемы данных
Kafka:
- Event streaming в реальном времени
- Требуется история всех событий
- Большие объемы данных (big data)
- Многоязычная обработка одного потока
- Восстановление состояния приложения
- Аналитика и логирование