Sliding Window
Comment obtenir une vue rafraîchie en permanence d'une métrique sur une fenêtre temporelle récente, sans attendre la fermeture d'un bucket complet.
Problème
Tumbling Window répond à « combien sur cette heure ? » avec une émission unique en fin d'heure. Mais pour des cas opérationnels (« quel est le taux d'erreur sur les 5 dernières minutes ? », « quelle est la latence moyenne d'AS4 sur les 60 dernières secondes ? »), il faut une réponse rafraîchie en continu, pas attendre 5 minutes pour avoir le prochain point. Cela demande une fenêtre dont la fin avance toujours mais qui couvre toujours la même durée — une fenêtre glissante.
Forces
- Coût de stockage : chaque évènement appartient à (taille/pas) fenêtres simultanément ; multiplication du state proportionnelle.
- Coût d'émission : une émission par pas (toutes les 10 secondes, par exemple) au lieu d'une par taille.
- Granularité visuelle : plus le pas est petit, plus la courbe est lissée, mais plus le coût explose.
- Late data : même problématique que tumbling, mais aggravée par la multiplication des fenêtres ouvertes.
- Approximation : pour des fenêtres très grandes, on utilise souvent des sketchs (HyperLogLog, Count-Min) au lieu d'un état exact.
Solution
Définir une taille W (durée couverte par la fenêtre) et un pas S (intervalle entre deux émissions). À l'instant t, la fenêtre active couvre [t-W, t]. Si S < W (cas standard), chaque évènement appartient à W/S fenêtres. À chaque pas S, on émet l'agrégat des évènements dans la fenêtre courante. Implémentation Flink : stream.window(SlidingEventTimeWindows.of(Time.minutes(5), Time.seconds(30))) calcule une fenêtre de 5 minutes émise toutes les 30 secondes. Pour des très grandes fenêtres (heure, jour) sur des flux à très haut débit, préférer un sketch incrémental (HyperLogLog pour le distinct count, t-digest pour les percentiles) qui maintient un état borné.
Structure
Time: T-W ─────────────── T ─── T+S ─── T+2S ───►
◄─── Window 1 ──►
◄─── Window 2 ──► (slid by S)
◄─── Window 3 ──►
Event arriving at time t belongs to all windows W_i such that
W_i.start ≤ t < W_i.end
Configuration "size 5min, slide 30s":
Event at 10:00:15 belongs to windows ending at:
10:00:30, 10:01:00, 10:01:30, ..., 10:05:00
→ 10 windows simultaneously
Emission cadence:
Every 30 seconds, system emits aggregate over last 5 minutes. Implémentation EDI
Trois cas EDI canoniques. (1) SLA temps réel : taux de succès AS4 sur les 5 dernières minutes émis toutes les 30 secondes — alimente un dashboard SRE, déclenche une alerte si < 99,5 %. (2) Détection d'anomalie volume : si le nombre de factures émises sur les 10 dernières minutes dépasse de 3σ la moyenne historique pour cette tranche horaire, alerter (peut signaler un partenaire en panne qui rejoue tout son backlog). (3) Trending operationnel : top-5 codes erreur SBDH les plus fréquents sur les 15 dernières minutes — émis chaque minute pour identifier vite une dégradation. Implémentation Spark : df.groupBy(window(col("eventTime"), "5 minutes", "30 seconds"), col("partner")).count(). Penser à l'allowed lateness et au state TTL ; sans cela, la consommation mémoire explose en quelques heures.
Anti-patterns
- Pas trop fin (1 seconde sur fenêtre de 1h) — 3 600 fenêtres simultanées par clé, état ingérable.
- Sliding sur des données à très haute cardinalité (par message ID) — explose immédiatement le state.
- Pas de TTL state — RocksDB grossit sans limite jusqu'à OOM.
- Émission à chaque évènement au lieu de chaque pas — l'opérateur produit trop d'évènements aval.
- Confondre sliding et hopping window — la terminologie Beam et Flink diverge légèrement, lire la doc.
Patterns liés
- Tumbling Window — l'alternative non-chevauchante.
- Session Window — fenêtre activity-based.
- Watermarks — close les fenêtres glissantes.
- Circuit Breaker — souvent piloté par une métrique sliding window.
Sources
- Akidau T. et al. — The Dataflow Model, VLDB 2015. research.google
- Apache Flink — Windows : Sliding Windows. nightlies.apache.org/flink
- Spark Structured Streaming — Window Operations. spark.apache.org
- Akidau T., Chernyak S., Lax R. — Streaming Systems, O'Reilly 2018, chap. 4.
- Apache Beam Programming Guide — Sliding time windows. beam.apache.org