В моем приложении структурированного потокового вещания я читаю сообщения от Кафки, фильтрую их и, наконец, сохраняю в Кассандре. Я использую спарк 2.4.1. Из структурированной потоковой документации
Семантика отказоустойчивости
Предоставление сквозной семантики "точно один раз" было одной из ключевых целей разработки структурированного потокового вещания. Чтобы достичь этого, мы разработали источники структурированной потоковой передачи, приемники и механизм выполнения для надежного отслеживания точного хода обработки, чтобы он мог обрабатывать любые виды сбоев путем перезапуска и / или повторной обработки. Предполагается, что каждый потоковый источник имеет смещения (аналогичные смещениям Кафки или порядковым номерам Kinesis) для отслеживания позиции чтения в потоке. Движок использует журналы контрольных точек и записи с опережением для записи диапазона смещения данных, обрабатываемых в каждом триггере. Потоковые приемники спроектированы так, чтобы быть идепотентными для обработки переработки. Совместно, используя воспроизводимые источники и идемпотентные приемники, структурированная потоковая передача может обеспечить сквозную семантику ровно один раз при любом сбое.
Но я не уверен, как Спарк на самом деле этого добивается. В моем случае, если кластер Cassandra не работает, что приводит к сбоям в операции записи, контрольная точка для Kafka не записывает эти смещения.
Основано ли смещение контрольной точки Kafka только на успешных чтениях из Kafka, или вся операция, включая запись, рассматривается для каждого сообщения?