может ли потребитель kafka отфильтровывать сообщения перед опросом их всех по теме? - PullRequest
0 голосов
/ 26 июня 2018

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

Это означает, что мы должны потреблять / получать все сообщения из темы и фильтровать их на стороне клиента.

Это слишком много. Мне было интересно, можем ли мы фильтровать и получать определенные типы сообщений, основываясь на том, что уже было передано посредникам, например на ключах msg или других вещах.

из метода Consumer.poll (timeout) кажется, что мы ничего не можем сделать.

Ответы [ 3 ]

0 голосов
/ 26 июня 2018

Как только записи уже помещены в кластер Kafka, вы мало что можете сделать. Что бы вы ни хотели отфильтровать, вам всегда нужно будет передавать клиенту куски данных.

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

0 голосов
/ 27 июня 2018

Каждая тема Кафки должна содержать сообщения, которые логически похожи, просто чтобы оставаться в теме. Теперь иногда может случиться, что у вас есть тема, скажем, fruits , которая содержит различные атрибуты фрукта (возможно, в формате json). У вас могут быть разные сообщения о фруктах, выдвинутые производителями, но вы хотите, чтобы одна из вашей группы потребителей обрабатывала только яблоки. В идеале вы могли бы использовать названия тем с отдельными названиями фруктов, но давайте предположим, что по какой-то причине это будет бесплодным начинанием (может быть, слишком много тем). В этом случае вы можете переопределить схему разбиения по умолчанию в Kafka, чтобы игнорировать ключ и выполнить произвольное разбиение, а затем передать свой класс пользовательских разделителей через свойство partitioner.class в источнике, который помещает название плода в ключе msg. Это необходимо, потому что по умолчанию, если вы ставите ключ во время отправки сообщения, он всегда будет перемещаться в один и тот же раздел, что может привести к дисбалансу раздела.

Идея, лежащая в основе этого, иногда заключается в том, что, если ваше значение Kafka msg является сложным объектом (json, avro-record и т. Д.), Может быть быстрее отфильтровать запись по ключу, чем анализировать все значение и извлекать требуемое поле. У меня сейчас нет никаких данных, чтобы поддержать выигрыш в производительности этого подхода. Это только интуиция.

0 голосов
/ 26 июня 2018

Нет, с Потребителем вы не можете получать только некоторые сообщения из тем. Потребитель получает все сообщения по порядку.

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

...