Что такое топик (topic) в Kafka?

Ответ

Топик (topic) в Kafka — это именованный поток сообщений, который служит для их категоризации. Можно представить топик как таблицу в базе данных или папку в файловой системе, но для потоковых данных.

Продюсеры (producers) отправляют сообщения в топики, а консьюмеры (consumers) подписываются на них, чтобы читать эти сообщения.

Ключевые характеристики топика:

  • Именование: Каждый топик имеет уникальное имя в кластере Kafka.
  • Партиционирование (Partitioning): Топик разделен на одну или несколько партиций. Партиции — это упорядоченные, неизменяемые последовательности сообщений. Разделение на партиции позволяет распараллелить обработку данных: несколько консьюмеров из одной группы могут читать сообщения из разных партиций одного топика одновременно. Порядок сообщений гарантируется только в пределах одной партиции.
  • Неизменяемость (Immutability): Сообщения в партициях являются append-only, то есть их нельзя изменить или удалить после записи.
  • Хранение и Retention Policy: Kafka хранит сообщения в топиках определенное время (например, 7 дней) или до достижения определенного размера, после чего старые данные удаляются.

Пример создания топика в Go (с использованием confluent-kafka-go):

package main

import (
    "context"
    "log"
    "time"

    "github.com/confluentinc/confluent-kafka-go/v2/kafka"
)

func main() {
    admin, err := kafka.NewAdminClient(&kafka.ConfigMap{"bootstrap.servers": "localhost:9092"})
    if err != nil {
        log.Fatalf("Не удалось создать AdminClient: %v", err)
    }
    defer admin.Close()

    ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
    defer cancel()

    // Создаем топик с 3 партициями и фактором репликации 1
    // Фактор репликации — сколько брокеров будут хранить копию каждой партиции
    _, err = admin.CreateTopics(ctx, []kafka.TopicSpecification{{
        Topic:             "user-events",
        NumPartitions:     3,
        ReplicationFactor: 1,
    }})

    if err != nil {
        log.Fatalf("Не удалось создать топик: %v", err)
    }
    log.Println("Топик 'user-events' успешно создан")
}