#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, пока
- на брокерах
c
удаляется из-за периода хранения (обратите внимание, что период хранения является нижней границей, и до фактического удаления может потребоваться больше времени, чем период храненияc
) - клиент Kafka Streams останавливается,
- локальное состояние уничтожается, и
- новый клиент Kafka Streams перезапускается на том же вычислительном узле.
Затем шаг 4 восстановит локальное состояние из темы, поскольку оно не найдет ни одного локального и больше не будет считываться c
. Хранилища ключей-значений в потоках Kafka не имеют какого-либо периода хранения, а очистка разделов в брокерах не вызывает никаких действий на клиенте Kafka Streams.
Если вы явно не удаляете c
из темы, отправив запись tombstone c=null
в тему, c
она не будет явно удалена в глобальной таблице.