Преобразовывая ваши временные метки в человеческое время, мы видим, что они в это время (UTC):
2: Friday, May 11, 2018 4:37:30.167 PM
1: Friday, May 11, 2018 4:37:29.167 PM
3: Friday, May 11, 2018 4:37:31.167 PM
Теперь давайте рассмотрим этот случай:
.timeWindowAll(Time.seconds(10)) --> 2, 3
Временные окна выровнены почасы, а не события.В этом случае есть одно десятисекундное окно с 4:37:20 до 4:37:30, а другое с 4:37:30 до 4:37:40.Вот почему событие # 1 отброшено.Событие № 2, которое было обработано первым, установило водяной знак 4: 37: 30.167, и без допустимого опоздания событию № 1 некуда идти.Назначитель окна просто отбрасывает его.
С другой стороны, в этом случае
.timeWindowAll(Time.seconds(4)) --> 2, 1, 3
с окнами длиной 4 секунды все три события попадают в окно, которое начинается в 4:37:28.Событие # 1 все еще запаздывает, но окно, к которому оно относится, еще не очищено (и не будет, пока водяной знак не достигнет 4:37:32), поэтому событие # 1 включено в окно.
Для чего бы то ни было, типичная стратегия при работе с неупорядоченными событиями состоит в том, чтобы отрегулировать водяные знаки, чтобы, по крайней мере, учесть любое количество неупорядоченности, ожидаемое для вашего приложения (а не вообще никакого, как вы сделали здесь).).А оконный API Flink также поддерживает поздние события (то есть события настолько поздние, что задержка водяного знака была недостаточной).
Документы: Время события и водяные знаки , Поздность .