Share via


Janelas de salto

Uma janela de salto define um subconjunto de eventos que se enquadram em determinado período de tempo e no qual é possível realizar uma computação baseada em conjunto, como uma agregação. As janelas de salto são diferentes das janelas de contagem e de instantâneo porque dividem a linha de tempo em intervalos regulares, independentemente das horas de início ou de término do evento. O StreamInsight permite a sobreposição de janelas de salto, bem como deixa intervalos entre janelas consecutivas. 

Para obter uma descrição geral de janelas de evento, bem como de sua implementação e uso no StreamInsight, consulte Usando janelas de eventos.

Noções básicas sobre janelas de salto

As janelas de salto são janelas que "saltam" adiante no tempo por um período fixo. A janela é definida por dois intervalos de tempo: o tamanho do salto H e o tamanho da janela S. Para cada unidade de tempo H, uma nova janela de tamanho S é criada.

A ilustração a seguir mostra um fluxo com uma série de eventos pontuais. As barras verticais mostram uma janela de salto que segmenta a linha do tempo. Aqui, H é igual a S. Isso representa uma janela de salto sem intervalo e sem sobreposição, que também é conhecida como janela de tombamento. Por uma questão de praticidade, existe um método de extensão à parte para esse tipo de janela. Cada caixa laranja representa o fluxo de janelas e os eventos associados a ela.

Janelas em cascata

Para cada janela desse tipo, a operação baseada em conjunto é realizada e um resultado é produzido, com carimbos de data/hora que dependem da política de saída especificada com a janela. Para a política de saída PointAlignToWindowEnd, o resultado será semelhante a este:

Janelas em cascata com PointAlignToWindowEnd

Se um evento ultrapassar o limite de uma janela, ele será contido em várias janelas. A próxima ilustração mostra um fluxo contendo três eventos de intervalo: e1, e2 e e3. Se o salto tamanho H for menor que a janela tamanho S, ocorrerá a sobreposição de janelas, de tal forma que eventos dentro do período de sobreposição se enquadrarão em mais de uma janela, mesmo que eles sejam eventos pontuais que não incluam várias janelas.

Ilustração de janela de salto

Observe que esta ilustração mostra os eventos nas janelas já recortadas pela política de entrada de janela. A política de entrada, como acontece com todas as janelas do StreamInsight, é recortar os eventos no tamanho da janela. Um operador ou uma agregação com detecção de hora usará esses tempos de vida de evento recortados nas janelas, em vez dos originais, ou seja, ele(a) não “verá alem da” janela.

Um parâmetro de alinhamento também pode ser especificado. Por exemplo, o alinhamento padrão para uma janela em cascata de 24 horas é iniciar e terminar cada janela à meia-noite. Se um alinhamento personalizado for especificado (por exemplo, uma janela de 24 horas das 9h00 às 9h00), a janela será alinhada de acordo com esse ponto absoluto na linha do tempo (neste caso, qualquer valor datetime que tenha 9h00 como sua parte de hora). O parâmetro de alinhamento deve ser fornecido como um objeto DateTime do tipo DateTimeKind.Utc.

É importante compreender que, usando janelas de salto, a operação baseada em conjunto aplicada produz um resultado independentemente da alteração da entrada com relação à janela anterior. Isso porque as janelas de salto dividem a linha de tempo em intervalos fixos. A ilustração a seguir mostra o aplicativo de uma janela de salto muito maior que o tamanho do salto. Isso é típico em cenários como "a cada dez segundos, computar a média de todos os eventos em cinco minutos".

Janela de salto com eventos com sobreposição.

A ilustração a seguir mostra o resultado dessa agregação acima do fluxo em janela quando a política de saída é PointAlignToWindowEnd.

Agregações com PointAlignToWindowEnd

Para uma agregação sem detecção de hora, como Sum, Avg, Count etc., todos os resultados da agregação neste diagrama têm o mesmo valor, porque é sempre o mesmo conjunto de cargas, e1 e e2, que contribuem para as janelas subjacentes. Esse comportamento de resultados repetitivos deve ser levado em conta, principalmente se essa janela for aplicada a uma operação agrupar e aplicar com um alto número de grupos. Com uma frequência de janela maior que a frequência de evento original (por exemplo, conforme mostrado no diagrama anterior), a taxa de evento de saída será significativa. Se um resultado de agregação precisar ser produzido somente em caso de alterações de entrada, uma janela de instantâneo deverá ser usada.

Políticas de saída

PointAlignToWindowEnd

Essa política de saída gera um evento pontual cuja hora inicial é a hora final da janela, conforme mostrado no diagrama anterior. Essa nova política de saída é útil quando você combina o resultado com outro fluxo, desde que haja somente um único resultado válido em cada momento determinado, que expressa o resultado de agregação mais recente nesse ponto. Uma janela de salto com essa política de saída pode ser combinada com o padrão de design de ponto para sinalização para criar um fluxo contínuo de resultados de agregação, que, em cada momento determinado, contém um evento de intervalo com o último resultado conhecido.

PointAlignToWindowEnd será a política de saída padrão para uma janela de salto caso a política de saída não seja especificada.

ClipToWindowEnd

Essa política de saída gera um tamanho de janela que corresponde ao tempo de vida útil da operação baseada em conjunto, conforme mostrado no diagrama a seguir. Observe que isso tem implicações no dinamismo da consulta.

Política de saída ClipToWindowEnd para janelas de saltosNova política de saída para janelas de saltos

Comportamento de CTI

Observe que as janelas de salto podem ter um efeito sobre os eventos CTI (incremento de tempo atual). Quando a política de saída for ClipToWindowEnd, cada evento CTI será movido para o início da respectiva janela. O motivo disso é que o tamanho da janela é atribuído ao resultado da operação acima da janela. Dessa forma, desde que os eventos dentro da janela sejam recebidos, toda a duração da janela está sujeita a alteração. No entanto, quando a política de saída for NEW_POLICY, os eventos CTI serão passados sem alterações. Para obter mais informações sobre eventos CTI, consulte Tempo avançado do aplicativo.

Definindo janelas de salto

Uma janela de salto é definida pelo tamanho da sua janela e do seu salto, conforme mostrado no exemplo a seguir.

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

O argumento de política da janela de salto no exemplo anterior é uma propriedade estática que retorna uma instância da classe de política correspondente.

Se os tamanhos do salto e da janela forem iguais, uma versão abreviada chamada de janela de tombamento poderá ser usada, conforme mostrado no exemplo a seguir.

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

O alinhamento da janela de salto (ou de tombamento) é um parâmetro opcional. No exemplo a seguir, cada janela inicia e termina às 9h00. Tempo Universal Coordenado (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) };

Consulte também

Conceitos

Agregações

TopK

Agregações e operadores definidos pelo usuário

Janelas de contagem

Janela de instantâneo

Usando janelas de eventos