topic kafka , описание partition (producer, consumer , factor replication , offset)

Здравствуйте, это codeshow.
За это время мы узнаем о topic и partition в kafka .
Чтобы использовать kafka, у вас должна быть topic.
На основе этой topic producer publish сообщения,
consumer подписывается на сообщения.
Запустите kafka , чтобы создать topic .
Пожалуйста, обратитесь к предыдущему видео для настройки среды.
Запустите devcontainers для практики kafka .
Дождитесь, пока container запустится.
Когда container закончит работу, мы откроем desktop docker .
Выполнить shell в container kafka .
Для поиска topic используйте option list topics kafka .

kafka-topics --bootstrap-server kafka:9092 --list

Я подтвердил, что нет topic , кроме offsets consumer topic и schemas, созданных по умолчанию.
Создайте topic , используя option create команды kafka topics .

kafka-topics --bootstrap-server kafka:9092 --create --topic hello --partitions 1 --replication-factor 1

Я создал topic с именем hello с помощью команды topics kafka .
Название topic задается с помощью option name .
option factor replication option выбрать, сколько копий данных partition необходимо сделать.
Я устанавливаю значение factor реплики, равное количеству узлов kafka .
Более высокие значения влекут за собой затраты на копирование разделов между узлами, что влияет на производительность.
Вместо этого, если значение мало, данные могут быть потеряны в случае сбоя kafka .
Обычно рекомендуется значение 3 или выше.

Для справки, ошибка возникает, если поставить factor replication больше, чем количество нод kafka на момент create .

kafka-topics --bootstrap-server kafka:9092 --create --topic error --partitions 1 --replication-factor 4

Я объясню partitions с другим option .
partition— очень важная информация в kafka.
option partitions — это информация, которая устанавливает, на сколько topic следует разделить.
Если producer publish 100 topic , и эта topic имеет только 1 partition,
100 topic объединены в 1 partition.
Если consumer требуется 1 минута для обработки 1 topic.
Обработка 100 topic займет 100 минут.
Если вы установите partition равным 4, topic будут складываться по 25 в каждом из 4 разделов.
Поскольку в одном partition может быть не более одного consumer,
Теперь можно добавить 3 consumer столько, сколько увеличилось количество разделов.
Время обработки может быть сокращено на 1/4 со 100 минут до 25 минут.

Мы будем практиковать содержимое до сих пор, используя shell.
Я буду практиковать producer и consumer по hello topic .
Запустите terminal в container kafka .
Поместите producer слева, а consumer справа.
Подключитесь к kafka с помощью команды producer console kafka .

kafka-console-producer --bootstrap-server kafka:9092 --topic hello 

producer подключен к broker kafka .

Подключитесь к kafka с помощью команды consumer console kafka .
partition увеличивается последовательно, начиная с индекса 0.
На практике, поскольку size partition равен 1, можно использовать только partition 0.
Введите номер partition 0 в качестве option .

kafka-console-consumer --bootstrap-server kafka:9092 --topic hello --partition 0

Введите hello message для producer .
Вы можете проверить hello в consumer .

Итак, могут ли несколько consumer подключаться к одному partition ?
Запустим дополнительный terminal и добавим consumer.

kafka-console-consumer --bootstrap-server kafka:9092 --topic hello --partition 0

consumer подключается без проблем.

Так что же происходит, когда вы publish сообщение как producer ?
Есть два сценария.

  1. Сообщения доставляются последовательно, один раз в порядке consumer .
    Это называется round robin методом.
  2. Все сообщения доставляются всем consumer.
    Название называется broadcasting.

Введите сообщение hello1 в качестве producer, чтобы проверить работу.
Сообщение hello1 появляется на обоих consumer.
Введите сообщение hello2 еще раз в качестве producer.
Сообщение hello2 появляется на обоих consumer.
В kafka все consumer , подключенные к одному и тому же partition , получают сообщения посредством broadcasting .

Для справки, rabbit mq, еще один broker message , может подключать несколько worker к одной queue .
А при round robin worker получают сообщения последовательно.
Эта часть работает иначе, чем kafka, поэтому те, кто впервые столкнулся с rabbit mq , могут запутаться.
rabbit mq увеличивает пропускную способность за счет увеличения size worker в одной queue ,
kafka увеличивает пропускную способность за счет увеличения size partition одной topic .

В этом упражнении мы изменим количество partition.
Увеличим количество partition с 1 до 2.
Выйдите из producer, нажав ctrl c.
Давайте увеличим size partition до 2, используя option alter команды kafka topics .

kafka-topics --bootstrap-server kafka:9092 --alter --partitions 2 --topic hello

Проверьте информацию о разделе с опцией describe topics kafka .

kafka-topics --bootstrap-server kafka:9092 --topic hello --describe

Для справки, вы также можете проверить увеличенный size partition 2 на экране topic AKHQ .
Снова запустите producer и добавьте consumer во вновь добавленный partition №1.

kafka-console-producer --bootstrap-server kafka:9092 --topic hello 

Завершите работу consumer , подключенного к существующему partition 0, и подключите consumer к новому partition 1.

kafka-console-consumer --bootstrap-server kafka:9092 --topic hello --partition 0
kafka-console-consumer --bootstrap-server kafka:9092 --topic hello --partition 1

Создайте случайное количество сообщений с помощью producer.
Есть два consumer, но topic разделена и доставлена только одному consumer.

Это cache с sticky partition , как работает kafka , когда нет key .
Если key нет, первый отправленный номер partition cache и topic перенаправляется только в этот partition .
Если key нет, увеличивать partition бессмысленно, так как используется только один partition .
Другими словами, key — это важная информация, определяющая partition , в topic в kafka .
Мы добавим key , чтобы topic хорошо разделялись и хранились между partition .

Добавьте option property в producer и снова запустите его.

kafka-console-producer --bootstrap-server kafka:9092 --topic hello --property "key.separator=-" --property "parse.key=true"

Давайте поместим случайное значение в качестве producer.
Теперь вы можете видеть, что topic разделена на partition и сохранена.
В частности, вы можете проверить, что один и тот же key publish в одном и том же partition через consumer.

При использовании option separator key publish key перед тире и value после него.
a — это key, а b — это value.
Для справки: раньше без key publish только value hello .

Если значения, предшествующие тире, совпадают, key тот же.
Важно отметить, что один и тот же key всегда хранится в одном и том же partition.
Однако, если key разные, они хранятся в partition или разных partition.
Чтобы понять эту часть, давайте посмотрим, как обрабатывать key в kafka .
kafka hash key и вычисляет остаток, равный количеству узлов kafka , и определяет значение результата как номер partition .
Поскольку partition теперь два, в качестве номеров partition могут отображаться только 0 и 1.
Для справки, алгоритм hash использует hash murmur2 .

Важный момент, который нужно понять о partition, заключается в том, что kafka гарантирует порядок topic только для partition .
То есть при publish topic , порядок которых важен, размещайте их в одном partition.
Я проверил, что значение key всегда хранится в одном и том же partition,
Для topic, где важен порядок, обязательно используйте один и тот же key!

Далее я объясню offset partition .
kafka отличается от существующей queue message тем, что не удаляет сообщения из queue после consume .

Разделы похожи на массивы.
topic в partition хранятся по порядку, как элементы массива.
Точно так же, как вы получаете доступ к значению массива по индексу, вы можете consume из определенного индекса partition через offset .
Для справки, каждый partition имеет последнее offset.
Таким образом, если новый consumer подключается без option offset , он consume с последнего offset .
Однако, если указана option offset , сначала consume информация о offset .

В качестве упражнения мы выдадим terminal две команды.

  1. Приказать consumer выполнить со offset 0.
  2. Команда для выполнения consumer без команды offset .
kafka-console-consumer --bootstrap-server kafka:9092 --topic hello --partition 1 --offset 0
kafka-console-consumer --bootstrap-server kafka:9092 --topic hello --partition 1 

Если вы дадите option offset index 0, вы можете проверить, что она снова выполняется с самого начала.
Если option offset отсутствует, параметр offset по умолчанию имеет значение самое последнее.
consume только недавно publish topic .

Наконец, в качестве важного ограничения на partition
Вы не можете указать меньшее значение size partition .
Для size partition можно вводить только большие значения.
Я дам команду alter , чтобы уменьшить partition с 2 до 1.

kafka-topics --bootstrap-server kafka:9092 --alter --partitions 1 --topic hello

Вы можете увидеть сообщение об ошибке, в котором вам будет предложено установить для option partition значение больше 2.

На этом объяснение topic и partition kafka заканчивается.
В следующий раз мы рассмотрим, как использовать groups consumer .
Для справки, а не consumer, непосредственно consume partition ,
На практике больше используются consumer groups.
Чтобы лучше понять эти groups consumer , этот класс
У меня было время выучить partition.

Настройки подписки и лайков очень полезны для создателей контента.

Спасибо