Ответ
Партиции — это механизм параллелизма и масштабирования в Kafka. Каждый топик может быть разделен на одну или несколько партиций, каждая из которых представляет собой упорядоченную, неизменяемую последовательность записей.
Ключевые задачи партиций:
- Масштабирование пропускной способности: Записи в разные партиции одного топика могут обрабатываться параллельно разными консьюмерами в рамках consumer group. Это позволяет горизонтально масштабировать обработку.
- Гарантия порядка записей: Порядок записей гарантирован только в пределах одной партиции. Это критично для сценариев, где важен последовательный порядок обработки связанных сообщений (например, все события по одному пользователю).
- Распределение и отказоустойчивость: Партиции распределяются и реплицируются между брокерами кластера, обеспечивая отказоустойчивость и балансировку нагрузки.
Пример: Отправка сообщения с ключом для гарантии порядка
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 гарантирован в целевой партиции.
Важно: Количество партиций топика задается при создании и впоследствии может быть только увеличено. Слишком малое число партиций ограничит параллелизм, слишком большое — увеличит накладные расходы на управление.