Перейти к содержанию

Event time, processing time и watermarks

Глубокие темы · Раздел03

Тип материала: архитектурный разбор. Схемы и примеры иллюстративные, если не указано иное.

Версии в источниках: Kafka/Connect/Streams 4.1, Debezium 3.3, Flink 1.20.3, Spark 4.0.1 и Airflow 3.1 либо явно названная система. Непроверенные вопросы и ограничения runtime — в журнале (архив рабочего проекта).

Механизм

Event time задаётся событием/бизнес-контрактом, processing time — часами runtime. Ingestion time — ещё один timestamp, не синоним обоих. Watermark — оценка event-time progress по policy, не доказательство отсутствия более ранних событий.

flowchart TB
  Event[Event timestamp] --> Validate[Clock and schema checks]
  Validate --> Progress[Per-input progress]
  Progress --> Watermark[Combined watermark and idleness]
  Watermark --> Timer[Event-time timer]
  Late[Late event] --> Policy[Correct quarantine or drop with evidence]

Пошаговое объяснение

Timestamp extraction → per-input progress → watermark combination → event-time timers/window emission. Минимум активных inputs защищает от слишком раннего закрытия при медленном input; idle partition может остановить progress. Idleness исключает простаивающий input, поэтому возобновившиеся старые события могут стать late.

Failure scenarios и recovery

Clock skew/future timestamp способен преждевременно продвинуть watermark и изменить late-data outcome. Validating timestamp bounds и quarantine нужны до state update. Spark4 multiple-watermark policy и Flink1.20 watermark propagation не приравниваются; processing-time window после replay сформируется иначе.

Trade-offs и эксплуатация

Меньший out-of-orderness buffer уменьшает ожидание, увеличивая долю late corrections; больший увеличивает state/retention. Нельзя определить policy только по красивой latency без distribution задержек и требований полноты.

Практический пример

Flink HOP example и Spark stream используют event_time. Bounded sample не доказывает поведение idle live Kafka inputs.

Типичные ошибки проектирования

Смешивать source/state/sink boundaries, скрывать failed records и неопределённый исход timeout; применять retry без identity/version и retention contract. Конкретные ограничения разобраны выше.

Вопросы на собеседовании

Watermark10:05 означает, что event10:04 не придёт? Нет, это выбранный progress contract.

Processing time воспроизводим при replay? Обычно нет, время повторного исполнения другое.

Практические упражнения

Для двух inputs с разным lag задайте watermark/idleness и разберите возобновление источника с поздним событием.

Дополнительные источники