Ответ
Топик (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' успешно создан")
}