Изображение «Анатомия темы» в документах Кафки меня смущает. Относится ли каждый «0» к одним и тем же данным?

avatar
code-ninja-54321
8 апреля 2018 в 11:35
288
2
0

Посмотрите на эту картинку:

enter image description here

Относятся ли три "0" к трем разным элементам данных или все три хранятся в точности как одни и те же данные?

Источник
OneCricketeer
8 апреля 2018 в 18:35
0

Данные реплицируются между брокерами, а не разделами

Ответы (2)

avatar
Mickael Maison
8 апреля 2018 в 11:58
2

Нули относятся к смещениям соответствующих разделов. Из документации (чуть ниже вставленной вами схемы):

Каждый раздел представляет собой упорядоченную неизменяемую последовательность записей, постоянно добавляется к структурированному журналу коммитов. Записи в каждому разделу назначается последовательный идентификационный номер, называемый смещением который однозначно идентифицирует каждую запись в разделе.

В Kafka каждое сообщение имеет смещение в разделе, в котором оно находится, что указывает на его позицию. Все разделы начинаются со смещения 0, и смещение увеличивается для каждого нового сообщения. Это гарантирует порядок сообщений в разделе.

В вашем примере по смещению 0 каждый раздел будет иметь то, что вы отправили в раздел первым.

avatar
Raman Mishra
8 апреля 2018 в 19:37
0

Рассмотрите эти разделы как 3 разных контейнера, содержащих данные одной темы. На самом деле, что происходит, когда мы отправляем некоторые данные производителю кафки, у него есть различная логика для помещения этих данных в определенную тему кафки.

Мы отправляем ProfucerRecord производителю kafka.

ProducerRecord имеет такую ​​структуру. New ProducerRecord(topic, partition, key1, value1), callback);

Скажем, у нас есть тема Test с 3 разделами. 0, 1, 2

  1. Когда мы определяем раздел: Если мы определили раздел в ProducerRecord, он перейдет в этот раздел
  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

  1. Когда мы не определяем раздел или раздел = null

Затем он отправляет данные в раздел в циклическом режиме.

  1. На основе ключа в ProducerRecord.

В этом случае, чтобы выбрать раздел, производитель генерирует хэш-код и логику разделения.

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