Как обеспечить, чтобы при прослушивании тем с несколькими разделами для Kafka Streams обрабатывались все связанные данные? - PullRequest
1 голос
/ 15 апреля 2020

Хотелось бы узнать, как потоки Кафки назначаются разделам тем для чтения. Насколько я понимаю, каждый поток Kafka Stream является потребителем (и для потока существует одна группа потребителей). Таким образом, я предполагаю, что потребители случайным образом распределены между разделами.

Но как это работает, если у меня есть несколько тем ввода, к которым я хочу присоединиться?

Пример:

Topi c P содержит людей. У него есть два раздела. Ключ сообщения - это идентификатор человека, поэтому каждое сообщение, которое принадлежит человеку, всегда заканчивается в одном и том же разделе.

Topi c O содержит заказы. У него есть два раздела. Допустим, ключом является также идентификатор человека (человека, который что-то заказал). Поэтому и здесь каждое сообщение-заказ, принадлежащее человеку, всегда попадает в один и тот же раздел.

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

Данные в topi c P :

Раздел 1 : "hans, id=1", "maria, id=3"

Раздел 2 : "john, id=2"

Данные в topi c O :

Раздел 1 : "person-id=2, pizza", "person-id=3, cola"

Раздел 2 : "person-id=1, lasagne"

А теперь я запускаю два потока.

Тогда это может произойти:

Поток 1 назначается для topi c P раздела 1 и topi c O раздела 1 .

Поток 2 назначается для topi c P раздела 2 и topi c O раздела 2 .

Это означает, что ордер lasagne для hans никогда не получит счет d , потому что для этого поток должен потреблять topi c P раздел 1 и topi c O раздел 2 .

Так как справиться с этой проблемой? Я предполагаю, что довольно часто потоки должны каким-то образом обрабатывать данные, которые связаны друг с другом. Поэтому необходимо обеспечить, чтобы соответствующие данные (здесь: hans и lasagne) обрабатывались одним и тем же потоком.

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

Спасибо

1 Ответ

1 голос
/ 16 апреля 2020

Ваш вариант использования: KStream-KTable соединение , где KTable хранит информацию о пользователях, а KStream - поток заказа, поэтому 2 темы должны быть co-partitioned, для которых они должны иметь одинаковый номер раздела и разделены тем же ключом и Partitioner. Если вы используете person-id в качестве ключа для сообщений kafka и используете один и тот же Partitioner, вам не следует беспокоиться об этом случае, поскольку они находятся на одном номере раздела.

Обновлено : Как указывал Матиас, каждый поток Stream имеет свой собственный экземпляр Consumer.

...