Как Consumer in Kafka может быть назначен определенному разделу, раздел в моем случае назначается через хэш-значение ключа - PullRequest
0 голосов
/ 31 августа 2018

Когда раздел назначается производителем с использованием номера. Например,

kafkaTemplate.send(topic, 1, "[" + LocalDateTime.now() + "]" + "Message to partition 1");

Параметр number 1 second определяет идентификатор раздела, на который я хочу отправить мое сообщение. Таким образом, потребитель может использовать это сообщение:

 TopicPartition partition1 = new TopicPartition(topic, 1);
 consumer1.assign(Arrays.asList(partition1));

Но как мне добиться этого для производителя, выбирающего раздел на основе хеша ключа, отправленного производителем с помощью DefaultPartitioner. Пример:

kafkaTemplate.send(topic, "forpartition1", "testkey");

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

1 Ответ

0 голосов
/ 31 августа 2018

Исходя из информации, что вы новичок в Kafka, я склонен предположить, что вы непреднамеренно пытаетесь использовать расширенный вариант использования, и это, вероятно, не то, что вы хотите.

Обычный вариант использования - публикация сообщений в теме. Сообщение назначается разделом на основе key, и все сообщения для одного и того же ключа заканчиваются в одном разделе.

Что касается потребителя, вы подписываетесь на всю тему (без явного запроса на раздел), и Kafka будет распределять разделы между всеми доступными пользователями.

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

Если вы действительно хотите выбрать раздел самостоятельно, вы можете написать класс разделителя и настроить его на использование производителем, установив partitioner.class configuration.

Из документации Кафки

NAME
partitioner.class

DESCRIPTION
Partitioner class that implements the org.apache.kafka.clients.producer.Partitioner interface.

TYPE
class

DEFAULT
org.apache.kafka.clients.producer.internals.DefaultPartitioner

VALID VALUES

IMPORTANCE
medium

Несколько примеров учебных пособий о том, как это сделать, можно найти в Интернете. Вот образец для справки:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...