Зачем нужны партиции у топика в Apache Kafka?

«Зачем нужны партиции у топика в Apache Kafka?» — вопрос из категории Брокеры сообщений, который задают на 25% собеседований C# Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Партиции — это механизм параллелизма и масштабирования в Kafka. Каждый топик может быть разделен на одну или несколько партиций, каждая из которых представляет собой упорядоченную, неизменяемую последовательность записей.

Ключевые задачи партиций:

  1. Масштабирование пропускной способности: Записи в разные партиции одного топика могут обрабатываться параллельно разными консьюмерами в рамках consumer group. Это позволяет горизонтально масштабировать обработку.
  2. Гарантия порядка записей: Порядок записей гарантирован только в пределах одной партиции. Это критично для сценариев, где важен последовательный порядок обработки связанных сообщений (например, все события по одному пользователю).
  3. Распределение и отказоустойчивость: Партиции распределяются и реплицируются между брокерами кластера, обеспечивая отказоустойчивость и балансировку нагрузки.

Пример: Отправка сообщения с ключом для гарантии порядка

using Confluent.Kafka;

var config = new ProducerConfig { BootstrapServers = "localhost:9092" };
using var producer = new ProducerBuilder<string, string>(config).Build();

// Сообщения с одинаковым ключом всегда попадут в одну и ту же партицию.
var message1 = new Message<string, string> 
{ 
    Key = "user-123", // Ключ определяет партицию
    Value = "{"event": "login"}" 
};
var message2 = new Message<string, string> 
{ 
    Key = "user-123", // Попадет в ту же партицию, что и message1
    Value = "{"event": "logout"}" 
};

await producer.ProduceAsync("user-events-topic", message1);
await producer.ProduceAsync("user-events-topic", message2);
// Порядок message1 -> message2 гарантирован в целевой партиции.

Важно: Количество партиций топика задается при создании и впоследствии может быть только увеличено. Слишком малое число партиций ограничит параллелизм, слишком большое — увеличит накладные расходы на управление.