Рассматривая потоковое приложение Apache Flink с конвейером, подобным этому:
Kafka-Source -> flatMap 1 -> flatMap 2 -> flatMap 3 -> Kafka-Sink
, где каждая функция flatMap
является оператором без сохранения состояния (например, обычная функция .flatMap
для Datastream
).
Как работают контрольные точки / точки сохранения, если входящее сообщение будет ожидаться на flatMap 3
?Будет ли сообщение повторно обработано после перезапуска, начиная с flatMap 1
, или оно перейдет к flatMap 3
?
Я немного сбит с толку, потому что документация , по-видимому, ссылается на состояние приложения какЯ могу использовать операторы с состоянием, но в моем приложении нет операторов с состоянием.Сохраняется и восстанавливается ли «ход обработки» на всех , или же после сбоя / перезапуска весь конвейер будет повторно обрабатываться?
И в этом разница между сбоями (->flink восстанавливает с контрольной точки) и ручной перезапуск с использованием точек сохранения относительно моих предыдущих вопросов?
Я пытался выяснить сам (с включенной контрольной точкой, используя EXACTLY_ONCE
и rockdb-backend), поместив Thread.sleep()
в flatMap 3
изатем отмена задания с точкой сохранения.Однако это привело к зависанию инструмента командной строки flink
до тех пор, пока не закончился sleep
, и даже тогда flatMap 3
было выполнено и даже отправлено в приемник до задание полученоотменен.Поэтому кажется, что я не могу вручную заставить эту ситуацию анализировать поведение flink.
В случае, если «ход обработки» не сохраняется / не покрывается контрольными точками / точками сохранения, как я описал выше, как я могу убедиться в каждом сообщениидоходит до моего конвейера, что любой данный оператор (flatmap 1/2/3) никогда не обрабатывается повторно в ситуации перезапуска / сбоя?