Java. Менторинг за чашкой кода
Сегодня решил отойти от последовательного разбора Java и Spring, правда вечером планирую опубликовать пост по DevOps с перечнем основных инструментов, которые нужно знать Java разработчику.
А сейчас хотел поделиться разышлениями, я дописываю 4-ю главу своей книги про Apache Flink и AI.
В ней уже не столько про сам Flink, сколько про то, что с ним можно делать дальше: состояние, Feature Engineering, построение признаков для ML и вся эта история с данными в реальном времени.
Доведу главу до нормального состояния — и уже хочу отправлять материал в издательство.
Посмотрим, получится ли из этой затеи настоящая книга.
А пока продолжаю разбираться с Flink уже не только в коде, но и в тексте.
Событие произошло 10 минут назад. Flink только что его получил. Что теперь?
Представим систему мониторинга транспорта.
В 12:00:05 автомобиль проехал камеру:
vehicle=421
speed=103
timestamp=12:00:05
Но сеть подвисла и Flink получил это событие только в:
12:10:07
Первое желание:
Ну всё, событие старое. Выкидываем.
И вот здесь можно очень сильно ошибиться, так как для Flink есть как минимум два разных времени:
Event Time = когда событие произошло
Processing Time = когда Flink его обработал
В нашем случае:
Event Time = 12:00:05
Processing Time = 12:10:07
Если считать всё по Processing Time, автомобиль внезапно «проехал камеру» в 12:10. Хотя на самом деле он был там десять минут назад, а теперь представим, что мы считаем признак:
- количество превышений скорости за последние 30 секунд
Одно неправильное решение о времени — и ML-модель получает совершенно другой Feature Vector. Поэтому во Flink есть механизм Watermark.
Упрощённо его можно представить как сигнал:
«Я считаю, что события раньше этого времени уже в основном пришли».
Например: Watermark = 12:00:30
И тут внезапно приходит: Event Time = 12:00:05
Событие опоздало, но это ещё не означает, что его нужно выбросить.
Flink может обработать его как late event — в зависимости от того, как мы спроектировали pipeline.
И вот здесь потоковая обработка становится действительно интересной, так как мы уже не просто читаем сообщения из Kafka, а пытаемся восстановить смысл происходящего во времени, несмотря на задержки сети, разные скорости источников и неидеальный порядок событий.