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

Ответ

Партиция (partition) — это основная единица параллелизма и хранения данных в Kafka. Каждый топик в Kafka делится на одну или несколько партиций.

Ключевые цели и свойства партиций:

  1. Масштабируемость (Scalability):

    • Разделение топика на партиции позволяет распределять данные и нагрузку по нескольким брокерам (серверам) в кластере.
    • Это также позволяет нескольким потребителям из одной группы читать данные из одного топика параллельно, так как каждый потребитель может быть назначен на свою партицию. Пропускная способность системы прямо зависит от количества партиций.
  2. Гарантия порядка сообщений (Ordering):

    • Kafka гарантирует строгий порядок доставки сообщений только в пределах одной партиции. Сообщения записываются в партицию в том порядке, в котором они поступили, и читаются в том же порядке.
    • Порядок между разными партициями не гарантируется.
    • Для сохранения порядка связанных сообщений (например, всех событий для одного пользователя) их нужно отправлять с одинаковым ключом. Продюсер по умолчанию использует хэш ключа для выбора партиции, гарантируя, что все сообщения с одним и тем же ключом попадут в одну и ту же партицию.
  3. Отказоустойчивость (Fault Tolerance):

    • Каждая партиция может быть реплицирована на несколько брокеров. Одна из реплик является лидером (принимает запись и чтение), а остальные — последователями (копируют данные с лидера).
    • Если брокер с лидером партиции выходит из строя, один из последователей автоматически становится новым лидером, обеспечивая непрерывную доступность данных.

Как выбрать количество партиций?

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

Ответ 18+ 🔞

Ну вот смотри, партиция в Кафке — это, по сути, её фундаментальная единица, на которой всё и держится, как та самая несущая стена в хрущёвке. Каждый топик внутри себя делится на одну или несколько таких вот партиций, и это, блядь, не просто так.

Зачем это всё, и в чём соль?

  1. Масштабируемость, ёпта (Scalability):

    • Представь, что твой топик — это одна гигантская очередь в столовую. Все в одну дверь ломятся, повар один, всё встало. Так вот, партиции — это когда делают несколько окон раздачи, блядь! Данные и нагрузка раскидываются по разным брокерам (серверам), и потребители из одной группы могут жрать параллельно, каждый из своего окошка. Важнейший момент, запомни как "Отче наш": общая пропускная способность топика — она прямо, сука, зависит от количества этих самых партиций. Больше партиций — потенциально больше параллелизма. Но и головной боли тоже, но об этом позже.
  2. Порядок, мать его, сообщений (Ordering):

    • Кафка — не хаос, она гарантирует строгий порядок доставки, но только в рамках одной партиции. Внутри одной партиции сообщения ложатся как кирпичики ровно в том порядке, как пришли, и читаются так же.
    • А вот между разными партициями — там уже анархия, порядок не гарантирован. Поэтому, если тебе нужно, чтобы все события по одному юзеру шли строго по очереди (сначала залогинился, потом купил, потом вышел), ты должен слать их с одним и тем же ключом. Продюсер, хитрая жопа, по хэшу ключа определит, в какую именно партицию это всё отправить, и все сообщения про Васю Пупкина будут в одной партиции, в идеальном порядке. А про Петю Сидорова — в другой, и их порядок с Васей не связан. Гениально и просто, как топор.
  3. Живучесть, чтоб её (Fault Tolerance):

    • Каждая партиция — это не одинокий воин. Её можно размножить (реплицировать) на несколько брокеров. Одна реплика — лидер (она всем заправляет, принимает запись и чтение), остальные — последователи (тупо копируют с лидера, как мартышлюшки).
    • И если брокер с лидером вдруг накрылся медным тазом, один из последователей тут же вылезает из тени и говорит: "Так, блядь, я теперь главный!". Данные целы, работа продолжается. Красота.

А теперь главный вопрос, на котором все обжигаются: сколько этих партиций-то делать?

Вот это, ёбушки-воробушки, самое важное архитектурное решение. Потому что партиции можно потом увеличить, но вот уменьшить — нихуя не получится, только топик сносить и заново создавать.

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