Что представляет собой лог в Kafka и какова его роль?

Ответ

Лог в Kafka — это не просто текстовый файл для отладки, а фундаментальная структура данных, представляющая собой упорядоченную, неизменяемую (append-only) последовательность записей. Он является основой для хранения данных в топиках.

Структура:

  1. Топик (Topic): Логическая категория для сообщений.
  2. Партиция (Partition): Топик делится на одну или несколько партиций. Каждая партиция — это отдельный, независимый лог. Это позволяет распараллеливать запись и чтение.
  3. Сегмент (Segment): Физически лог партиции хранится на диске в виде набора файлов-сегментов. Когда сегмент достигает определенного размера или возраста, создается новый.

Каждое сообщение в логе партиции имеет уникальный порядковый номер — offset, который определяет его позицию.

// Пример отправки сообщения в Go, которое будет записано в лог Kafka
package main

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

func main() {
    producer, err := sarama.NewSyncProducer([]string{"localhost:9092"}, nil)
    if err != nil {
        log.Fatalln("Failed to start Sarama producer:", err)
    }
    defer producer.Close()

    msg := &sarama.ProducerMessage{
        Topic: "my_topic",
        Value: sarama.StringEncoder("Hello, Kafka Log!"),
    }

    partition, offset, err := producer.SendMessage(msg)
    if err != nil {
        log.Printf("FAILED to send message: %sn", err)
    } else {
        log.Printf("Message sent to partition %d at offset %dn", partition, offset)
    }
}

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

  • Неизменяемость (Immutability): Данные только добавляются в конец (append-only). Их нельзя изменить или удалить из середины.
  • Долговечность (Durability): Сообщения хранятся на диске и не удаляются после прочтения. Они удаляются только по истечении политики хранения (retention policy) — по времени или размеру.
  • Высокая производительность: Последовательная запись и чтение с диска (sequential I/O) работают очень быстро, что является основой производительности Kafka.
  • Потребители (Consumers): Каждый потребитель самостоятельно отслеживает свой offset (позицию в логе), что позволяет им читать данные в своем собственном темпе.