Crear tipos de evento

En este tema se proporcionan instrucciones para crear tipos de evento. Un tipo de evento define los eventos publicados por el origen del evento o usados por el receptor de eventos. En la experiencia de desarrollo, se especifican como tipos primitivos individuales, clases .NET Framework o estructuras y definen los datos (carga) que se asocian con cada evento del flujo de eventos. Los tipos de evento se usan en las siguientes fases de desarrollo:

  1. Escritura de un adaptador con tipo. Un adaptador con tipo utiliza el tipo de evento como un parámetro genérico para que se inicialice la estructura apropiada al crear nuevos objetos de evento para poner en cola.

  2. Escritura de una plantilla de consulta. Una plantilla de consulta se especifica en LINQ sobre un objeto CepStream, cuya definición se basa en un tipo de evento.

Para obtener más información acerca de los eventos y los flujos de eventos, vea Conceptos de servidor de StreamInsight.

Determinar la estructura de evento

Cuando la carga de evento (es decir, el número de campos de la carga y sus tipos) es fija y se conoce de antemano, se puede crear un adaptador con tipo. Con un adaptador con tipo, todas las instancias del adaptador producen el mismo formato de carga fija. Este suele ser el caso de los orígenes de eventos con una estructura de datos fija.

Al crear un adaptador con tipo, se define una clase o estructura .NET que representa la carga fija o use un tipo primitivo si la carga de evento se puede representar mediante un campo individual. Al usar estructuras o clases, solo se pueden usar campos y propiedades públicos como campos de carga. Los campos y propiedades privados, así como los métodos de clase, se omiten y no se pueden utilizar en el tipo de evento. Esta declaración de tipo de evento se usa para rellenar el tipo de evento en el adaptador de entrada y para obtener el resultado del tipo de evento con tipo en el adaptador de salida. En el siguiente ejemplo se define un tipo de evento simple que tiene dos campos de carga, V1 y V2, del tipo int.

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

Otro ejemplo muestra el modo de usar un tipo de evento anidado:

    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; }
    }

Un adaptador sin tipo resulta útil si se desea que el mismo adaptador para un origen o receptor concretos se pueda configurar para que pueda admitir varios tipos de evento. El formato de carga de evento para estos tipos de evento se proporciona al adaptador como parte de una especificación de configuración en el momento de enlazar el adaptador a la consulta. Un ejemplo de este tipo de escenario es un archivo .csv que contiene un número variable de campos. El diseñador de consultas (y no el desarrollador que está creando el adaptador) solo puede determinar el conjunto exacto de campos que constituyen una carga en el momento de enlazar la consulta y crear instancias de ella. Otro ejemplo es un adaptador para las tablas de SQL, donde el tipo de los eventos que se generan depende del esquema de la tabla o de la consulta que se emite para la tabla. Para obtener más información, vea Crear adaptadores de entrada y de salida.

La especificación de una plantilla de consulta se basa en un objeto CepStream con un tipo de evento concreto, que tiene que ser conocido en tiempo de diseño. Los objetos CepStream intermedios a lo largo de la especificación de plantilla de consulta pueden contener nuevos tipos que se definen implícitamente en cláusulas de proyecto ("select" en LINQ), utilizando expresiones init del miembro.

Requisitos de campo de carga

Al crear tipos de evento, tenga en cuenta los siguientes requisitos y funciones de los campos de carga.

  • Una estructura de evento no puede tener una estructura de carga vacía. Se requiere al menos un campo.

  • En los campos de carga se pueden usar tipos anidados y tipos escalares y elementales de .NET Framework. Vea la sección "Tipos de datos compatibles" a continuación.

  • Los campos no se pueden modificar con atributos personalizados.

  • Los tipos de evento del servidor de StreamInsight son una lista ordenada de campos en lugar de estructuras .NET, que no imponen un orden en sus campos. El orden de los campos de evento tiene importancia para los adaptadores sin tipo. Estos adaptadores tienen acceso a los campos a través de ordinal porque los campos no se conocen en el tiempo de diseño del adaptador. Por convención predeterminada, una estructura .NET, que se utiliza como tipo de evento, ordena sus campos según el orden lexicográfico de sus nombres. 

  • Se deduce el campo puede tener valores nulos. Por ejemplo, int? admitirá valores NULL, pero int no. Los tipos String y byte[] siempre admiten valores NULL.

  • El tamaño predeterminado de byte[] es 512.

  • La longitud máxima de los campos de cadena solo viene dada por el tamaño de página de todo el evento, que es 16 k bytes.

Tamaño de evento

No hay ninguna limitación explícita en el número de campos que se pueden definir en el tipo de evento. El número de campos depende del tipo de los campos individuales, su tamaño y nulabilidad.

El tamaño de página de evento en el servidor de StreamInsight es 16K. Dado que un evento no puede abarcar varias páginas, el tamaño máximo de evento efectivo (incluidos los campos de carga y marca de tiempo) es de 16K menos alguna sobrecarga. Además de la sobrecarga fija en la que incurre el encabezado de la página, el encabezado del evento y campos de sistema como la marca de tiempo, la nulabilidad se suma a la sobrecarga variable en el orden de N/8 ajustado a un límite superior.

Para maximizar la utilización de la página de evento, se recomienda seguir estas directrices:

  • Evite los campos que aceptan valores NULL.

  • Reduzca el uso de campos string y byte[].

  • Establezca las duraciones de evento con la longitud estrictamente necesaria para las semántica del escenario respectivo, de forma que la memoria requerida para el estado del evento se pueda liberar más eficazmente en el motor

Detectar los tipos de evento

Una vez creado un tipo de evento, el paso siguiente consiste en asegurarse de que los proyectos dependientes lo pueden detectar. El entorno .NET proporciona a los desarrolladores la capacidad de crear módulos de manera distribuida y con acoplamiento flexible, y de enviarlos como ensamblados. Estos ensamblados se pueden unir para crear una aplicación integrada, probada e implementada en producción.

Recuerde que una consulta de StreamInsight ejecutable es el resultado del enlace correcto de una plantilla de consulta con instancias de adaptadores de entrada y salida, en función de los tipos de eventos coincidentes en la entrada y la salida de la consulta. Es posible que, según el entorno de desarrollo, deba proporcionar acceso al tipo de evento a otros usuarios. Por ejemplo, el desarrollador de software de adaptadores y el desarrollador de consultas podrían tener que trabajar independientemente en sus módulos respectivos. Considere los siguientes escenarios para la detección del tipo de evento:

  • Si el desarrollador de adaptadores es el publicador del tipo de evento, puede escribir el adaptador mediante la API administrada de StreamInsight y distribuir el ensamblado .NET. Otros desarrolladores pueden reflejar el ensamblado .NET utilizando ildasm.exe o haciendo referencia a la DLL desde el proyecto de Visual Studio y determinar el tipo de evento. Con este método, no es necesario tener acceso al servidor de StreamInsight para tener acceso al tipo de evento.

  • Si el administrador del servidor de StreamInsight es el publicador del tipo de evento, el administrador o el desarrollador pueden implementar el tipo de evento en el servidor de StreamInsight. A continuación, un desarrollador de consultas que tenga acceso al servidor de StreamInsight puede utilizar llamadas a la API del modelo de objetos que corresponda para inspeccionar los elementos de metadatos y determinar el tipo de evento. El desarrollador de adaptadores también puede escribir un adaptador con tipo que admita este tipo de evento.

  • Si el desarrollador de software de adaptadores y el desarrollador de consultas no trabajan juntos (cada uno trabaja con su propia representación de un tipo de evento común), la validación de una comparación entre sus tipos de evento respectivos se producirá en el tiempo de enlace de la consulta. El enlace será correcto si son iguales.

  • Si el desarrollador de consultas no tiene acceso al ensamblado del adaptador ni al servidor de StreamInsight donde está registrado el adaptador, puede determinar el tipo de evento consultando la literatura del producto para el adaptador o a través del conocimiento común de protocolos de transferencia de datos específico del dominio (por ejemplo, Financial Information Exchange (FIX) o Reuters Market Data System (RMDS) en comercio financiero).

Tipos de datos compatibles

En StreamInsight, cada campo y expresión de evento tiene un tipo de datos específico. StreamInsight admite los siguientes tipos de datos. Las cargas de evento también pueden contener tipos anidados que estén compuestos de estos tipos de datos.

Nombre corto

Clase .NET

Tipo

Ancho en bits

Rango

byte

Byte

Entero sin signo

8

De 0 a 255

sbyte

Sbyte

Entero con signo

8

De -128 a 127

byte[]

Byte[]1

byte

 

 

int

int32

Entero con signo

32

De -2.147.483.648 a 2.147.483.647

uint

uint32

Entero sin signo

32

De 0 a 4294967295

short

int16

Entero con signo

16

De -32.768 a 32.767

ushort

uint16

Entero sin signo

16

De 0 a 65535

long

int64

Entero con signo

64

De -9223372036854775808 a 9223372036854775807

ulong

uint64

Entero sin signo

64

De 0 a 18446744073709551615

float

Single

Tipo de punto flotante y precisión simple

32

De -3,4 × 1.038 a +3,4 × 1.038

double

Double

Tipo de punto flotante y precisión doble

64

De ±5,0 × 10−324 a ±1,7 × 10308

decimal

Decimal

Tipo entero o fraccionario preciso que puede representar números decimales con 29 dígitos significativos

128

De ±1,0 × 10e−28 a ±7,9 × 10e28

bool

Boolean

Tipo booleano lógico

8

true o false

datetime

DateTime

Fechas y horas con valores situados entre las 00:00:00 del 1 de enero de 0001 Anno Domini (Era Común) y las 23:59:59 del 31 de diciembre de 9999 A.D. (E.C.)

 

 

timespan

TimeSpan

El número de tics que igualan el intervalo de tiempo representado. Un tic es igual a 100 nanosegundos

 

Tics Int64.MinValue a tics Int64.MaxValue

guid

guid

Identificador único global

128

 

char

Char

Carácter Unicode

16

U+0000 a U+ffff

string

String1

Secuencia de caracteres Unicode

 

 .

1 No incluye el tipo que acepta valores NULL.

Durante el desarrollo del adaptador, las marcas de tiempo de evento se especifican utilizando el tipo DataTimeOffset. Sin embargo, en la definición de los campos de carga del tipo de evento solamente se admite el tipo DateTime. En los casos en los que importa datos de tipo DateTimeOffset en un campo de evento, debe convertir los datos a DateTime de tipo UTC. Por ejemplo, un campo de carga se puede rellenar desde una base de datos de SQL Server o mediante la copia de los campos de marca de tiempo del evento en campos de carga para el cálculo.

Vea también

Conceptos

Crear adaptadores de entrada y de salida

Conceptos de servidor de StreamInsight

Ejemplo integral de StreamInsight