Время windows Flink выровнено по эпохе (например, если у вас есть набор почасовых windows, все они будут срабатывать по часу). Поэтому, если вы намерены использовать в своей работе несколько разных windows, вам следует настроить их так, чтобы они имели отдельные смещения, чтобы они не запускались одновременно. Это позволит распределить нагрузку. Это будет выглядеть примерно так:
.window(TumblingProcessingTimeWindows.of(Time.minutes(1), Time.seconds(15))
(или используйте TumblingEventTimeWindows
в зависимости от обстоятельств). Это создаст минутную windows, которая будет запускаться через 15 секунд после каждой минуты.
Если позволяет ваш вариант использования, вы должны использовать инкрементную агрегацию (через reduce
или aggregate
), а не использовать WindowFunction
(или ProcessWindowFunction
), который должен собрать все события, назначенные каждому окну в списке, прежде чем обрабатывать их как своего рода мини-пакет.
Временное окно с ключом будет сохранять свое состояние в RocksDB, если вы настроили RocksDB в качестве бэкэнда состояния. Вам не нужно переключаться на использование RichFlatMap
, чтобы получить доступ к RocksDB. (Более того, поскольку flatMap не может использовать таймеры, я предполагаю, что вы действительно в конечном итоге используете вместо этого функцию процесса.)
Пока любой из параллельных экземпляров оконного оператора занят выполнением своей оконной функции (один из ApplySomethings
) вы правы, полагая, что эта задача не будет делать ничего другого - и, таким образом, она (если не завершится очень быстро) создаст временное противодавление. При необходимости вы захотите увеличить параллелизм, чтобы задание могло удовлетворить ваши требования к пропускной способности и задержке.