Поделиться через


Создание типов событий

В этом разделе приведены рекомендации по созданию типов событий. Тип событий определяет события, которые публикуются источником события или обрабатываются приемником событий. В процессе разработки они указываются в виде отдельных типов-примитивов, классов или структур .NET Framework и определяют данные (полезные), которые связаны с каждым событием в потоке событий. Типы событий используются на следующих этапах разработки.

  1. Написание типизированного адаптера. В качестве универсального параметра типизированного адаптера используется тип событий, чтобы инициализировать нужную структуру при создании новых объектов событий для постановки в очередь.

  2. Написание шаблона запроса. Шаблон запроса указывается на языке 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 или путем копирования полей отметок времени событий в поля полезных данных для вычисления.

См. также

Основные понятия

Создание входных и выходных адаптеров

Основные понятия сервера служб StreamInsight

Законченный пример StreamInsight