Очевидная проблема этого варианта использования - большой размер окна соединения в один год и высокая скорость приема, что может привести к огромному размеру состояния.
Основной вопрос здесьявляется ли это объединением 1: 1, т. е. объединяется ли запись из потока A точно (или не более) один раз с записью из потока B. Это важно, потому что, если у вас есть соединение 1: 1, вы можете удалитьзапись из штата, как только она была присоединена к другой записи, и вам не нужно хранить ее в течение всего года. Следовательно, в вашем штате хранятся только записи, которые еще не были объединены. Предполагая, что большинство записей быстро объединяются, ваше состояние может оставаться достаточно маленьким.
Если у вас есть соединение 1: 1, объединение временного окна Flink Table API (и SQL) и интервальное соединениеAPI DataStream не , что вы хотите. Они реализованы как объединения m: n, потому что каждая запись может объединяться с более чем одной записью другого ввода. Следовательно, они хранят все записей за полный интервал окна, т. Е. В течение одного года в вашем случае использования. Если у вас есть соединение 1: 1, вы должны реализовать это соединение как KeyedCoProcessFunction
.
Если каждая запись может объединяться несколько раз в течение одного года, буферизация этих записей невозможна. В этом случае вы можете использовать временные объединения API таблиц Флинка (и SQL) и интервальные объединения API DataStream.