이벤트 구조

 

이 항목에서는 이벤트 원본에서 게시하거나 이벤트 싱크에서 사용하는 이벤트 구조를 설명합니다. 개발 환경에서 이벤트는 단일 기본 유형, .NET Framework 클래스 또는 구조체로 지정되며 이벤트 스트림의 각 이벤트와 연결된 데이터(페이로드)를 정의합니다.

이벤트 및 이벤트 스트림에 대한 일반적인 내용은 StreamInsight 개념을 참조하십시오.

임시 스트림에 표시되는 기본 데이터는 이벤트로 패키지됩니다. 이벤트는 StreamInsight 서버에서 처리하는 데이터의 기본 단위입니다. 각 이벤트는 다음과 같은 부분으로 구성됩니다.

  • 헤더. 이벤트 헤더에는 이벤트 종류를 정의하는 메타데이터와 이벤트의 시간 간격을 정의하는 하나 이상의 타임스탬프가 포함됩니다. 타임스탬프는 응용 프로그램을 기반으로 하며 StreamInsight 서버에서 제공하는 시스템 시간이 아닌 데이터 원본에서 제공하는 시간입니다. 타임스탬프는 표준 시간대를 인식하며 24시간제를 기준으로 하는 DateTimeOffset 데이터 형식을 사용합니다. StreamInsight 서버는 모든 시간을 UTC 날짜/시간으로 정규화하며 타임스탬프 필드에 UTC 플래그가 설정되어 있는지 입력을 확인합니다.

  • 페이로드. 이벤트와 연결된 데이터를 포함하는 .NET 데이터 구조입니다. 페이로드에 정의된 필드는 사용자 정의 필드이며, 이들 필드의 형식은 .NET 형식 시스템을 기반으로 합니다.

해당 응용 프로그램 타임스탬프가 쿼리에 도착한 순서에 해당하는 스트림의 이벤트를 "올바른 순서"라고 합니다. 그렇지 않은 경우 이벤트를 "잘못된 순서"로 도착했다고 합니다. StreamInsight 서버는 이벤트가 잘못된 순서로 도착해도 쿼리 작성기가 명시적으로 그렇지 않도록 지정하는 경우가 아니면 쿼리 출력은 이벤트가 순서대로 도착한 것과 같음을 보장합니다. 스트림 내의 일반적인 이벤트 도착 패턴은 다음과 같습니다.

  • 파일이나 테이블의 레코드와 같은 안정적 속도

  • 소매점 바코드 스캐너의 데이터와 같은 중간 및 임의 속도

  • 웹 클릭이나 기상 계측과 같이 갑자기 증가할 수 있는 중간 속도

이벤트 헤더

이벤트 헤더는 이벤트 종류와 이벤트 임시 속성을 정의합니다.

이벤트 종류

이벤트 종류는 이벤트가 스트림의 새 이벤트인지 스트림에 대한 정보를 포함하는 표시기인지를 나타냅니다. StreamInsight에서는 삽입 및 CTI(현재 시간 증분)의 두 가지 이벤트 종류가 지원됩니다.

INSERT 이벤트 종류는 페이로드가 포함된 이벤트를 이벤트 스트림에 추가합니다. INSERT 이벤트의 헤더는 페이로드 외에 이벤트 시작 시간과 종료 시간도 식별합니다. 다음 다이어그램에서는 INSERT 이벤트 종류의 레이아웃을 보여 줍니다.

헤더페이로드
Event kind ::= INSERT

StartTime ::= DateTimeOffset

EndTime ::= DateTimeOffset
Field 1 … Field n as CLR types

CTI 이벤트 종류는 스트림에서 기존 이벤트의 완료를 나타내는 공간적 ‘중단’ 이벤트입니다. CTI 이벤트 구조는 현재 타임스탬프를 제공하는 단일 필드로 구성되며, CTI 이벤트는 두 가지 용도로 사용됩니다.

  1. 먼저, CTI 이벤트는 해당 응용 프로그램 타임스탬프가 쿼리에 도착한 순서에 해당하지 않는 이벤트를 쿼리에서 허용 및 처리할 수 있도록 합니다. CTI 이벤트는 실행 시에 들어오는 후속 INSERT 이벤트가 CTI 타임스탬프 이전의 이벤트 기록을 수정할 수 없음을 StreamInsight 서버에 알립니다. 즉, CTI 이벤트가 실행되고 나면 INSERT 이벤트의 시작 시간이 CTI 이벤트 타임스탬프보다 이전일 수 없습니다. 이와 같이 이벤트 스트림의 “완료”가 표시되면 StreamInsight 서버가 기간 이동 또는 상태가 누적된 기타 집계 연산자의 결과를 해제할 수 있으므로 시스템 전체에서 이벤트 흐름 효율성을 유지할 수 있습니다.

  2. 또한 CTI 이벤트는 쿼리의 짧은 대기 시간을 유지할 수 있도록 합니다. CTI가 자주 발생하면 쿼리에서 보다 높은 빈도로 결과를 내보냅니다.

System_CAPS_ICON_important.jpg 중요


입력 스트림에 CTI 이벤트가 존재하지 않을 경우 쿼리에서 출력이 생성되지 않습니다.

자세한 내용은 응용 프로그램 시간 이동을 참조하십시오.

다음 다이어그램에서는 CTI 이벤트 종류의 레이아웃을 보여 줍니다.

헤더
Event kind ::= CTI

StartTime ::= DateTimeOffset

이벤트 모델

이벤트 모델은 임시 특성을 기준으로 이벤트의 셰이프를 정의합니다. StreamInsight에서는 지점, 간격, 가장자리 이벤트 모델이 (간격, 지점, 가장자리)이 지원됩니다. 간격 이벤트는 가장 일반적인 유형이고 가장자리와 지점은 특수한 유형입니다.

간격

간격 이벤트 모델은 페이로드가 지정된 기간 동안 유효한 이벤트를 나타냅니다. 간격 이벤트 모델에서는 이벤트의 시작 시간과 종료 시간이 모두 이벤트 메타데이터에 제공되어야 합니다. 간격 이벤트는 해당하는 특정 시간 간격에만 유효합니다. 이벤트 페이로드의 유효성과 관련하여 이벤트 시작 시간은 경계에 포함되지만 종료 시간은 경계에서 제외됩니다.

다음 다이어그램에서는 간격 이벤트 모델의 레이아웃을 보여 줍니다.

메타데이터페이로드
Event kind ::= INSERT

StartTime ::= DateTimeOffset

EndTime ::= DateTimeOffset
Field 1 … Field n as CLR types

간격 이벤트의 예로는 전자파의 폭, 경매 입찰 유효 기간, 주식 호가가 특정 기간 동안 유효한 주식 종목 작업 등이 있습니다. 앞서 설명한 전원 모니터링 예제에서 다음 간격 이벤트를 사용하여 전원 측정기 이벤트 스트림을 표시할 수 있습니다.

이벤트 종류시작종료페이로드(소모량)
INSERT2009-07-15 09:13:33.3172009-07-15 09:14:09.270100
INSERT2009-07-15 09:14:09.2702009-07-15 09:14:22.255200
INSERT2009-07-15 09:14:22.2552009-07-15 09:15:04.987100
시점

시점 이벤트 모델은 단일 시점의 이벤트 발생을 나타냅니다. 시점 이벤트 모델에는 이벤트의 시작 시간만 필요합니다. StreamInsight 서버는 시작 시간에 틱(기본 시간 데이터 형식의 최소 시간 단위)을 추가해 유효한 종료 시간을 유추하여 이벤트의 유효한 시간 간격을 설정합니다. 이벤트 종료 시간이 경계에서 제외되기 때문에 시점 이벤트는 해당하는 단일 시작 시간 인스턴스에만 유효합니다.

다음 다이어그램에서는 시점 이벤트 모델의 레이아웃을 보여 줍니다.

메타데이터페이로드
Event kind ::= INSERT

StartTime ::= DateTimeOffset
Field 1 … Field n as CLR types

측정기 판독값, 전자 메일 도착, 사용자의 웹 클릭, 주식 시세, Windows 이벤트 로그에 입력되는 항목 등을 시점 이벤트의 예로 들 수 있습니다. 앞서 설명한 전원 모니터링 예제에서 다음 시점 이벤트를 사용하여 전원 측정기 이벤트 스트림을 표시할 수 있습니다. 종료 시간은 시작 시간 + 1틱(t)으로 계산됩니다.

이벤트 종류시작종료페이로드(소모량)
INSERT2009-07-15 09:13:33.3172009-07-15 09:13:33.317 + t100
INSERT2009-07-15 09:14:09.2702009-07-15 09:14:09.270 + t200
INSERT2009-07-15 09:14:22.2552009-07-15 09:14:22.255 + t100
가장자리

가장자리 이벤트 모델은 페이로드가 지정된 기간 동안 유효한 이벤트 발생을 나타냅니다. 가장자리 시작 이벤트를 받으면 종료 시간이 미래의 최대 시간으로 설정됩니다. 종료 이벤트를 받으면 이벤트 종료 시간이 업데이트됩니다. 가장자리 이벤트 모델에는 시간 및 가장자리 유형의 두 가지 속성이 포함됩니다. 이 두 속성은 가장자리 이벤트의 시작 지점 또는 종료 지점을 정의합니다.

다음 다이어그램에서는 가장자리 이벤트 모델의 레이아웃을 보여 줍니다.

메타데이터페이로드
Event kind ::= INSERT

Edge time ::= DateTimeOffset

Edge type ::= START | END
Field 1 … Field n as CLR types

가장자리 이벤트의 예로는 Windows 프로세스, ETW(Windows용 이벤트 추적)의 추적 이벤트, 웹 사용자 세션, 아날로그 신호 양자화 등이 있습니다. 가장자리 이벤트 페이로드의 유효한 시간 간격은 시작 이벤트 타임스탬프와 종료 이벤트 타임스탬프 간의 차입니다. 다음 다이어그램에서 페이로드 값이 ‘c’인 이벤트에서 현재 지정 시간에는 알려진 종료 날짜가 없습니다.

이벤트 종류가장자리 유형시작 시간종료 시간페이로드
INSERT시작t0DateTimeOffset.MaxValuea
INSERT종료t0t1a
INSERT시작t1DateTimeOffset.MaxValueb
INSERT종료t1t3b
INSERT시작t3DateTimeOffset.MaxValuec
그 외 다수

다음 그림에서는 위의 표에 정의된 시작 시간과 종료 시간을 기준으로 하는 가장자리 이벤트를 사용한 아날로그 신호 양자화를 보여 줍니다. 이러한 연속 신호는 모든 새 값에 대해 END 가장자리와 START 가장자리를 모두 제출해야 함을 의미합니다. 그림에 설명되어 있는 가장자리는 t1에서 t3까지의 시간에 포함된 이벤트를 참조합니다.

EdgeEvent

이벤트 모델 선택과 관련된 성능 고려 사항

데이터를 위한 올바른 이벤트 모델을 선택하는 것이 중요합니다. 예를 들어 일정 기간 지속되는 이벤트가 있고 이벤트의 시작 및 종료 시간을 결정하는 기능이 응용 프로그램에 있는 경우 간격 이벤트를 사용하여 모델링하는 것이 좋습니다. 이벤트 도착 시에 이벤트의 종료 시간을 모르는 경우에는 이벤트를 시점 이벤트로 모델링하고 일정 기간 동안 연장되도록 해당 수명을 변경한 다음 잘라내기 작업을 사용하여 해당 이벤트의 종료가 인식될 경우 수명을 수정할 수 있습니다. 고려할 수 있는 다른 대안은 이러한 이벤트를 가장자리 이벤트로 모델링하는 것입니다.

가장자리 이벤트는 매우 편리한 이벤트 모델이지만 몇 가지 성능 문제를 알고 있어야 합니다. 가장자리 이벤트는 완전히 정렬되어 도착할 경우, 즉 모든 가장자리 시작이 시작 시간에 정렬되고 모든 가장자리 종료가 종료 시간에 정렬되며 이벤트의 결합된 순서도 제시간에 정렬된 경우 가장 잘 작동합니다. 예를 들어 가장자리 이벤트의 순서가 다음과 같다고 가정해 봅니다.

이벤트 종류가장자리 유형시작 시간종료 시간페이로드
INSERT시작1DateTimeOffset.MaxValuea
INSERT종료110a
INSERT시작3DateTimeOffset.MaxValueb
INSERT종료36b
INSERT시작5DateTimeOffset.MaxValuec
INSERT종료520c

이 순서는 타임스탬프에서 정렬되지 않습니다(1, 10, 3, 6, 5, 20). 가장자리 이벤트가 완전히 정렬된 경우(1, 3, 5, 6, 10, 20) 쿼리 처리가 더욱 효율적으로 수행됩니다. 이는 문제를 두 개의 쿼리로 분할함으로써 가능합니다. 첫 번째 쿼리는 가장자리 이벤트를 입력으로 수신하고 완전히 정렬한 다음 정렬된 가장자리 이벤트를 출력하는 빈 쿼리입니다. 두 번째 쿼리는 이 입력을 가져와 주요 논리를 수행합니다. 이러한 쿼리를 두 개의 개별 쿼리로 정의한 다음 동적 쿼리 컴퍼지션을 사용하여 결합해야 합니다. 자세한 내용은 런타임에 쿼리 작성을 참조하십시오.

이벤트 페이로드

이벤트 페이로드는 이벤트와 연결된 데이터를 포함하는 .NET 데이터 구조입니다. 페이로드의 필드는 사용자 정의 필드이며 필드 형식은 .NET 형식 시스템을 기반으로 합니다. 페이로드 필드에는 대부분의 CLR 스칼라 및 기본 형식을 사용할 수 있으며 중첩 형식은 지원되지 않습니다.

이벤트 구조를 만들 때는 고정 페이로드를 나타내는 .NET 클래스 또는 구조체를 정의합니다. 이벤트 페이로드를 단일 필드로 나타낼 수 있는 경우에는 기본 유형을 사용합니다. 구조체나 클래스를 사용할 경우 페이로드 필드로는 공용 필드 및 속성만 사용할 수 있습니다. 전용 필드 및 속성과 클래스 메서드는 무시되며 이벤트 유형에 사용할 수 없습니다. 다음 예에서는 int 유형의 두 페이로드 필드(V1V2)가 있는 간단한 이벤트 유형을 정의합니다.

public class MyPayload  
{  
    public int V1 { get; set; }  
    public int V2 { get; set; }  
}  

아래의 다른 예에서는 중첩된 이벤트 유형을 사용하는 방법을 보여 줍니다.

public class ComplexPayload  
{  
    public ValueType Value { get; set; }  
    public bool Status  { get; set; }  
}  
  
public class ValueType  
{  
    public double Value { get; set; }  
    public int Quality  { get; set; }  
}  

페이로드 필드 요구 사항

이벤트를 정의할 때는 다음의 필드 요구 사항 및 기능을 고려하십시오.

  • 이벤트 구조에는 빈 페이로드 구조를 포함할 수 없습니다. 필드를 하나 이상 입력해야 합니다.

  • 페이로드 필드에는 스칼라 및 기본 .NET Framework와 중첩된 형식을 모두 사용할 수 있습니다. 뒷부분의 '지원되는 데이터 형식' 섹션을 참조하십시오.

  • 사용자 지정 특성을 사용하여 필드를 수정할 수 없습니다.

  • StreamInsight 서버의 이벤트는 해당 필드에 순서를 적용하지 않는 .NET 구조체가 아닌 정렬된 필드 목록입니다.

  • 필드의 Null 허용 여부가 유추됩니다. 예를 들어 int?에 대해서는 Null이 허용되지만 int에 대해서는 Null이 허용되지 않습니다. Stringbyte [] 형식에 대해서는 항상 Null이 허용됩니다.

  • byte[]의 기본 크기는 512입니다.

  • 문자열 필드의 최대 길이는 16k바이트인 전체 이벤트의 페이지 크기로만 바인딩됩니다.

이벤트 크기

이벤트에서 정의할 수 있는 필드 수에 대한 명시적 제한은 없습니다. 필드 수는 개별 필드의 유형, 크기 및 Null 허용 가능성에 따라 달라집니다.

StreamInsight 서버의 이벤트 페이지 크기는 16K입니다. 이벤트는 여러 페이지에 걸쳐 있을 수 없으므로 최대 이벤트 크기(페이로드 및 타임스탬프 필드 포함)로는 16K에서 약간의 오버헤드를 뺀 값이 적합합니다. 페이지 헤더, 이벤트 헤더 및 타임스탬프 등의 시스템 필드로 인해 발생하는 고정 오버헤드 외에, Null 허용 가능성 역시 N/8(상한으로 조정됨) 순서로 오버헤드를 변수에 추가합니다.

이벤트 페이지 사용률을 최대화하려는 경우에는 가능하면 다음 지침을 따르십시오.

  • Null 허용 가능 필드를 사용하지 않습니다.

  • stringbyte[] 필드 사용을 최소화합니다.

  • 이벤트 상태에 필요한 메모리를 엔진에서 보다 효율적으로 해제할 수 있도록 각 시나리오의 맥락에서 필요한 경우에만 이벤트 수명을 유지합니다.

StreamInsight에서 각 이벤트 필드와 식에는 특정 데이터 형식이 있습니다. StreamInsight에서는 다음 데이터 형식이 지원됩니다. 또한 이벤트 페이로드는 이러한 데이터 형식으로 이루어진 중첩된 형식을 포함할 수 있습니다.

짧은 이름.NET 클래스유형너비(비트)범위
byteByte부호 없는 정수80 ~ 255
sbyteSbyte부호 있는 정수8-128 ~ 127
byte[]Byte[] 1바이트
intint32부호 있는 정수32-2,147,483,648 ~ 2,147,483,647
uintuint32부호 없는 정수320 ~ 4294967295
shortint16부호 있는 정수16-32,768 ~ 32,767
ushortuint16부호 없는 정수160 ~ 65535
longint64부호 있는 정수64-9223372036854775808 ~ 9223372036854775807
ulonguint64부호 없는 정수640 ~ 18446744073709551615
floatSingle단정밀도 부동 소수점 형식32-3.4 × 1038 ~ +3.4 × 1038
doubleDouble배정밀도 부동 소수점 형식64±5.0 × 10−324 ~ ±1.7 × 10308
decimalDecimal유효 자릿수가 29개인 10진수를 나타낼 수 있는 정밀 소수 또는 정수 형식128±1.0 × 10e−28 ~ ±7.9 × 10e28
boolBoolean논리적 부울 유형8true 또는 false
datetimeDateTime서기 0001년 1월 1일 12:00:00(자정)에서 서기 9999년 12월 31일 오후 11:59:59초 사이의 값을 포함하는 날짜 및 시간
timespanTimeSpan표시된 시간 간격과 같은 틱 수입니다. 틱 하나는 100 나노초입니다.Int64.MinValue개 틱 ~ Int64.MaxValue개 틱
guidguidGUID(Globally Unique Identifier)128
charChar유니코드 문자입니다.16U+0000 ~ U+ffff
stringString 1유니코드 문자 시퀀스.

1 Null 허용 유형은 포함하지 않습니다.

StreamInsight 개념

표시: