Можем ли мы потерять сообщения в kafka streams, если добавим новые разделы?

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

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

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

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

1
0
445
2

Ответы 2

msg1 из ключ 101 в раздел 1 будет израсходован.

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

Это означает, что он будет запрашивать все разделы для определенного ключа, а не слепо, используя логику разделения?

JavaTechnical 31.10.2018 14:29

Логика разбиения @Java применяется только к производителю. Координатору группы потребителей потребуется повторно сбалансировать приложение Streams при добавлении новых разделов, но это не означает, что сообщения не будут потребляться из каких-либо новых разделов после назначения экземпляру-потребителю.

OneCricketeer 31.10.2018 14:39

@ cricket_007 тогда как насчет порядка сообщений?

JavaTechnical 31.10.2018 14:45

@Java, они потребляются в том порядке, в котором они были произведены ... Я уже ответил на ваши предыдущие вопросы по этому поводу. Кроме того, если бы у вас было 5 разделов и 5 приложений с отдельными потоками, ни одно приложение не могло бы видеть данные, которые есть у других. Если у вас 4 или меньше экземпляров, 2 раздела случайным образом назначаются одному экземпляру ... Я хочу сказать, что вы не должны полагаться на то, какие данные читаются каким экземпляром или потоком, и предполагать, что вы можете выполнять немедленные аналитические типы работать над ним без группировки или исправления после цикла опроса потребителей

OneCricketeer 31.10.2018 14:59

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

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

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

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

Другие вопросы по теме