Из каких основных компонентов состоит Apache Kafka?

Ответ

Apache Kafka — это распределенная стриминговая платформа. Её архитектура состоит из следующих ключевых компонентов:

  1. Broker (Брокер) — сервер Kafka, который хранит данные. Несколько брокеров образуют кластер Kafka, обеспечивая отказоустойчивость и масштабируемость.

  2. Topic (Топик) — именованный поток записей (сообщений). Топики можно рассматривать как аналог таблиц в базах данных. Продюсеры пишут данные в топики, а консьюмеры читают из них.

  3. Partition (Партиция) — топики делятся на партиции для параллельной обработки. Каждая партиция является упорядоченным, неизменяемым логом сообщений. Порядок сообщений гарантируется только в пределах одной партиции.

  4. Producer (Продюсер) — клиентское приложение, которое публикует (отправляет) сообщения в топики Kafka.

  5. Consumer (Консьюмер) — клиентское приложение, которое подписывается на топики и читает из них сообщения.

  6. Consumer Group (Группа консьюмеров) — группа консьюмеров, которые совместно читают данные из одного топика. Kafka распределяет партиции топика между консьюмерами в группе, так что каждая партиция обрабатывается только одним консьюмером из группы. Это основной механизм масштабирования чтения.

  7. ZooKeeper / KRaft — компонент для управления кластером.

    • ZooKeeper (в старых версиях) использовался для хранения метаданных о кластере: конфигурации брокеров, топиков, списков контроля доступа (ACL).
    • KRaft (Kafka Raft) — новый протокол консенсуса, который позволяет Kafka управлять метаданными самостоятельно, без зависимости от ZooKeeper. Это упрощает развертывание и администрирование кластера.

Пример создания Producer на Go с использованием sarama:

package main

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

func main() {
    config := sarama.NewConfig()
    config.Producer.Return.Successes = true
    producer, err := sarama.NewSyncProducer([]string{"localhost:9092"}, config)
    if err != nil {
        panic(err)
    }
    defer producer.Close()

    msg := &sarama.ProducerMessage{
        Topic: "my-topic",
        Value: sarama.StringEncoder("Hello, Kafka!"),
    }

    partition, offset, err := producer.SendMessage(msg)
    if err != nil {
        panic(err)
    }

    fmt.Printf("Message is stored in topic(%s)/partition(%d)/offset(%d)n", "my-topic", partition, offset)
}