Definición
El $sessionWindow La etapa especifica una ventana de sesión para la agregación de datos. Las ventanas de sesión permiten ejecutar un pipeline en cada "sesión" de actividad en un flujo de entrada. Dos documentos están en la misma sesión si tienen la misma partición y la diferencia entre sus marcas de tiempo es menor que la diferencia entre sesiones. Al cerrar una ventana, sus resultados se envían a la siguiente etapa.
Una ventana de sesión se cierra cuando la watermark avanza una duración igual al valor gap más el valor allowedLateness más allá de la marca de tiempo máxima del documento en la sesión. El tiempo de inicio de una ventana de sesión cerrada es el timestamp del primer evento en la sesión, y el tiempo de finalización es el timestamp del último evento en la sesión, más el intervalo. El tiempo de finalización de la ventana de sesión suma el intervalo al timestamp máximo de la sesión. Los resultados de la ventana son la salida de $sessionWindow.pipeline en los documentos que encajan en la ventana.
$sessionWindowUna etapa de pipeline
$sessionWindowtiene la siguiente forma de prototipo:{ $sessionWindow: { partitionBy: "$userId", gap: {unit: "minute", size: 5}, pipeline: [{$match: {ad: true}}, {$group: { _id: null, total: {$sum: "$value"}}}], boundary: "eventTime", allowedLateness: {unit: "second", size: 5} } }
Sintaxis
La etapa $sessionWindow procesa un documento con los siguientes campos:
Campo | Tipo | Necesidad | Descripción |
|---|---|---|---|
| expresión | Requerido | Campos para particionar el
|
| Documento | Requerido | Documento que define la cantidad de tiempo como una combinación de un
Por ejemplo, con un |
| string | Opcional | Cadena que especifica si los límites de la ventana se determinan por el tiempo del evento o el tiempo de procesamiento. El valor puede ser No puedes configurar el campo |
| arreglo | Requerido | Canal de agregación anidada evaluado contra los mensajes dentro de la ventana. |
| duración | Opcional | Documento que especifica la cantidad de tiempo como una combinación de
Por ejemplo, un Si se omite, el valor predeterminado es 3 segundos. |
Comportamiento
A cada documento de entrada que llega a la etapa $sessionWindow se le asigna una partición de la expresión partitionBy. Cada documento se asigna a una ventana de sesión según su partición y marca de tiempo. Esta puede ser una ventana de sesión nueva o existente. Al cerrar una ventana, sus resultados se envían a la siguiente etapa. Los resultados de la ventana son la salida del pipeline de los documentos que contiene.
Una ventana de sesión se cierra cuando el watermark avanza la brecha y los valores de allowedLateness superan la marca de tiempo máxima de un documento en la sesión. La hora de inicio de una ventana de sesión cerrada es la marca de tiempo del primer evento en la sesión. La hora de finalización de una ventana de sesión cerrada es la marca de tiempo del último evento en la sesión, más la brecha. La hora de finalización de la ventana de sesión suma la brecha a la marca de tiempo máxima en la sesión.
Nota
Supongamos que existe una ventana de sesión para la partición A, con una marca de tiempo máxima de 2024-01-01 00:40:00. Con un intervalo de 1 hora, si no llegan documentos posteriores para la partición A, la ventana de sesión se cierra cuando la marca de agua llega a 2024-01-01 01:40:00.
Si la expresión partitionBy falla en un documento de entrada, este se envía a la cola de espera (DLQ). Al procesar datos desordenados, un documento puede llegar con una marca de tiempo dentro del intervalo entre las ventanas de sesión existentes de la misma partición. Esto fusionará las ventanas de sesión.
Si un documento llega a la etapa $sessionWindow con una marca de tiempo menor que el valor de la marca de agua más reciente del origen y no hay ninguna sesión abierta para ese documento, se envía a la cola de entrega de archivos (DLQ). Cuando un documento llega a la etapa $sessionWindow, se configuran sus campos de metadatos de flujo window.partition, window.start y window.end.
Los eventos pueden llegar desordenados. Es posible que lleguen dos eventos con el mismo valor partitionBy y que sus marcas de tiempo estén separadas por una diferencia mayor que la indicada. Inicialmente, estos eventos se ubicarán en ventanas de sesión separadas. Posteriormente, podría llegar otro evento que fusione las dos ventanas de sesión.