Ответ
Лог в Kafka — это не просто текстовый файл для отладки, а фундаментальная структура данных, представляющая собой упорядоченную, неизменяемую (append-only) последовательность записей. Он является основой для хранения данных в топиках.
Структура:
- Топик (Topic): Логическая категория для сообщений.
- Партиция (Partition): Топик делится на одну или несколько партиций. Каждая партиция — это отдельный, независимый лог. Это позволяет распараллеливать запись и чтение.
- Сегмент (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
(позицию в логе), что позволяет им читать данные в своем собственном темпе.