Если поток настроен на запуск со смещением latest
, будет ли по-прежнему вычисляться (ре) состояние из всех предыдущих записей?
Если вы перезапускаете то же приложение (например, после того, как оно было остановлено ранее), тогда состояние не будет пересчитано путем повторной обработки исходных входных данных. Вместо этого состояние будет восстановлено из его «резервной копии» (каждое хранилище состояний или KTable постоянно хранится в топике Kafka c, так называемой «топологии изменений c» этой таблицы / хранилища состояний для таких целей) так что его данные в точности соответствуют тому, что было, когда приложение было остановлено. Такое поведение позволяет беспрепятственно останавливать и перезапускать ваши приложения, не пропуская записи, поступившие между «остановкой» и «перезапуском».
Но есть другое предостережение, о котором вам необходимо знать: конфигурация для установки начальная точка смещения (latest
или earliest
) используется только при первом запуске приложения Kafka Streams . После этого всякий раз, когда вы останавливаете + перезапускаете свое приложение, оно всегда будет продолжать работу с того места, где оно ранее было остановлено. Это связано с тем, что если приложение запускалось хотя бы один раз, оно сохраняло информацию о смещении потребителя в Kafka, что позволяет ему узнать, откуда автоматически возобновлять операции после перезапуска.
Если вам нужны другие всегда (пере), начиная, например, со смещений latest
(таким образом, потенциально пропуская записи, поступившие между ними, когда вы остановили приложение и перезапустили его), вы должны сбросить ваше приложение Kafka Streams . Одним из шагов, который выполняет инструмент сброса, является удаление информации о смещении потребителя приложения из Kafka, что заставляет приложение думать, что оно никогда не запускалось, так сказать.
Если ранее уже обработанные записи необходимо будет повторно обработан для восстановления состояния, будет ли это распространять записи через остальную топологию Streams (например, InputTopi c -> процессор с сохранением состояния -> OutputTopi c, это приведет к дублированию записей в OutputTopi c, потому что состояния восстановления)?
Эта повторная обработка не будет выполняться по умолчанию, как описано выше. Состояние будет автоматически восстановлено до его прежнего состояния (предназначенного для каламбура) в тот момент, когда приложение было остановлено.
Повторная обработка будет происходить только в том случае, если вы вручную сбросите свое приложение (см. Выше) и, например, сконфигурируете приложение для повторной обработки. читать исторические данные (например, установить auto.offset.reset
на earliest
после того, как вы сделали сброс).