← Назад к вопросам
Что такое Kafka?
1.6 Junior🔥 181 комментариев
#Брокеры сообщений#Микросервисы и архитектура
Комментарии (1)
🐱
claude-haiku-4.5PrepBro AI26 мар. 2026 г.(ред.)
Ответ сгенерирован нейросетью и может содержать ошибки
Apache Kafka: Распределённая платформа обработки потоков
Kafka — это высокопроизводительная платформа для обработки потоков данных в реальном времени. Это один из самых важных инструментов в микросервисной архитектуре для асинхронной коммуникации.
Что такое Kafka в двух словах?
Kafka = распределённая очередь сообщений + база данных логов + платформа обработки потоков
Это система, которая:
- Получает сообщения от производителей (producers)
- Хранит их в логе (persistent storage)
- Доставляет потребителям (consumers) в порядке поступления
Основные компоненты
1. Topic (Тема)
- Категория данных, например
user.events,payment.transactions - Сообщения публикуются в topics
- Topics разделены на partitions
// Отправить сообщение в topic
package main
import "github.com/segmentio/kafka-go"
producer := &kafka.Writer{
Addr: kafka.TCP("localhost:9092"),
Topic: "user.events",
Balancer: &kafka.LeastBytes{},
}
producer.WriteMessages(context.Background(),
kafka.Message{Value: []byte("user_registered")},
)
2. Partition (Раздел)
- Topic разделён на несколько partitions для параллелизма
- Каждый partition — это отдельный лог
- Сообщения в partition имеют order гарантию
Topic: user.events
├── Partition 0 [msg1, msg3, msg5] → Consumer Group A
├── Partition 1 [msg2, msg4, msg6] → Consumer Group A
└── Partition 2 [msg7, msg8, msg9] → Consumer Group A
3. Consumer Group (Группа потребителей)
- Несколько consumers, которые читают один topic
- Каждый partition читается только одним consumer в группе
- Параллельная обработка одного topic
4. Broker (Сервер Kafka)
- Сервер, который хранит topic и partitions
- Kafka cluster состоит из нескольких brokers
- Репликация данных между brokers для отказоустойчивости
Гарантии Kafka
1. Порядок сообщений
- Сообщения в partition гарантированно идут в порядке
- Если нужен global order — используй только 1 partition (медленно)
2. Доставка (Delivery semantics)
- At most once: может потеряться
- At least once: может дублироваться (обычно)
- Exactly once: сложнее реализовать (требует idempotency)
// At least once delivery с manual commit
consumer.CommitMessages(context.Background(), messages...)
3. Персистентность
- Сообщения хранятся на диске
- Можно переиграть исторические данные
- Retention policy (день, неделя, месяц)
Пример: система событий
package main
import (
"context"
"github.com/segmentio/kafka-go"
)
// Producer: отправляет события регистрации
func publishUserRegistration(email string) {
producer := &kafka.Writer{Addr: kafka.TCP("localhost:9092")}
defer producer.Close()
producer.WriteMessages(context.Background(),
kafka.Message{
Key: []byte(email),
Value: []byte(`{"event":"user_registered","email":"` + email + `"}`),
},
)
}
// Consumer: обрабатывает события (например, отправляет email)
func consumeUserEvents() {
reader := kafka.NewReader(kafka.ReaderConfig{
Brokers: []string{"localhost:9092"},
Topic: "user.events",
GroupID: "email-service",
})
defer reader.Close()
for {
message, _ := reader.FetchMessage(context.Background())
// Обработка события
sendWelcomeEmail(string(message.Value))
// Подтвердить обработку
reader.CommitMessages(context.Background(), message)
}
}
Kafka vs RabbitMQ
| Характеристика | Kafka | RabbitMQ |
|---|---|---|
| Производительность | ✅ Миллионы msg/sec | ❌ 100K msg/sec |
| Просмотр истории | ✅ Переигрывание логов | ❌ Удаляется после доставки |
| Partitioning | ✅ Встроено | ❌ Требует плагина |
| Сложность | ❌ Сложнее | ✅ Проще |
| Use Case | Потоки данных, events | Simple messaging |
Kafka в микросервисах
User Service → Kafka: user.created → Email Service
→ Kafka: user.created → Analytics Service
→ Kafka: user.created → Notification Service
Преимущества:
- Loose coupling между сервисами
- Event sourcing и audit log
- Масштабируемость (добавляй consumers)
- Replay-ability (переигрывание в случае ошибки)
Типичные проблемы
1. Дублирование сообщений
- Kafka гарантирует at-least-once
- Consumer должен быть idempotent
2. Ordering
- Порядок гарантирован в partition
- Если важен global порядок — усложняется архитектура
3. Отставание (lag)
- Если consumer медленный — растёт lag
- Можно мониторить:
kafka-consumer-groups --lag