Кафка сообщений разделение по ключам - PullRequest
1 голос
/ 19 апреля 2019

У нас есть бизнес-процесс / рабочий процесс, который запускается при получении исходного сообщения о событии и закрывается при обработке последнего сообщения.У нас до 100 000 процессов, выполняемых каждый день.Моя проблема в том, что порядок сообщений, поступающих в конкретный процесс, должен обрабатываться так же, как и сообщения о порядке поступления.В случае сбоя одного из сообщений процесс должен остановиться, пока проблема не будет устранена, несмотря на то, что все остальные процессы должны продолжаться.Для такой ситуации я думаю об использовании Кафки.Первое решение, которое пришло мне в голову, это использовать разделение тем по ключам сообщений.Ключом сообщения будет ProcessId.Таким образом, я мог быть уверен, что все сообщения процесса будут разделены, и kafka будет гарантировать порядок.Поскольку я новичок в Kafka, мне удалось выяснить, что разделы должны быть созданы заранее, и это усложняет все.поэтому мои вопросы:

1) когда я создаю сообщение для темы kafka, которая не существует, тема создается во время выполнения.Можно ли иметь такое же поведение для тематических разделов?2) в теме может быть более 100 000 активных разделов, это проблема?3) можно ли удалить раздел после прочтения всех сообщений из этой темы?4) может быть, вы можете предложить другие подходы к моей проблеме?

Ответы [ 2 ]

1 голос
/ 19 апреля 2019

Когда я создаю сообщение для несуществующей темы Кафки, эта тема создается во время выполнения. Возможно ли такое же поведение для тематических разделов?

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

Подробнее: https://kafka.apache.org/documentation/#basic_ops_modify_topi

Как только вы увеличите количество разделов, производитель и потребитель будут уведомлены о новых разделах, что приведет к их перебалансированию. После восстановления баланса производитель и потребитель начнут производить и потреблять из нового раздела.

В теме может быть более 100 000 активных разделов, это проблема?

Да, наличие такого большого количества разделов увеличит общую задержку. Прочтите how-choose-number-themes-partitions-kafka-cluster о том, как определить количество разделов.

можно ли удалить раздел после прочтения всех сообщений из этой темы?

Удаление раздела приведет к потере данных, а также к тому, что оставшиеся ключи данных не будут распределены правильно, поэтому новые сообщения не будут направлены в те же разделы, что и старые существующие сообщения с тем же ключом. Вот почему Kafka не поддерживает уменьшение количества разделов по теме.

Также Кафка Док утверждает, что

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

0 голосов
/ 20 апреля 2019

Я полагаю, вы выбрали неправильную функцию для решения своей задачи.

  • Как правило, разбиение используется для балансировки нагрузки.
  • Входящие сообщения будут распределяться по заданному номеру раздела в соответствии со стратегией разделения, определенной при запуске брокера. Короче говоря, стратегия по умолчанию просто вычисляет i=key_hash mod number_of_partitions и помещает сообщение в i-й раздел. Подробнее о стратегиях вы можете прочитать здесь
  • Порядок сообщений гарантируется только внутри раздела. С двумя сообщениями из разных разделов у вас нет никаких гарантий , которые первыми приходят потребителю.

Возможно, вы бы использовали группу вместо . Это вариант для потребителя

  • Каждая группа потребляет все сообщения из темы независимо.
  • Группа может состоять из одного или нескольких потребителей, если вам это нужно.
  • Вы можете назначить много групп и добавить новую группу (фактически, добавить нового потребителя с новым groupId) динамически.
  • Поскольку вы можете остановить / приостановить работу любого потребителя, вы можете вручную остановить всех потребителей, связанных с указанной группой. Я полагаю, что нет единой команды, чтобы сделать это, но я не уверен. В любом случае, если у вас есть один потребитель в каждой группе, вы можете легко остановить его.
  • Если вы хотите удалить группу, просто отключите ее и отмените связанных потребителей. Никаких действий со стороны брокера не требуется.

В качестве недостатка вы получите 100 000 потребителей, которые читают (одну) тему. Это большая нагрузка на сеть, по крайней мере.

...