Springende Fenster

Ein springendes Fenster definiert eine Teilmenge von Ereignissen, die in einem bestimmten Zeitraum stattfinden und die für die Sie eine satzbasierte Berechnung, z. B. eine Aggregation, ausführen können. Springende Fenster unterscheiden sich von Anzahl- und Momentaufnahmefenstern, da Sie die Zeitachse, unabhängig von den Start- oder Endzeiten des Ereignisses, in regelmäßige Zeitabstände teilen. StreamInsight unterstützt überlappende springende Fenster sowie Lücken zwischen aufeinander folgenden Fenstern. 

Eine allgemeine Beschreibung der Ereignisfenster sowie ihrer Implementierung und Verwendung in StreamInsight finden Sie unter Verwenden von Ereignisfenstern.

Grundlegendes zu springenden Fenstern

Springende Fenster sind Fenster, die im Zeitverlauf um einen festen Zeitraum vorwärts springen. Das Fenster wird durch zwei Zeitspannen definiert: die Sprunggröße H und die Fenstergröße S. Für jede H-Zeiteinheit wird ein neues Fenster der Größe S erstellt.

Die folgende Abbildung zeigt einen Datenstrom mit einer Serie von Punktereignissen. Die senkrechten Striche stellen ein springendes Fenster dar, das die Zeitachse unterteilt. Hier ist H gleich S. Dies stellt ein lückenloses, nicht überlappendes springendes Fenster dar, das auch als rollierendes Fenster bezeichnet wird. Der Einfachheit halber gibt es für diese Fensterart eine separate Erweiterungsmethode. Jedes orangefarbene Feld stellt den Datenstrom von Fenstern und die Ereignisse dar, die diesem Fenster zugeordnet sind.

Rollierende Fenster

Für jedes dieser Fenster wird der setbasierte Vorgang ausgeführt und ein Ergebnis mit Timestamps erzeugt, die von der für das Fenster angegebenen Ausgaberichtlinie abhängig sind. Die Ausgaberichtlinie PointAlignToWindowEnd erzeugt z. B. folgendes Ergebnis:

Rollierende Fenster mit PointAlignToWindowEnd

Wenn sich ein Ereignis über eine Fenstergrenze erstreckt, ist es in mehreren Fenstern enthalten. Die nächste Abbildung zeigt einen Datenstrom, bei dem dies der Fall ist und der drei Intervallereignisse enthält: e1, e2 und e3. Wenn die Sprunggröße H kleiner als die Fenstergröße S ist, überschneiden sich die Fenster, sodass Ereignisse innerhalb des sich überschneidenden Zeitraums in mehreren Fenstern enthalten sind, auch wenn es sich um Punktereignisse handelt, die sich nicht über mehrere Fenster erstrecken.

Abbildung eines springenden Fensters

Beachten Sie, dass in dieser Abbildung die Ereignisse in den Fenstern angezeigt werden, die aufgrund der Eingaberichtlinie für das Fenster bereits verkürzt wurden. Die Eingaberichtlinie sieht für alle StreamInsight-Fenster vor, dass die Ereignisse auf die Fenstergröße zugeschnitten werden. Zeitempfindliche Aggregate oder Operatoren verwenden statt der ursprünglichen Ereignislebensdauern diese zugeschnittenen Lebensdauern in den Fenstern, d. h., sie können nicht über das Fenster "hinausschauen".

Optional kann ein Ausrichtungsparameter angegeben werden. Die Standardausrichtung für ein 24-stündiges rollierendes Fenster ist z. B.: Anfang und Ende jedes Fensters um Mitternacht. Wird eine benutzerdefinierte Ausrichtung (z. B. ein 24-Stunden-Fenster von 9:00 Uhr zu 9:00 Uhr) angegeben, wird das Fenster entsprechend diesem absoluten Punkt auf der Zeitachse ausgerichtet (in diesem Fall ein beliebiger datetime-Wert mit 9:00 Uhr als Zeitanteil). Der Ausrichtungsparameter muss als DateTime-Objekt des Typs DateTimeKind.Utc bereitgestellt werden.

Bei Verwendung von springenden Fenstern führt der angewendete satzbasierte Vorgang unabhängig davon zu einem Ergebnis, ob sich die Eingabe gegenüber dem vorherigen Fenster geändert hat. Das liegt daran, dass springende Fenster die Zeitachse entlang fester Intervalle teilen. In der folgenden Abbildung wird ein springendes Fensters gezeigt, das viel länger ist als seine Sprunggröße. Dies ist typisch für Szenarien wie "alle 10 Sekunden den Durchschnitt aller innerhalb von fünf Minuten stattgefundener Ereignisse berechnen".

Springendes Fenster mit überlappenden Ereignissen

Die folgende Abbildung zeigt das Ergebnis einer solchen Aggregation auf dem Datenstrom im Fenster, wenn als Ausgaberichtlinie PointAlignToWindowEnd angegeben ist.

Aggregationen mit PointAlignToWindowEnd

In einer nicht zeitempfindlichen Aggregation wie Sum, Avg, Count usw. haben alle Aggregationsergebnisse in diesem Diagramm den gleichen Wert, da immer derselbe Satz von Nutzlasten, e1 und e2, zu den zugrunde liegenden Fenstern beiträgt. Dieses Verhalten sich wiederholender Ergebnisse muss berücksichtigt werden, besonders wenn ein solches Fenster in einem Group-and-Apply-Vorgang mit einer großen Zahl an Gruppen angewendet wird. Wenn die Fensterfrequenz höher ist als die ursprüngliche Ereignisfrequenz (siehe beispielsweise das vorherige Diagramm), kommt es zu einer erheblichen Rate der Ausgabeereignisse. Wenn ein Aggregationsergebnis nur dann erzeugt werden soll, wenn sich die Eingabe ändert, sollte stattdessen ein Momentaufnahmefenster verwendet werden.

Ausgaberichtlinien

PointAlignToWindowEnd

Diese Ausgaberichtlinie erzeugt ein Punktereignis, dessen Startzeit der Endzeit des Fensters entspricht, wie im vorherigen Diagramm gezeigt. Diese neue Ausgaberichtlinie ist hilfreich, wenn Sie das Ergebnis mit einem anderen Datenstrom kombinieren, da zu jedem gegebenen Zeitpunkt nur ein einziges gültiges Ergebnis existiert, das das neueste Aggregationsergebnis zu diesem Zeitpunkt darstellt. Ein springendes Fenster mit dieser Ausgaberichtlinie kann mit dem Entwurfsmuster Punkt-zu-Signal kombiniert werden, um einen kontinuierlichen Datenstrom mit Aggregationsergebnissen zu erstellen, der zu jedem Zeitpunkt ein Intervallereignis mit dem letzten bekannten Ergebnis enthält.

PointAlignToWindowEnd ist die Standardausgaberichtlinie für ein springendes Fenster, wenn die Ausgaberichtlinie nicht angegeben ist.

ClipToWindowEnd

Diese Ausgaberichtlinie erzeugt eine Fenstergröße, die der Lebensdauer des setbasierten Vorgangs entspricht, wie im folgenden Diagramm gezeigt. Beachten Sie, dass dies Auswirkungen auf die Aktualität der Abfrage hat.

ClipToWindowEnd-Ausgaberichtlinie für springende FensterNeue Ausgaberichtlinie für springende Fenster

CTI-Verhalten

Beachten Sie, dass springende Fenster Auswirkungen auf Current Time Increment-(CTI-)Ereignisse haben können. Wenn als Ausgaberichtlinie ClipToWindowEnd angegeben ist, wird jedes CTI-Ereignis an den Anfang des jeweiligen Fensters verschoben. Diese Verschiebung findet statt, da die Fenstergröße als das Ergebnis des Vorgangs auf dem Fenster zugewiesen wird. Solange also die Ereignisse innerhalb des Fensters empfangen werden, unterliegt der ganze Zeitraum des Fensters Änderungen. Wenn als Ausgaberichtlinie jedoch NEW_POLICY angegeben ist, werden die CTI-Ereignisse ohne Änderung übergeben. Weitere Informationen zu CTI-Ereignissen finden Sie unter Vorlauf der Anwendungszeit.

Definieren von springenden Fenstern

Ein springendes Fenster wird durch seine Fenstergröße und Sprunggröße definiert, wie im folgenden Beispiel gezeigt.

var hoppingAgg = from w in inputStream.HoppingWindow(TimeSpan.FromHours(1),
                                                     TimeSpan.FromMinutes(10))
                 select new { sum = w.Sum(e => e.i) };

Das Richtlinienargument für das springende Fenster im obigen Beispiel ist eine statische Eigenschaft, die eine Instanz der entsprechenden Richtlinienklasse zurückgibt.

Wenn Sprunggröße und Fenstergröße gleich sind, kann eine vereinfachte Version, als rollierendes Fenster bezeichnet, verwendet werden, wie im folgenden Beispiel gezeigt.

var tumblingAgg = from w in inputStream.TumblingWindow(TimeSpan.FromHours(1))
                  select new { sum = w.Sum(e => e.i) };

Die Ausrichtung des springenden (oder rollierenden) Fensters ist ein optionaler Parameter. Im folgenden Beispiel beginnt und endet jedes Fenster um 09:00 Uhr koordinierter Weltzeit (UTC).

var alignment = new DateTime(TimeSpan.FromHours(9).Ticks, DateTimeKind.Utc);
var snapshotAgg = from w in inputStream.TumblingWindow(
                         TimeSpan.FromHours(24),
                         alignment,
                         HoppingWindowOutputPolicy.ClipToWindowEnd)
                  select new { sum = w.Sum(e => e.i) };

Siehe auch

Konzepte

Aggregationen

TopK

Benutzerdefinierte Aggregate und Operatoren

Anzahlfenster

Momentaufnahmefenster

Verwenden von Ereignisfenstern