Является ли потоковая обработка атомарной / транзакционной при использовании хотя бы раз доставки в Kafka Streams? - PullRequest
0 голосов
/ 24 июня 2019

Давайте предположим простой случай, подобный следующему:

ORDER_TOPIC ----> KSTREAM ----> VALIDATED_ORDER_TOPIC
                     |
          ROCKSDB LOCAL STATE STORE

KStream дедуплицирует сообщения из ORDER_TOPIC, используя операцию преобразования с преобразователем, который сохраняет сообщения в постоянном локальном хранилище состояний по их ключу / идентификатору.Таким образом, если один и тот же заказ поступит дважды, он будет проигнорирован.

Теперь поступает новый заказ, он не дублируется, поэтому сохраняется в локальном хранилище, но перед отправкой в ​​VALIDATED_ORDER_TOPIC происходит сбой приложения.

Мне интересно, что за транзакционные гарантии находятся внутри KStream: была ли запись сохранена и передана в локальное хранилище состояний или откат?

Не могли бы вы указать на некоторую документацию, касающуюся транзакционных гарантий для Kafka Streams снаименьшая семантика?

1 Ответ

1 голос
/ 25 июня 2019

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

Если вы хотите удалить дубликаты, вам нужно включить processing.guarantees=exactly_once. В этом случае в случае сбоя хранилище будет «откатано» до согласованного состояния. Т.е. после сбоя он будет содержать идентификатор только в том случае, если запись в тему вывода была успешной.

...