Кафка тема с разделами - PullRequest
       9

Кафка тема с разделами

0 голосов
/ 20 сентября 2018

Простой вопрос:

Предположим, у меня есть тема с 3 разделами: Тема: StateEvents P1, P2 и P3.

Давайте также предположим, что производитель генерирует 20 сообщений:

1, 2, 3, .......... 20

мой вопрос:

Когда производитель создает следующие сообщения:

1) Будет ли каждое сообщение только в одном разделе?то есть 1 в P1, 2 в P2, 3 в P3, затем 4 в P1, 5 в P2, 6 в P3 и т. д. и т. д.

2) Если # 1 верно, когдапотребитель подписывается, он будет подписываться на ВСЕ разделы, чтобы получать все сообщения?

Спасибо

Ответы [ 3 ]

0 голосов
/ 21 сентября 2018

1) Целевой раздел определяется производителем.При использовании алгоритма секционирования по умолчанию (который можно настроить) целевой раздел: hash (message-key)% num_partitions.Это означает, что все сообщения с одинаковым ключом попадают в один и тот же раздел.Так что если вы используете ключ и все сообщения имеют одинаковый ключ, то они отправляются в один и тот же раздел.Если ключ не указан, используется циклический перебор.В любом случае сообщение всегда отправляется только в ОДИН раздел.

2), если потребитель является единственным в группе потребителей, он получит все разделы.Вы можете добавить больше потребителей в одну и ту же группу потребителей для распределения нагрузки (в вашем случае до 3 потребителей, то есть количество разделов, имеющихся в теме, чтобы один потребитель получил один раздел).

Получение разных потребителей сообщений из разных разделов - это способ, которым Kafka действительно хорошо масштабируется.Это не недостаток, потому что вы должны думать о потреблении приложения (сделанного несколькими потребителями).Идентификатор приложения может быть идентификатором группы, используемым всеми его потребителями: у вас есть приложение, получающее ВСЕ сообщения из темы, но нагрузка распределяется между его потребителями.

0 голосов
/ 21 сентября 2018

Каждое сообщение будет отправлено только одному разделу

Если ключ не равен нулю, вычисление идентификатора раздела выполняется в соответствии с методом разделения, реализованным в конфигурации.вот исходный код

class DefaultPartitioner(props: VerifiableProperties = null) extends Partitioner {
  private val random = new java.util.Random

  def partition(key: Any, numPartitions: Int): Int = {
    Utils.abs(key.hashCode) % numPartitions
  }
}

Чтобы обеспечить одинаковый тип последовательности сообщений (FIFO), раздел может использоваться только одним потребителем из одной группы, а потребители разных групп могут связывать один и тот же разделдля многократного потребления. Но потребитель может создать несколько разделов.

0 голосов
/ 20 сентября 2018
  1. Да, каждое сообщение написано только в одном разделе.

  2. Когда один пользователь подписывается на тему kafka (с несколькими разделами), он будет читать сообщения со всех разделов.Но если вы запускаете несколько потребителей с одним и тем же group.id, каждый потребитель будет читать из разных разделов.

Допустим, у темы kafka есть 3 раздела, и у вас есть 3 потребителя с одинаковым group.id.Каждый потребитель будет читать с 1-1 разделов.Но если есть только один потребитель, он будет читать все 3 раздела.

...