Можем ли мы потерять сообщения в Kafka Streams, если добавим новые разделы? - PullRequest
0 голосов
/ 31 октября 2018

Скажем, например, у меня есть 4 раздела. Когда сообщение msg1 из ключ 101 помещается в раздел 1 ( из 4 ) и не потребляется пока . Тем временем добавляется новый раздел, в результате чего получается 5 разделов.

Затем следующее сообщение msg2 из key 101 переходит к 4-му разделу (скажем, например), потому что hash(101)%no_of_partitions=4.

Теперь, в API потоков, всякий раз, когда сообщение используется его ключом, к ключу будет обращаться к разделу 4, потому что это раздел, который он получает, когда вычисляет hash(101)%no_of_partitions, и, следовательно, получает msg2 из ключ 101 in раздел 4 .

А как насчет msg1 из key 101 в раздела 1 ? Это потребляется вообще?

Ответы [ 2 ]

0 голосов
/ 02 ноября 2018

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

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

Также обратите внимание, что Kafka Streams предполагает, что входные данные разделены по ключам. Таким образом, если разделение изменяется, даже если приложение не разрывается, оно, скорее всего, вычислит неверный результат, поскольку добавление раздела нарушило предположение о разбиении.

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

0 голосов
/ 31 октября 2018

Будет использоваться msg1 из ключ 101 в разделе 1 .

В Kafka Streams вы не «потребляете сообщение по его ключу». Каждое сообщение в каждом разделе будет использовано. Если кто-то должен фильтровать ключ, он будет в коде приложения Kafka Stream.

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