Истекает ли срок действия данных в глобальной таблице?

#apache-kafka-streams

#apache-kafka-streams

Вопрос:

Я использую глобальную таблицу в качестве хранилища значений ключей. Данные в хранилище меняются редко, но они меняются.

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

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

Пример:

Неделя 1:

 a=1
b=2
c=3
d=4
 

Неделя 2:

 a=1
b=2
d=4
e=5
 

У меня включено сжатие по теме и период хранения в пару недель.

Что произойдет c с хранилищами глобальных таблиц всех приложений? Истечет ли он в конечном итоге, как только тема удалит данные из потока? Или он просто останется там до перезапуска приложения?

Ответ №1:

c останется на вычислительном узле, который запускает клиент Kafka Streams, пока

  1. на брокерах c удаляется из-за периода хранения (обратите внимание, что период хранения является нижней границей, и до фактического удаления может потребоваться больше времени, чем период хранения c )
  2. клиент Kafka Streams останавливается,
  3. локальное состояние уничтожается, и
  4. новый клиент Kafka Streams перезапускается на том же вычислительном узле.

Затем шаг 4 восстановит локальное состояние из темы, поскольку оно не найдет ни одного локального и больше не будет считываться c . Хранилища ключей-значений в потоках Kafka не имеют какого-либо периода хранения, а очистка разделов в брокерах не вызывает никаких действий на клиенте Kafka Streams.

Если вы явно не удаляете c из темы, отправив запись tombstone c=null в тему, c она не будет явно удалена в глобальной таблице.