Я нахожусь в процессе внедрения системы потоковой обработки с проверкой концепции, использующей Apache Flink 1.6.0, и храню список полученных событий, разделенных по ключам, в ListState
. (Не беспокойтесь о том, почему я это делаю, просто поработайте со мной здесь.) У меня установлен StateTtlConfig
на соответствующий ListStateDescriptor
. Согласно документации :
- "Все типы коллекций состояний поддерживают TTL для каждой записи. Это означает, что срок действия элементов списка и записей карты истекает независимо."
- "В настоящее время истекшие значения удаляются только тогда, когда они считываются явно, например, путем вызова
ValueState.value()
."
Вопрос 1
Что из следующего представляет собой чтение ListState
:
- Запрос итератора, но не его использование -
myListState.get();
.
- На самом деле с использованием итератора -
for (MyItem i : myListState.get()) { ... }
Вопрос 2
Что означает "TTL для каждой записи" на самом деле ? В частности, я спрашиваю о следующем:
Предположим, у меня есть конкретный экземпляр ListState<Character>
. Дескриптор имеет TTL 10 секунд. Я вставляю 'a'
. Через две секунды я вставляю 'b'
. Девять секунд спустя я вставляю 'c'
. Если я повторю это ListState
, какие элементы будут возвращены?
Другими словами:
ListState<Character> ls = getRuntimeContext().getListState(myDescriptor);
ls.add('a');
// ...two seconds later...
ls.add('b');
// ...nine seconds later...
ls.add('c');
// Does this iterate over 'a', 'b', 'c'
// or just 'b' and 'c'?
for (Character myChar : ls.get()) { ... }