イベントの種類の作成
このトピックでは、イベントの種類の作成に関するガイドラインを示します。イベントの種類では、イベント ソースによってパブリッシュされるイベント、またはイベント シンクによって使用されるイベントを定義します。開発作業では、これらは単精度のプリミティブ型、.NET Framework のクラス、または構造として指定され、イベント ストリームの各イベントに関連付けられるデータ (ペイロード) を定義します。イベントの種類は、開発の次の段階で使用されます。
型指定されたアダプターの記述。型指定されたアダプターでは、イベントの種類を汎用パラメーターとして使用します。これにより、キューに格納する新しいイベント オブジェクトを作成するときに、適切な構造が初期化されるようにします。
クエリ テンプレートの記述。クエリ テンプレートは、CepStream オブジェクトの上位の LINQ で指定されます。定義はイベントの種類に基づきます。
イベントおよびイベント ストリームの詳細については、「StreamInsight サーバーの概念」を参照してください。
イベント構造の確認
イベント ペイロード (つまりペイロード内のフィールドの数とその種類) が固定され既知である場合、型指定されたアダプターを作成できます。型指定されたアダプターを使用すると、アダプターのすべてのインスタンスによって、同一の固定ペイロード形式が生成されます。これは通常、固定データ構造を持つイベント ソースの場合です。
型指定されたアダプターを作成する際は、固定ペイロードを表す .NET クラスまたは構造を定義します。また、イベント ペイロードを 1 つのフィールドで表すことができる場合は、プリミティブ型を使用します。構造またはクラスを使用する場合、ペイロード フィールドとして使用できるのは、パブリック フィールドとパブリック プロパティのみです。プライベート フィールド、プライベート プロパティ、およびクラス メソッドは無視され、イベントの種類では使用することができません。入力アダプターのイベントの種類にデータを設定する場合や、出力アダプター内の型指定されたイベントの種類から結果を取得する場合は、このイベントの種類の宣言を使用します。次の例では、int 型の 2 つのペイロード フィールドである 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") で暗黙的に定義された新しい種類を含むことができます。
ペイロード フィールドの要件
イベントの種類を作成する際は、次のペイロード フィールドの要件および機能を考慮してください。
イベント構造に、空のペイロード構造を使用することはできません。少なくとも 1 つのフィールドが必要です。
ペイロード フィールドには、.NET Framework のスカラー型と基本型、および入れ子になった型の両方を使用できます。後の「サポートされるデータ型」のセクションを参照してください。
フィールドは、カスタム属性を使用して変更することはできません。
StreamInsight サーバーのイベントの種類は、.NET 構造ではなくフィールドの順序付きリストですが、これでフィールドの順序が決まるわけではありません。イベント フィールドの順序は、型指定されていないアダプターにとって重要です。これらのアダプターでは、アダプターのデザイン時にフィールドが不明のため、ordinal を使用してフィールドにアクセスします。既定では、.NET 構造をイベントの種類として使用する場合、そのフィールドはフィールド名の辞書式順序に従って順序付けられます。
フィールドの NULL 値の許容属性が推定されます。たとえば、int? では NULL 値が許容されますが、int では許容されません。String 型および byte[] 型では常に NULL 値が許容されます。
byte[] の既定のサイズは 512 です。
文字列フィールドの最大長は、イベント全体のページ サイズ (16K バイト) によってのみ決定されます。
イベントのサイズ
イベントの種類で定義できるフィールドの数に、明示的な制限はありません。フィールドの数は、個別のフィールドの種類、サイズ、および NULL 値を許容するかどうかによって異なります。
StreamInsight サーバーのイベント ページ サイズは 16 K です。1 つのイベントが複数のページにわたることはできないため、(ペイロードおよびタイムスタンプ フィールドを含む) 実質的な最大イベント サイズは 16K からいくらかのオーバーヘッドを差し引いたものになります。ページ ヘッダーに起因する固定オーバーヘッドのほかに、イベント ヘッダー、およびシステム フィールド (タイムスタンプ、NULL 値許容など) により、上限に合わせて N/8 の形の可変オーバーヘッドが生じます。
イベント ページ使用率を最大にするには、次のガイドラインに従うことをお勧めします。
NULL 値許容フィールドを回避します。
string フィールドおよび byte[] フィールドの使用を最小限に抑えます。
エンジンでイベントの状態のために必要なメモリをより効率的に解放できるように、イベントの有効期間を各シナリオのセマンティクスで必要とされる間だけにします。
イベントの種類の検出可能性
イベントの種類が作成された後の次の手順は、依存するプロジェクトによる検出可能性を確実にすることです。.NET 環境では、疎結合分散方式でモジュールをビルドし、アセンブリとして配付する機能を開発者に提供します。こうした機能を利用することで、これらのアセンブリを対象として、結合して統合アプリケーションをビルドしたり、テストしたり、実稼働環境に配置したりすることができます。
クエリの入出力時に一致するイベントの種類に基づき、入力アダプターおよび出力アダプターのインスタンスを使用してクエリ テンプレートを正常にバインドすると、実行可能な StreamInsight クエリが得られることに注意してください。開発環境によっては、他のユーザーがイベントの種類にアクセスできるようにすることが必要になる場合があります。たとえば、アダプター開発者およびクエリ開発者が、各モジュールの作業を別々に行う必要が生じる場合があります。イベントの種類の検出可能性についての次のシナリオを考えてみましょう。
アダプター開発者がそのイベントの種類のパブリッシャーである場合は、StreamInsight マネージ API を使用してアダプターを作成し、.NET アセンブリを配布することができます。他の開発者は、ildasm.exe を使用するか Visual Studio プロジェクト内から DLL を参照して .NET アセンブリを調べ、イベントの種類を決定することができます。この方法を使用すると、イベントの種類にアクセスするために StreamInsight サーバーにアクセスする必要はなくなります。
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 ~ 4294967295 |
short |
int16 |
符号付き整数 |
16 |
-32,768 ~ 32,767 |
ushort |
uint16 |
符号なし整数 |
16 |
0 ~ 65535 |
long |
int64 |
符号付き整数 |
64 |
-922,337,203,685,477.5808 ~ 922,337,203,685,477.5807 |
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 桁の小数値を表す高精度の小数または整数型 |
128 |
±1.0 × 10e−28 ~ ±7.9 × 10e28 |
[bool] |
Boolean |
論理 Boolean 型 |
8 |
true または false |
datetime |
DateTime |
西暦 0001 年 1 月 1 日夜 0:00:00 から西暦 9999 年 12 月 31 日 11:59:59 P.M. までの値の日付および時刻 |
|
|
timespan |
TimeSpan |
表された時間間隔に等しいチック数。1 チックは 100 ナノ秒に等しい。 |
|
Int64.MinValue チック ~ Int64.MaxValue チック |
guid |
guid |
グローバル一意識別子 |
128 |
|
char |
Char |
Unicode 文字です。 |
16 |
U+0000 ~ U+ffff |
string |
String1 |
Unicode 文字のシーケンス |
|
. |
1 NULL 値を許容する型は含まれません。
アダプター開発時、イベント タイムスタンプは、DataTimeOffset 型を使用して指定されます。一方、イベントの種類のペイロード フィールドの定義でサポートされるのは、DateTime 型のみです。DateTimeOffset 型のデータをイベント フィールドにインポートする場合、データを UTC の種類の DateTime に変換する必要があります。たとえば、ペイロード フィールドを SQL Server データベースから設定することも、イベント タイプスタンプ フィールドをペイロード フィールドにコピーして計算させて設定することもできます。