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

Что такое 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

ХарактеристикаKafkaRabbitMQ
Производительность✅ Миллионы msg/sec❌ 100K msg/sec
Просмотр истории✅ Переигрывание логов❌ Удаляется после доставки
Partitioning✅ Встроено❌ Требует плагина
Сложность❌ Сложнее✅ Проще
Use CaseПотоки данных, eventsSimple 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
Что такое Kafka? | PrepBro