Кафка передела - PullRequest
       2

Кафка передела

1 голос
/ 19 марта 2019

Насколько я понимаю, разделы и потребители связаны соотношением 1: 1, в котором один пользователь обрабатывает раздел.Однако существует ли такой способ перераспределения в середине обработки?В настоящее время мы пытаемся оптимизировать процесс, в котором тема используется в группе, но есть случаи, когда обработка данных должна занимать больше времени у определенного потребителя, в то время как другие уже бездействуют.Это похоже на очистку данных, когда определенная секция может больше не нуждаться в очистке, а другие требуют нечеткого сопоставления, что усложняет задачу, которую выполняет потребитель.

Ответы [ 2 ]

1 голос
/ 19 марта 2019

Ваше понимание относительно разделов и потребителей не правильно.

Если у вас N разделов, вы можете иметь до N потребителей в одной группе потребителей, каждый из которых читает из одного раздела.Если у вас меньше потребителей, чем у разделов, то некоторые из них будут читать из более чем одного раздела.Кроме того, если у вас больше потребителей, чем разделов, некоторые из них будут неактивны и вообще не будут получать сообщений.

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

0 голосов
/ 19 марта 2019

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

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

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

Так как у вас уже есть равномерно распределенные сообщения (что хорошо), у вас должно быть столько потребителей, сколько у вас есть разделов, и если это все еще недостаточно быстро, выможет добавить n разделов и n потребителей.(Конечно, вы также можете попытаться оптимизировать потребителя, но это уже другая история ...)

Добавлено для ответа на комментарий:

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

Итак, одинПодход, как сказано в вашем комментарии, будет равномерно распределять нагрузку по разделам.Другой подход - иметь тему, посвященную дорогостоящим работам, чтобы у нее было много разделов и много потребителей;и пусть тема для недорогих рабочих мест будет вызывать лихорадку у потребителей.

Последний подход, который я бы не рекомендовал, заключался в том, чтобы не использовать функции группы потребителей и управлять собой, как вы потребляете из Kafka, с помощью присваивания и поискаметоды от потребителя.(См. KafkaConsumer JavaDoc для получения дополнительной информации).Например, Spark Structured Streaming использует этот подход, но он намного сложнее ...

...