Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Apache Kafka — это распределенная система обработки потоков данных (distributed event streaming platform), разработанная LinkedIn и ставшая отличным решением для высоконагруженных систем, требующих обработки больших объемов данных в реальном времени.
Основная концепция
Kafka работает на основе модели pub-sub (издатель-подписчик), но с ключевым отличием от традиционных message brokers — она хранит все сообщения на диске и позволяет подписчикам читать их когда угодно.
Ключевые компоненты
Producer (издатель) — отправляет сообщения в Kafka
const producer = kafka.producer();
await producer.connect();
await producer.send({
topic: 'user-events',
messages: [
{ key: 'user-123', value: JSON.stringify({ action: 'login' }) }
]
});
Consumer (подписчик) — получает сообщения из Kafka
const consumer = kafka.consumer({ groupId: 'analytics-group' });
await consumer.subscribe({ topic: 'user-events' });
await consumer.run({
eachMessage: async ({ message }) => {
console.log(message.value.toString());
}
});
Topic (тема) — логическое разделение потока данных. Один producer может отправлять в несколько topics, несколько consumers могут читать из одного topic.
Partition (раздел) — физическое разделение темы на разные узлы для масштабируемости и параллелизма.
Broker (брокер) — сервер Kafka, который хранит данные и управляет topics.
Отличие от других message brokers
RabbitMQ/Redis:
- Сообщение удаляется после прочтения
- Подходит для задач, а не потоков данных
- Меньше пропускная способность
Kafka:
- Сообщения хранятся на диске (configurable retention)
- Идеальна для потоков данных и event sourcing
- Горизонтальная масштабируемость
- Может обрабатывать миллионы сообщений в секунду
Гарантии доставки
Kafka предоставляет три уровня гарантий:
- At most once — может потеряться, но дублирований не будет
- At least once — гарантированно доставится, но может быть дубль
- Exactly once — идеальный сценарий (использует трансакции)
Практический пример: микросервисная архитектура
const userProducer = kafka.producer();
await userProducer.send({
topic: 'user-events',
messages: [{
key: 'user-123',
value: JSON.stringify({
type: 'user.created',
userId: 'user-123',
email: 'user@example.com'
})
}]
});
const emailConsumer = kafka.consumer({ groupId: 'email-service' });
await emailConsumer.subscribe({ topic: 'user-events' });
await emailConsumer.run({
eachMessage: async ({ message }) => {
const event = JSON.parse(message.value.toString());
if (event.type === 'user.created') {
await sendWelcomeEmail(event.email);
}
}
});
Когда использовать Kafka?
- Event sourcing — ведение лога всех событий
- Real-time analytics — обработка данных в реальном времени
- Log aggregation — сбор логов из разных сервисов
- Stream processing — обработка потоков данных
- Микросервисная архитектура — асинхронная коммуникация между сервисами
Недостатки
- Сложнее в настройке и операции, чем RabbitMQ
- Требует больше ресурсов (хранение на диске)
- Оверкилл для простых задач
Kafka стала стандартом для компаний, работающих с большими объемами данных и требующих высокой надежности и масштабируемости.