Посмотрите на эту картинку:
Относятся ли три "0" к трем разным элементам данных или все три хранятся в точности как одни и те же данные?
Нули относятся к смещениям соответствующих разделов. Из документации (чуть ниже вставленной вами схемы):
Каждый раздел представляет собой упорядоченную неизменяемую последовательность записей, постоянно добавляется к структурированному журналу коммитов. Записи в каждому разделу назначается последовательный идентификационный номер, называемый смещением который однозначно идентифицирует каждую запись в разделе.
В Kafka каждое сообщение имеет смещение в разделе, в котором оно находится, что указывает на его позицию. Все разделы начинаются со смещения 0, и смещение увеличивается для каждого нового сообщения. Это гарантирует порядок сообщений в разделе.
В вашем примере по смещению 0 каждый раздел будет иметь то, что вы отправили в раздел первым.
Рассмотрите эти разделы как 3 разных контейнера, содержащих данные одной темы. На самом деле, что происходит, когда мы отправляем некоторые данные производителю кафки, у него есть различная логика для помещения этих данных в определенную тему кафки.
Мы отправляем ProfucerRecord производителю kafka.
ProducerRecord имеет такую структуру. New ProducerRecord(topic, partition, key1, value1), callback);
Скажем, у нас есть тема Test с 3 разделами. 0, 1, 2
Если мы отправим эти 3 записи в тему Test.
producer.send( New ProducerRecord(Test, 0, 1, «A»)) Смещение раздела 0 будет 0
producer.send( New ProducerRecord(Test, 1, 2, "B")) Смещение раздела 1 будет 0
producer.send( New ProducerRecord(Test, 2, 3, "C")) Смещение раздела 2 будет 0
Затем он отправляет данные в раздел в циклическом режиме.
В этом случае, чтобы выбрать раздел, производитель генерирует хэш-код и логику разделения.
hashCode % number of partition
Предположим (хэш-код для ключа 1) % 3 (номер раздела) дает 0 Для (hasCode of 2) % 3 дает 1 И для (hashCode of 3) %3 дает 2
Что гарантирует, что данные всегда будут попадать в один и тот же раздел ключа.
Если мы отправим эти 6 сообщений в тему Test.
producer.send( New ProducerRecord(Test, 1, "A")) Смещение раздела 0 будет 0
producer.send( New ProducerRecord(Test, 1, "B")) Смещение раздела 0 будет 1
producer.send( New ProducerRecord(Test, 1, "C")) Смещение раздела 0 будет 2
producer.send( New ProducerRecord(Test, 1, "D")) Смещение раздела 0 будет 3
producer.send( New ProducerRecord(Test, 2, "E")) Смещение раздела 1 будет 0
producer.send( New ProducerRecord(Test, 2, "F")) Смещение раздела 1 будет 1
producer.send( New ProducerRecord(Test, 3, "G")) Смещение раздела 2 будет 0
Данные реплицируются между брокерами, а не разделами