Что такое партиции в Kafka и как они работают
Что проверяют
Понимаете ли вы, что партиция одновременно единица параллелизма и единица порядка, и чем приходится платить за их число. Следом обычно спрашивают, как гарантировать порядок событий одного заказа и что будет, если консьюмеров в группе больше, чем партиций.
Как отвечать
Топик делится на партиции, каждая это отдельный журнал только на дозапись. У сообщения в партиции есть offset, порядок гарантирован только внутри партиции.
- выбор партиции: продюсер хэширует ключ, и одинаковый ключ всегда попадает в одну партицию, отсюда порядок для одного
order_id; - консьюмер-группа: каждую партицию в группе читает ровно один консьюмер. При шести партициях и восьми инстансах сервиса два простаивают;
- репликация: у партиции есть лидер и фолловеры на других брокерах, надёжность задают
replication.factor,min.insync.replicasиacks=allу продюсера; - число партиций: увеличить можно, уменьшить нельзя. При увеличении меняется соответствие ключей партициям, и порядок для старых ключей ломается.
В Go есть важная специфика: клиенты по-разному выбирают партицию. segmentio/kafka-go по умолчанию раскладывает сообщения по кругу и ключ игнорирует, нужен kafka.Hash или kafka.Murmur2Balancer. sarama хэширует ключ через FNV-1a, librdkafka под confluent-kafka-go через CRC32, а Java-клиент через murmur2, так что Go- и Java-сервисы могут класть один ключ в разные партиции. franz-go по умолчанию совместим с Java. Умолчания по acks у клиентов тоже разные, их надо проверять.
Внутри сервиса удобно держать горутину на партицию и коммитить offset только после обработки.
Где спотыкаются
Предлагают завести партицию под каждую категорию товаров. Нагрузка по категориям неравномерна, и одна партиция становится узким местом. Порядок задаётся ключом, а число партиций подбирают под пропускную способность.
Считают, что Kafka гарантирует порядок во всём топике. Только внутри партиции, и то при ретраях без идемпотентного продюсера порядок может нарушиться.
Коммитят offset до обработки или раздают сообщения одной партиции в пул горутин без учёта порядка. В первом случае при падении теряются данные, во втором ломается гарантия порядка.