Создание типов событий
В этом разделе приведены рекомендации по созданию типов событий. Тип событий определяет события, которые публикуются источником события или обрабатываются приемником событий. В процессе разработки они указываются в виде отдельных типов-примитивов, классов или структур .NET Framework и определяют данные (полезные), которые связаны с каждым событием в потоке событий. Типы событий используются на следующих этапах разработки.
Написание типизированного адаптера. В качестве универсального параметра типизированного адаптера используется тип событий, чтобы инициализировать нужную структуру при создании новых объектов событий для постановки в очередь.
Написание шаблона запроса. Шаблон запроса указывается на языке LINQ на базе объекта CepStream, определение которого основано на типе событий.
Дополнительные сведения о событиях и потоках событий см. в разделе Основные понятия сервера служб StreamInsight.
Определение структуры события
Если полезные данные события (количество полей в полезных данных и их типы) фиксированы и известны заранее, можно создать типизированный адаптер. Все экземпляры типизированного адаптера создают полезные данные в одинаковом фиксированном формате. Обычно так происходит в случае источников событий с фиксированной структурой данных.
При создании типизированного адаптера определяется класс или структура .NET, которая представляет постоянные полезные данные, или используется тип-примитив, если конкретные полезные данные события могут быть представлены единственным полем. При использовании структур или классов в качестве полей полезных данных можно применять только общедоступные поля и свойства. Закрытые поля и свойства, а также методы класса пропускаются, и их нельзя использовать в типе событий. Это объявление типа событий можно использовать для заполнения типа событий во входном адаптере и для получения результата из типа типизированного события в выходном адаптере. В следующем примере определяется простой тип события, в котором имеются два поля полезных данных, V1 и V2, типа int.
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 в спецификации шаблона запроса могут содержать новые типы, которые неявно определяются в предложениях проекта (select в LINQ), с использованием выражений init для элементов.
Требования к полям полезных данных
При создании типов событий следует учитывать следующие требования и функциональные возможности полей полезных данных.
В структуру событий не может входить пустая структура полезных данных. Требуется хотя бы одно поле.
Для полей полезных данных могут использоваться и скалярные, и элементарные типы платформы .NET Framework, а также вложенные типы. См. следующий раздел «Поддерживаемые типы данных».
Поля нельзя изменять с помощью настраиваемых атрибутов.
Типы событий на сервере StreamInsight представляют упорядоченный список полей, а не структуры .NET, в которых не задается порядок полей. Порядок полей события важен для нетипизированных адаптеров. Такие адаптеры обращаются к полям по значению ordinal, поскольку имена полей неизвестны во время разработки адаптера. По умолчанию считается, что поля в структуре .NET, служащей типом событий, упорядочены в соответствии с лексикографическим порядком имен.
Допустимость значений NULL для поля определяется автоматически. Например, значения NULL допускаются для типа int?, но не поддерживаются для типа int. Типы String и byte[] всегда допускают значения NULL.
По умолчанию размер byte[] составляет 512.
Максимальная длина строковых полей ограничена только размером страницы для всего события, который составляет 16 килобайт.
Размер события
Отсутствует явное ограничение для количества полей, которые можно определить в типе события. Количество полей зависит от типа отдельных полей, их размера и допустимости значений NULL.
Размер страницы события на сервере StreamInsight составляет 16 КБ. Поскольку событие не может занимать несколько страниц, то фактическим максимальным размером события (включая полезные данные и поля отметок времени) составляет 16 КБ за вычетом некоторого объема служебных данных. Помимо фиксированного объема служебных данных, занятых заголовком страницы, заголовком события и системными полями, такими как отметка времени, допустимость значений NULL добавляет к объему служебных данных переменную величину порядка N/8 (с округлением вверх).
Чтобы повысить эффективность использования страницы события, рекомендуется выполнять следующие правила.
Не используйте поля, допускающие значения NULL.
Сократите использование полей типа string и byte[].
Сохраняйте события ровно столько, сколько этого требует семантика соответствующего сценария, так чтобы можно было более эффективно высвобождать память подсистемы, необходимую для состояния события.
Возможность обнаружения типов событий
После создания типа события следующим шагом является обеспечение возможности его обнаружения зависимыми проектами. Заметьте, что среда .NET дает разработчикам возможность строить слабосвязанные модули с высокой степенью распространенности и упаковывать их в сборки. Затем эти сборки можно объединить, чтобы построить интегрированное приложение, проверить его и развернуть в рабочей среде.
Помните, что доступный для выполнения запрос StreamInsight является результатом успешной привязки шаблона запроса к экземплярам входного и выходного адаптеров на основе соответствия типов события на входе и выходе запроса. В зависимости от среды разработки может понадобиться предоставить доступ к типу событий другим пользователям. Например, разработчик адаптера и разработчик запроса могут независимо работать со своими модулями. Рассмотрим следующие сценарии для возможности обнаружения типа событий.
Если разработчик адаптера является издателем типа событий, то он может написать адаптер с помощью API управляемого кода StreamInsight и отправить сборку .NET. Другие разработчики могут обращаться к сборке .NET с помощью ildasm.exe или ссылаясь на библиотеку из проекта Visual Studio, чтобы определить тип событий. В этом случае для доступа к типу событий не требуется доступ к серверу StreamInsight.
Если издателем типа событий является администратор сервера StreamInsight, то администратор или разработчик могут развернуть тип событий на этом сервере. Затем разработчик запроса, который имеет доступ к серверу StreamInsight, сможет использовать вызовы API нужной объектной модели для просмотра элементов метаданных и определения типа событий. Разработчик адаптера также может написать типизированный адаптер, обеспечивающий поддержку этого типа событий.
Если разработчик адаптера и разработчик запроса работают изолированно (каждый пользуется собственным представлением общего типа событий), то проверка соответствия типов событий будет выполняться на этапе привязки запроса. Если соответствие установлено, привязка выполняется успешно.
Если разработчик запроса не имеет доступа к сборке адаптера или серверу StreamInsight, на котором зарегистрирован адаптер, то он может определить тип событий в документации по продукту для адаптера или по протоколам передачи данных, относящимся к данной области (например, протокол Financial Information Exchange (FIX) или Reuters Market Data System (RMDS) в биржевых операциях).
Поддерживаемые типы данных
В StreamInsight каждое поле событий и каждое выражение имеет определенный тип данных. StreamInsight поддерживает следующие типы данных. Полезные данные события могут также содержать вложенные типы, которые состоят из этих типов данных.
Краткое имя |
Класс .NET |
Тип |
Ширина в битах |
Диапазон |
байт |
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 до 4 294 967 295 |
short |
int16 |
Целое число со знаком |
16 |
От -32 768 до 32 767 |
ushort |
uint16 |
Целое число без знака |
16 |
От 0 до 65 535 |
long |
int64 |
Целое число со знаком |
64 |
От -9 223 372 036 854 775 808 до 9 223 372 036 854 775 807 |
ulong |
uint64 |
Целое число без знака |
64 |
От 0 до 18 446 744 073 709 551 615 |
float |
Single |
Тип с плавающей запятой одиночной точности |
32 |
От -3,4 х 10^38 до +3,4 х 10^38 |
double |
Double |
Тип с плавающей запятой двойной точности |
64 |
От ±5,0 х 10^-324 до ±1,7 х 10^308 |
decimal |
Decimal |
Точный тип дробных или целых значений, представляющих десятичные числа с 29 значащими разрядами |
128 |
От ±1,0 Ч 10e−28 до ±7,9 Ч 10e28 |
bool |
Boolean |
Логический тип |
8 |
true или false |
datetime |
DateTime |
Значения даты и времени от полуночи (12:00:00) 1 января 0001 года нашей эры до 23:59:59 31 декабря 9999 года нашей эры |
|
|
timespan |
TimeSpan |
Количество тактов, равное представленному интервалу времени. Продолжительность такта составляет 100 нс |
|
От Int64.MinValue тактов до Int64.MaxValue тактов |
guid |
guid |
Идентификатор GUID |
128 |
|
char |
Char |
Символ в Юникоде |
16 |
От U+0000 до U+ffff |
строка |
String1 |
Последовательность символов в Юникоде |
|
. |
1 Не включает тип, допускающий значения NULL.
Отметки времени событий в ходе разработки адаптера задаются с помощью типа DataTimeOffset. Однако в определении полей полезных данных типа событий поддерживается только тип DateTime. В случаях, когда в поле события импортируются данные типа DateTimeOffset, необходимо преобразовать данные в тип DateTime (время в формате UTC). Например, поле полезных данных может заполняться из базы данных SQL Server или путем копирования полей отметок времени событий в поля полезных данных для вычисления.
См. также
Основные понятия
Создание входных и выходных адаптеров