建立事件類型
本主題提供建立「事件類型」(Event Type) 的指導方針。事件類型會定義事件來源所發行或事件接收 (Event Sink) 所取用的事件。在開發經驗中,它們會指定為單一基本類型、.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。
字串欄位的長度上限僅受制於整個事件的分頁大小,此值為 16 kb。
事件大小
可以在事件類型中定義的欄位數目並沒有明確的限制。欄位數目取決於個別欄位的類型、其大小以及 Null 屬性。
StreamInsight 伺服器中的事件分頁大小為 16K。因為事件無法橫跨多個分頁,所以 16K 減去某些負擔就是有效的事件大小上限 (包括裝載和時間戳記欄位)。除了頁首、事件標頭和系統欄位 (如時間戳記) 所造成的固定負擔以外,Null 屬性也會在 N/8 (調整為上限) 的順序中加入變動的負擔。
若要讓事件分頁使用率達到最高,建議您遵循下列指導方針:
避免可為 Null 的欄位。
將 string 和 byte[] 欄位的使用最小化。
只保留個別案例之語意所需的事件存留期間長度,以便更有效率地在引擎中釋出事件狀態所需的記憶體。
事件類型的發現能力
一旦建立事件類型之後,下一個步驟就是確保相依的專案發現它的能力。請注意,.NET 環境讓開發人員能夠以鬆散偶合的分散式方式來建立模組,並將模組當做組件來出貨。然後可以將這些組件放在一起,以建立整合式應用程式、加以測試並部署到實際環境中。
請記得,可執行的 StreamInsight 查詢是將查詢範本與輸入和輸出配接器的執行個體成功繫結在一起的結果 (根據查詢的輸入和輸出上相符的事件類型)。根據開發環境,您可能必須提供事件類型的存取權給其他人。例如,配接器開發人員和查詢開發人員可能必須獨立處理其各自的模組。假設事件類型的發現能力有以下的案例:
如果配接器開發人員是事件類型的發行者,此配接器開發人員就可以使用 StreamInsight Managed API 來撰寫配接器,然後傳送 .NET 組件。其他開發人員可以使用 ildasm.exe 或從 Visual Studio 專案內部參考 DLL,藉以在此 .NET 組件上反映,並且判斷事件類型。使用這種方法時,不需要 StreamInsight 伺服器的存取權就可以存取事件類型。
如果 StreamInsight 伺服器管理員是事件類型的發行者,此管理員或開發人員就可以在 StreamInsight 伺服器中部署事件類型。然後,擁有 StreamInsight 伺服器之存取權的查詢開發人員就可以使用適用的物件模型 API 呼叫來檢查中繼資料項目並判斷事件類型。配接器開發人員也可以撰寫支援這個事件類型的具類型的配接器。
如果配接器開發人員和查詢開發人員實際上已中斷連接 (每位人員都使用自己的一般事件類型表示),就會在查詢繫結時間內進行其個別事件類型是否相符的驗證。如果存在相符項目,繫結就會成功。
如果查詢開發人員沒有配接器組件或 StreamInsight 伺服器 (其中已註冊配接器) 的存取權,此開發人員就可以參考配接器的產品文宣,或是透過該領域特有的資料傳輸通訊協定的通用知識 (例如金融交易中的金融資訊交換 (FIX) 或是路透社市場資料系統 (RMDS)) 來判斷事件類型。
支援的資料類型
在 StreamInsight 中,每一個事件欄位和運算式都具有特定的資料類型。StreamInsight 可支援下列資料類型。事件裝載也可以包含組成這些資料類型的巢狀類型。
簡短名稱 |
.NET 類別 |
型別 |
寬度 (以位元為單位) |
範圍 |
byte |
Byte |
不帶正負號的整數 |
8 |
0 到 255 |
sbyte |
Sbyte |
帶正負號的整數 |
8 |
-128 到 127 |
byte[] |
Byte[]1 |
byte |
|
|
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 個有效位數之十進位數字的小數或整數類型 |
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 P.M.。 |
|
|
timespan |
TimeSpan |
等於表示之時間間隔的刻度數。一個刻度等於 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 資料庫填入裝載欄位,或是將事件時間戳記欄位複製到裝載欄位中進行計算。