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

Что такое topic в Kafka?

1.2 Junior🔥 92 комментариев
#Брокеры сообщений

Комментарии (2)

🐱
deepseek-v3.2PrepBro AI5 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Ответ: Topic (Топик) в Apache Kafka

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

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

  1. Неизменяемая последовательность записей (Immutable Log) Каждый топик реализован как упорядоченный, append-only лог сообщений. Сообщения записываются в конец топика и получают последовательный идентификатор — offset (смещение). Это гарантирует сохранение порядка сообщений в пределах одного раздела (partition).

    // Пример структуры сообщения в топике Kafka
    type KafkaMessage struct {
        Topic     string
        Partition int32
        Offset    int64
        Key       []byte
        Value     []byte
        Headers   []RecordHeader
    }
    
  2. Партиционирование (Partitioning) для масштабирования Топик делится на одну или несколько partitions (разделов), что позволяет:

    • Распределять данные по разным брокерам кластера.
    • Параллельно обрабатывать сообщения несколькими потребителями.
    • Увеличивать пропускную способность.
    # Пример: топик `user-events` с тремя разделами
    user-events-partition-0
    user-events-partition-1
    user-events-partition-2
    
  3. Репликация (Replication) для отказоустойчивости Каждый раздел реплицируется на несколько брокеров (replication factor). Одна реплика является leader, остальные — followers. Это обеспечивает высокую доступность и надежность данных.

Глубокое понимание для разработчика на Go

В контексте разработки на Go, топики представляют собой не просто "очереди", а логи с гарантированной упорядоченностью в пределах раздела. Это важно учитывать при проектировании систем:

  • Ключ сообщения (Key) определяет раздел, в который попадет сообщение. Сообщения с одинаковым ключом всегда направляются в один раздел, сохраняя порядок.
  • Типичное использование топиков:
    • Event Sourcing — хранение всех событий системы.
    • Стриминг данных — передача потоковых данных между микросервисами.
    • Логирование — агрегация логов из распределенных систем.
    • Очереди задач — асинхронная обработка фоновых заданий.
// Пример создания топика с использованием библиотеки sarama для Go
package main

import (
    "github.com/IBM/sarama"
    "log"
)

func createTopic(admin sarama.ClusterAdmin, topicName string) error {
    detail := &sarama.TopicDetail{
        NumPartitions:     6,          // Количество разделов
        ReplicationFactor: 3,          // Фактор репликации
        ConfigEntries: map[string]*string{
            "retention.ms": stringPtr("604800000"), // Хранение 7 дней
            "compression.type": stringPtr("snappy"),
        },
    }
    return admin.CreateTopic(topicName, detail, false)
}

func stringPtr(s string) *string { return &s }

Практические аспекты работы с топиками

  • Стратегии именования: топики именуют по шаблону <domain>.<event>.<version> (например, user.profile.updated.v1).
  • Конфигурация топика:
    • retention.ms — время хранения сообщений.
    • cleanup.policy — политика очистки (delete/compact).
    • compression.type — тип сжатия (snappy, gzip, lz4).
  • Consumer Groups: потребители объединяются в группы, где каждый раздел читается только одним потребителем из группы, обеспечивая балансировку нагрузки.
  • Компактификация (Log Compaction) — специальный режим, где сохраняются только последние значения для каждого ключа, полезно для хранения состояний.

Типичные вопросы на собеседовании

  1. Чем топик отличается от очереди RabbitMQ? В Kafka топик — это лог с возможностью многократного чтения разными потребителями, в то время как очередь RabbitMQ удаляет сообщения после обработки.

  2. Как выбрать количество разделов? Ориентируются на планируемую пропускную способность и количество потребителей. Рекомендуется создавать избыточное количество разделов (например, в 2-3 раза больше текущих потребностей), так как их число нельзя уменьшить после создания.

  3. Что происходит при исчерпании дискового пространства? В зависимости от политики очистки: либо удаляются старые сообщения, либо перестают приниматься новые (если включен режим retention.bytes).

В экосистеме Go работа с топиками Kafka обычно осуществляется через библиотеки sarama, confluent-kafka-go или kafka-go. Понимание внутреннего устройства топиков критически важно для построения эффективных, отказоустойчивых и масштабируемых потоковых приложений.