Найти в Дзене
Crazy Coder

Как работает Apache Kafka и как связаны Topic, Partitions, Consumer

Работает в FIFO - просто последовательный лог, пишем на диск в одном стриме (sequential write), читаем не удаляя сообщения (а перемещаем offset на каждую группу). Да, можно! Ты можешь явно указать, что консьюмер должен читать только из конкретной партиции топика, не участвуя в балансировке через Consumer Group. Пример на Java: consumer.assign(Arrays.asList(new TopicPartition("my-topic", 0))); Или в Go (с использованием segmentio/kafka-go, например): r := kafka.NewReader(kafka.ReaderConfig{
Brokers: []string{"localhost:9092"},
Topic: "my-topic",
Partition: 0,
GroupID: "", // без группы
}) Но в этом случае: Топик = набор партиций
Консьюмер может быть частью группы или читать напрямую из партиции
Kafka распределяет партиции топика между консьюмерами группы
Сообщения удаляются либо по количеству, либо по времени
Оглавление

Работает в FIFO - просто последовательный лог, пишем на диск в одном стриме (sequential write), читаем не удаляя сообщения (а перемещаем offset на каждую группу).

💡 Основные сущности:

  • Топик (Topic) — логическая категория, куда пишутся и откуда читаются сообщения. Например, user-events.
  • Партиции (Partitions) — физическое деление топика. Один топик состоит из N партиций. Сообщения внутри партиции упорядочены, но между партициями — нет. Partitions - это способ распараллелить FIFO, сообщения упорядочены в партиции, партиция это папка с log файлом (.log - сообщение)
  • Консьюмер (Consumer) — процесс, который читает данные из Kafka.
  • Группа консьюмеров (Consumer Group) — набор консьюмеров, которые совместно читают из одного топика.

📌 Связь между ними:

  • Топик содержит партиции.
  • Консьюмеры читают из партиций.
  • Группа консьюмеров читает из топика.
    Kafka распределяет партиции топика между консьюмерами в группе.
    Каждая партиция читается только одним консьюмером в группе (на момент времени).
  • Если ты создашь несколько групп, то они будут независимо читать одни и те же сообщения, каждая со своей позицией (offset).

❓Можно ли подключить консьюмера к конкретной партиции?

Да, можно!

Ты можешь явно указать, что консьюмер должен читать только из конкретной партиции топика, не участвуя в балансировке через Consumer Group.

Пример на Java:

consumer.assign(Arrays.asList(new TopicPartition("my-topic", 0)));

Или в Go (с использованием segmentio/kafka-go, например):

r := kafka.NewReader(kafka.ReaderConfig{
Brokers: []string{"localhost:9092"},
Topic: "my-topic",
Partition: 0,
GroupID: "", // без группы
})

Но в этом случае:

  • Kafka не будет делать автоматическую балансировку.
  • Консьюмер сам управляет смещениями (offsets).

🧠 Кратко:

Топик = набор партиций
Консьюмер может быть частью группы или читать напрямую из партиции
Kafka распределяет партиции топика между консьюмерами группы
Сообщения удаляются либо по количеству, либо по времени