Написанный вами код уже масштабируется; Управляемое ключевое состояние Flink может масштабироваться по дизайну. Состояние с ключом масштабируется путем изменения баланса назначения ключей экземплярам. (Вы можете думать о ключевом состоянии как о сегментированном хранилище ключей / значений. Технически происходит то, что согласованное хеширование используется для сопоставления ключей с группами ключей , и каждый параллельный экземпляр отвечает за некоторые из ключевых групп. Изменение масштаба просто включает в себя перераспределение ключевых групп между экземплярами.)
Интерфейс ListCheckpointed
предназначен для состояния, используемого в неключевом контексте, поэтому он не подходит для того, что вы делаете. Также обратите внимание, что ListCheckpointed
будет устаревшим в Flink 1.11 в пользу более общего CheckpointedFunction
.
Еще одна вещь: если MyKeyExtractor
вводится с помощью value.getEventId()
, вы можете использовать ValueState<Boolean>
для вашего кеша, а не MapState<String, Boolean>
. Это работает, потому что с ключевым состоянием существует отдельное значение ValueState для каждого ключа. Вам нужно использовать MapState только тогда, когда вам нужно сохранить несколько пар атрибут / значение для каждого ключа в вашем потоке.
Большая часть этого обсуждается в документации Flink в разделе Практическое обучение , который включает пример , который очень близок к тому, что вы делаете.