이벤트 유형 만들기
이 항목에서는 이벤트 유형 만들기 지침을 제공합니다. 이벤트 유형은 이벤트 원본에서 게시하거나 이벤트 싱크에서 사용하는 이벤트를 정의합니다. 개발 환경에서 이벤트 유형은 단일 기본 유형, .NET Framework 클래스 또는 구조체로 지정되며 이벤트 스트림의 각 이벤트와 연결된 데이터(페이로드)를 정의합니다. 다음과 같은 개발 단계에서 이벤트 유형을 사용합니다.
형식화된 어댑터 작성 단계. 형식화된 어댑터는 큐에 넣을 새 이벤트 개체를 만들 때 적절한 구조가 초기화되도록 이벤트 유형을 제네릭 매개 변수로 사용합니다.
쿼리 템플릿 작성 단계. 쿼리 템플릿은 CepStream 개체를 기반으로 LINQ에서 지정됩니다. 이 개체의 정의는 이벤트 유형을 기반으로 합니다.
이벤트 및 이벤트 스트림에 대한 자세한 내용은 StreamInsight 서버 개념을 참조하십시오.
이벤트 구조 결정
이벤트 페이로드(페이로드의 필드 수 및 해당 유형)가 고정되어 있으며 사전에 확인되는 경우에는 형식화된 어댑터를 만들 수 있습니다. 형식화된 어댑터를 사용하는 경우 모든 어댑터 인스턴스에서 동일한 고정 페이로드 형식을 생성합니다. 일반적으로 데이터 구조가 고정된 이벤트 원본이 이 경우에 해당합니다.
형식화된 어댑터를 만들 때는 고정 페이로드를 나타내는 .NET 클래스 또는 구조체를 정의합니다. 이벤트 페이로드를 단일 필드로 나타낼 수 있는 경우에는 기본 유형을 사용합니다. 구조체나 클래스를 사용할 경우 페이로드 필드로는 공용 필드 및 속성만 사용할 수 있습니다. 전용 필드 및 속성과 클래스 메서드는 무시되며 이벤트 유형에 사용할 수 없습니다. 이 이벤트 유형 선언을 사용하여 입력 어댑터에서 이벤트 유형을 채우고 출력 어댑터에서 형식화된 이벤트 유형의 결과를 가져옵니다. 다음 예에서는 int 유형의 두 페이로드 필드(V1 및 V2)가 있는 간단한 이벤트 유형을 정의합니다.
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; }
}
특정 원본 또는 싱크에 대해 동일 어댑터가 여러 이벤트 유형을 처리할 수 있도록 구성하려는 경우에는 형식화되지 않은 어댑터가 유용합니다. 이러한 이벤트 유형의 이벤트 페이로드 형식은 어댑터를 쿼리에 바인딩할 때 구성 사양의 일부분으로 어댑터에 제공됩니다. 이러한 시나리오의 예로는 여러 필드가 포함되는 .csv 파일이 있습니다. 페이로드를 구성하는 정확한 필드 집합은 쿼리 디자이너가 쿼리 바인딩 및 인스턴스화 시에만 결정할 수 있으며 어댑터를 바인딩하는 개발자는 결정할 수 없습니다. 또 다른 예로는 생성되는 이벤트 유형이 테이블 스키마 또는 테이블에 대해 실행되는 쿼리에 따라 달라지는 SQL 테이블의 어댑터가 있습니다. 자세한 내용은 입력 어댑터 및 출력 어댑터 만들기를 참조하십시오.
쿼리 템플릿은 특정 이벤트 유형(디자인 타임에 확인됨)이 지정된 CepStream 개체를 기반으로 지정됩니다. 쿼리 템플릿 사양을 따르는 중간 CepStream 개체는 멤버 init 식을 사용하여 프로젝트 절(LINQ의 “select")에서 암시적으로 정의되는 새 유형을 포함할 수 있습니다.
페이로드 필드 요구 사항
이벤트 유형을 만들 때는 다음의 필드 요구 사항 및 기능을 고려하십시오.
이벤트 구조에는 빈 페이로드 구조를 포함할 수 없습니다. 필드를 하나 이상 입력해야 합니다.
페이로드 필드에는 스칼라 및 기본 .NET Framework와 중첩된 형식을 모두 사용할 수 있습니다. 뒷부분의 '지원되는 데이터 형식' 섹션을 참조하십시오.
사용자 지정 특성을 사용하여 필드를 수정할 수 없습니다.
StreamInsight 서버의 이벤트 유형은 해당 필드에 순서를 적용하지 않는 .NET 구조체가 아닌 정렬된 필드 목록입니다. 형식화되지 않은 어댑터에서는 이벤트 필드 순서가 중요합니다. 어댑터 디자인 타임에는 필드를 알 수 없으므로, 이러한 어댑터는 ordinal로 필드에 액세스합니다. 기본적으로는 이벤트 유형으로 사용되는 .NET 구조체에서 필드 이름의 사전순으로 필드를 정렬합니다.
필드의 Null 허용 여부가 유추됩니다. 예를 들어 int?에 대해서는 Null이 허용되지만 int에 대해서는 Null이 허용되지 않습니다. String 및 byte[] 형식에 대해서는 항상 Null이 허용됩니다.
byte[]의 기본 크기는 512입니다.
문자열 필드의 최대 길이는 16k바이트인 전체 이벤트의 페이지 크기로만 바인딩됩니다.
이벤트 크기
이벤트 유형에서 정의할 수 있는 필드 수에 대한 명시적 제한은 없습니다. 필드 수는 개별 필드의 유형, 크기 및 Null 허용 가능성에 따라 달라집니다.
StreamInsight 서버의 이벤트 페이지 크기는 16K입니다. 이벤트는 여러 페이지에 걸쳐 있을 수 없으므로 최대 이벤트 크기(페이로드 및 타임스탬프 필드 포함)로는 16K에서 약간의 오버헤드를 뺀 값이 적합합니다. 페이지 헤더, 이벤트 헤더 및 타임스탬프 등의 시스템 필드로 인해 발생하는 고정 오버헤드 외에, Null 허용 가능성 역시 N/8(상한으로 조정됨) 순서로 오버헤드를 변수에 추가합니다.
이벤트 페이지 사용률을 최대화하려는 경우에는 가능하면 다음 지침을 따르십시오.
Null 허용 가능 필드를 사용하지 않습니다.
string 및 byte[] 필드 사용을 최소화합니다.
이벤트 상태에 필요한 메모리를 엔진에서 보다 효율적으로 해제할 수 있도록 각 시나리오의 맥락에서 필요한 경우에만 이벤트 수명을 유지합니다.
이벤트 유형 검색 가능성
이벤트 유형을 만든 후에는 종속 프로젝트에서 해당 유형을 검색할 수 있는지 확인합니다. .NET 환경에서는 느슨하게 연결된 모듈을 분산 방식으로 빌드하여 어셈블리로 제공하는 기능을 개발자에게 제공합니다. 이러한 어셈블리를 합쳐 통합 응용 프로그램을 빌드하고 테스트한 다음 프로덕션 환경으로 배포할 수 있습니다.
앞서 설명한 것처럼, 쿼리 입력 및 출력에서 일치하는 이벤트 유형을 기반으로 하여 쿼리 템플릿을 입력 어댑터 및 출력 어댑터 인스턴스에 올바르게 바인딩하면 실행 가능한 StreamInsight 쿼리가 생성됩니다. 개발 환경에 따라 다른 사람에게 이벤트 유형 액세스 권한을 제공해야 하는 경우가 있습니다. 예를 들어 어댑터 개발자와 쿼리 개발자가 서로 독립적으로 개별 모듈에서 작업을 해야 하는 경우 다음과 같은 이벤트 유형 검색 가능성 시나리오를 고려할 수 있습니다.
어댑터 개발자가 이벤트 유형 게시자인 경우 어댑터 개발자가 StreamInsight 관리되는 API를 사용하여 어댑터를 작성한 다음 .NET 어셈블리를 전달할 수 있습니다. 그러면 다른 개발자는 ildasm.exe를 사용하거나 Visual Studio 프로젝트 내부에서 DLL을 참조하여 .NET 어셈블리에 대해 리플렉션을 수행함으로써 이벤트 유형을 확인할 수 있습니다. 이 방법을 사용하면 StreamInsight 서버에 대한 액세스 권한이 없어도 이벤트 유형에 액세스할 수 있습니다.
StreamInsight 서버 관리자가 이벤트 유형 게시자인 경우에는 관리자 또는 개발자가 StreamInsight 서버에서 이벤트 유형을 배포할 수 있습니다. 그러면 StreamInsight 서버에 대한 액세스 권한이 있는 쿼리 개발자가 해당하는 개체 모델 API 호출을 사용하여 메타데이터 항목을 검사하고 이벤트 유형을 확인할 수 있습니다. 어댑터 개발자가 이 이벤트 유형을 지원하는 형식화된 어댑터를 작성할 수도 있습니다.
어댑터 개발자 및 쿼리 개발자가 실제로 연결되어 있지 않은 경우(각자 공통 이벤트 유형을 고유한 방식으로 표현하여 사용함) 쿼리 바인딩 시에 개별 이벤트 유형 간의 일치 유효성 검사를 수행합니다. 일치하는 항목이 있으면 바인딩이 제대로 수행됩니다.
어댑터가 등록된 StreamInsight 서버 또는 어댑터 어셈블리에 대한 액세스 권한이 없는 쿼리 개발자는 어댑터에 대한 제품 안내서를 참조하거나 해당 도메인과 관련된 데이터 전송 프로토콜에 대한 일반적인 정보(예: 금융 거래의 경우 FIX(Financial Information Exchange) 또는 RMDS(Reuters Market Data System) 등)를 통해 이벤트 유형을 확인할 수 있습니다.
지원되는 데이터 형식
StreamInsight에서 각 이벤트 필드와 식에는 특정 데이터 형식이 있습니다. StreamInsight에서는 다음 데이터 형식이 지원됩니다. 또한 이벤트 페이로드는 이러한 데이터 형식으로 이루어진 중첩된 형식을 포함할 수 있습니다.
짧은 이름 |
.NET 클래스 |
유형 |
너비(비트) |
범위 |
byte |
Byte |
부호 없는 정수 |
8 |
0 ~ 255 |
sbyte |
Sbyte |
부호 있는 정수 |
8 |
-128 ~ 127 |
byte[] |
Byte[]1 |
바이트 |
|
|
int |
int32 |
부호 있는 정수 |
32 |
-2,147,483,648 ~ 2,147,483,647 |
uint |
uint32 |
부호 없는 정수 |
32 |
0 ~ 4294967295 |
short |
int16 |
부호 있는 정수 |
16 |
-32,768 ~ 32,767 |
ushort |
uint16 |
부호 없는 정수 |
16 |
0 ~ 65535 |
long |
int64 |
부호 있는 정수 |
64 |
-9223372036854775808 ~ 9223372036854775807 |
ulong |
uint64 |
부호 없는 정수 |
64 |
0 ~ 18446744073709551615 |
float |
Single |
단정밀도 부동 소수점 형식 |
32 |
-3.4 × 1038 ~ +3.4 × 1038 |
double |
Double |
배정밀도 부동 소수점 형식 |
64 |
±5.0 × 10−324 ~ ±1.7 × 10308 |
decimal |
Decimal |
유효 자릿수가 29개인 10진수를 나타낼 수 있는 정밀 소수 또는 정수 형식 |
128 |
±1.0 × 10e−28 ~ ±7.9 × 10e28 |
bool |
Boolean |
논리적 부울 유형 |
8 |
true 또는 false |
datetime |
DateTime |
서기 0001년 1월 1일 12:00:00(자정)에서 서기 9999년 12월 31일 오후 11:59:59초 사이의 값을 포함하는 날짜 및 시간 |
|
|
timespan |
TimeSpan |
표시된 시간 간격과 같은 틱 수입니다. 틱 하나는 100 나노초입니다. |
|
Int64.MinValue개 틱 ~ Int64.MaxValue개 틱 |
guid |
guid |
GUID(Globally Unique Identifier) |
128 |
|
char |
Char |
유니코드 문자 |
16 |
U+0000 ~ U+ffff |
string |
String1 |
유니코드 문자 시퀀스 |
|
. |
1 Null 허용 유형은 포함하지 않습니다.
어댑터 개발 중에는 DataTimeOffset 유형을 사용하여 이벤트 타임스탬프를 지정합니다. 그러나 이벤트 유형 페이로드 필드 정의에서는 DateTime 유형만 지원됩니다. DateTimeOffset 형식 데이터를 이벤트 필드로 가져오는 시나리오에서는 데이터를 DateTime(종류: UTC)으로 변환해야 합니다. 예를 들어 SQL Server 데이터베이스에서 데이터를 가져오거나 이벤트 타임스탬프 필드를 계산용으로 페이로드 필드에 복사하는 방법으로 페이로드 필드를 채울 수 있습니다.