StreamInsight 伺服器概念

本主題描述從 StreamInsight 伺服器呈現、操作、帶領及傳輸資料的方式。其設計目的是要讓您熟悉與 Microsoft StreamInsight 中的複雜事件處理相關聯的基本概念。本主題一開始會描述資料結構,然後描述操作或處理資料的 StreamInsight 伺服器元件。

資料流

StreamInsight 中的所有資料都會組織成資料流。每一個資料流都會描述隨著時間變更而且可能無盡的資料集合。例如,股票即時看板資料流會提供交易內隨著時間變更的不同股價,而溫度感應器資料流則會提供感應器在一段時間所報告的溫度值。

假設在電力監控的案例中,其目標是要監控功率計的集合 (測量各種裝置的耗電量)。這些功率計會定期傳輸包含耗電量的資料 (單位為十瓦特) 及讀取的關聯時間戳記。下表顯示 3 個計量器中的功率計讀取量,並假設每一個功率計每秒發出一次電力讀取。

時間

MeterID

耗電量

2009-07-27 10:27:23

1

100

2009-07-27 10:27:24

1

200

2009-07-27 10:27:51

2

300

2009-07-27 10:28:52

2

100

2009-07-27 10:27:23

3

200

因為這項資訊可以表示為隨著時間變更的值,所以資料可以在資料流中表示。在提供這個資料流中的資料時,針對這個資料流所做的查詢可能會傳回在給定期間具有最高或最低耗電量值的計量器,或者查詢可能會傳回一段期間的最高耗電量的前 10 大計量器清單。

事件

資料流中表示的基礎資料會封裝到事件中。事件是 StreamInsight 伺服器所處理的基本資料單位。每一個事件都是由下列部分所組成:

  • 標頭。事件標頭包含可定義事件種類的中繼資料以及可定義事件之時間間隔的一個或多個時間戳記。時間戳記是以應用程式為根據,而且是由資料來源所提供,而不是 StreamInsight 伺服器所提供的系統時間。請注意,時間戳記會使用 DateTimeOffset 資料類型,此類型可感知時區,而且是根據 24 小時制。StreamInsight 伺服器會將所有時間正規化成 UTC 日期時間,並驗證輸入中的時間戳記欄位上有設定 UTC 旗標。

  • 裝載。保存與事件相關聯之資料的 .NET 資料結構。裝載中定義的欄位為使用者所定義,其類型是以 .NET 類型系統為基礎。

當資料流中事件的應用程式時間戳記會對應到事件抵達查詢的順序時,這些事件就稱為「按照順序」。如果不是這種情況,這些事件則稱為「不按順序」。StreamInsight 伺服器會保證當事件不按順序抵達時,查詢的輸出會與按照順序抵達的事件相同,除非查詢寫入者明確指定不同的情況。資料流中的一般事件到達模式如下:

  • 穩定的速率 (例如來自檔案或資料表中的記錄)。

  • 間歇和隨機速率 (例如零售條碼掃描器中的資料)。

  • 突然爆發的間歇速率 (例如網頁點選或天氣測量)。

事件標頭

事件的標頭會定義事件種類以及事件的暫時屬性。

事件種類

事件種類指出事件為資料流中的新事件,還是它會宣告資料流中現有事件的完整性。StreamInsight 可支援兩種事件種類:INSERT 和 CTI (目前的時間增量)。

INSERT 事件種類會將事件及它的裝載加入到事件資料流。除了裝載以外,INSERT 事件的標頭也會識別事件的開始和結束時間。下圖顯示 INSERT 事件種類的配置。

標頭

裝載

Event kind ::= INSERT

StartTime ::= DateTimeOffset

EndTime ::= DateTimeOffset

Field 1 … Field n (當做 CLR 類型)

CTI 事件種類是特殊的標點符號事件,可指出資料流中現有事件的完整性。CTI 事件結構是由提供目前時間戳記的單一欄位所組成,而 CTI 事件有兩種目的:

  1. 首先,它會讓查詢接受及處理事件,這些事件的應用程式時間戳記不會對應到事件抵達查詢的順序。當發出 CTI 事件時,它會向 StreamInsight 伺服器指示,沒有後續的內送 INSERT 事件將會修改 CTI 時間戳記之前的事件記錄。也就是在發出 CTI 事件之後,沒有任何 INSERT 事件的開始時間可以早於 CTI 事件的時間戳記。事件資料流的「完整性」指示可讓 StreamInsight 伺服器釋出視窗化或是已經累積狀態的其他彙總運算子的結果,以確保事件可以在系統中有效率地流動。

  2. CTI 事件的第二個目的是維護查詢的低延遲。經常性的 CTI 將會以更高的頻率將查詢提取到結果之外。

重要事項重要事項

如果 CTI 事件不存在輸入資料流中,查詢就不會產生任何輸出。

如需詳細資訊,請參閱<提前應用程式時間>。

下圖顯示 CTI 事件種類的配置。

標頭

Event kind ::= CTI

StartTime ::= DateTimeOffset

事件模型

此事件模型會根據其暫時特性來定義事件形狀。StreamInsight 可支援三種事件模型:間隔、點和邊緣。您可以將間隔事件視為最普通的類型,而將邊緣和點視為特殊案例。

間隔

間隔事件模型表示某個事件,其裝載對於給定的期間是有效的。間隔事件模型需要在事件中繼資料中提供事件的開始和結束時間。間隔事件只有在這個特定時間間隔中才有效。請務必注意,就事件裝載的有效性而言,開始時間會包含頭尾,而結束時間則不包含頭尾。

下圖顯示間隔事件模型的配置。

中繼資料

裝載

Event kind ::= INSERT

StartTime ::= DateTimeOffset

EndTime ::= DateTimeOffset

Field 1 … Field n (當做 CLR 類型)

間隔事件的範例包括電磁脈衝的寬度、拍賣出價的期間 (有效期間) 或是股價報價機的活動 (股價只在特定期間有效)。在上述的電力監控範例中,可以使用下列間隔事件來表示功率計的事件資料流。

事件種類

開始

結束

裝載 (耗電量)

INSERT

2009-07-15 09:13:33.317

2009-07-15 09:14:09.270

100

INSERT

2009-07-15 09:14:09.270

2009-07-15 09:14:22.255

200

INSERT

2009-07-15 09:14:22.255

2009-07-15 09:15:04.987

100

點事件模型會將事件的發生表示為單一時間點,點事件模型只需要事件的開始時間。StreamInsight 伺服器會推斷有效的結束時間,其方式是將刻度 (基礎時間資料類型的最小時間單位) 加入到開始時間,以設定事件的有效時間間隔。由於事件結束時間不包含頭尾,所以點事件只對其開始時間的單一時刻有效。

下圖顯示點事件模型的配置。

中繼資料

裝載

Event kind ::= INSERT

StartTime ::= DateTimeOffset

Field 1 … Field n (當做 CLR 類型)

點事件的範例包括計量器讀取、電子郵件的送達、使用者網頁點選、股價報價或是 Windows 事件記錄檔中的項目。在上述的電力監控範例中,可以使用下列點事件來表示功率計的事件資料流。請注意,結束時間計算為開始時間加上 1 刻度 (t)。

事件種類

開始

結束

裝載 (耗電量)

INSERT

2009-07-15 09:13:33.317

2009-07-15 09:13:33.317 + t

100

INSERT

2009-07-15 09:14:09.270

2009-07-15 09:14:09.270 + t

200

INSERT

2009-07-15 09:14:22.255

2009-07-15 09:14:22.255 + t

100

邊緣

邊緣事件模型表示一種事件的發生,其裝載對於給定時間間隔有效。但是,在抵達 StreamInsight 伺服器之後只會知道開始時間,所以結束時間會設定為未來的最大時間,之後才會知道事件的結束時間並予以更新。邊緣事件模型包括兩個屬性:發生時間和邊緣類型。這兩個屬性結合在一起會定義邊緣事件的開始或結束點。 

下圖顯示邊緣事件模型的配置。

中繼資料

裝載

Event kind ::= INSERT

Edge time ::= DateTimeOffset

Edge type ::= START | END

Field 1 … Field n (當做 CLR 類型)

邊緣事件的範例有 Windows 處理序、Windows 事件追蹤 (ETW) 中的追蹤事件、Web 使用者工作階段或是類比信號的量化。邊緣事件裝載的有效時間間隔就是開始事件的時間戳記與結束事件的時間戳記之間的差異。在下圖中,請注意裝載值為 'c' 的事件在這個時間點沒有已知的結束日期。

事件種類

邊緣類型

開始時間

結束時間

裝載

INSERT

開始

t0

DateTimeOffset.MaxValue

a

INSERT

結束

t0

t1

a

INSERT

開始

t1

DateTimeOffset.MaxValue

b

INSERT

結束

t1

t3

b

INSERT

開始

t3

DateTimeOffset.MaxValue

c

依此類推

下圖顯示如何根據上表定義的開始和結束時間,使用邊緣事件來將類比信號量化。這類連續信號表示對於每一個新的值而言,都必須提交 END 以及 START 邊緣。圖中所述的邊緣會參考從 t1 到 t3 這段時間的事件。

邊緣事件圖例

與選擇事件模型有關的效能考量

請務必針對您的問題選擇正確的事件模型。例如,如果您有持續一段時間的事件,而且您的應用程式能夠判斷事件的開始和結束時間,建議您最好使用間隔事件來建立這種情況的模型。當事件抵達時,如果您不知道事件的結束時間,就可以考慮將事件模型化成點事件、更改其存留期間以延長一段時間,然後在辨識出該事件的結尾時,使用裁剪作業來修改存留期間。其他可考慮的替代方案是將這些事件模型化成邊緣事件。

雖然邊緣事件是非常方便的事件模型,不過您應該注意一些效能影響。當邊緣事件完全按照順序抵達時,處理這些事件的效果最佳。也就是說,所有開始邊緣都按照開始時間排列順序,而結束邊緣都按照結束時間排列順序,而且事件的結合序列也按照時間排列順序。例如,如果您有一個邊緣事件的序列,如下所示:

事件種類

邊緣類型

開始時間

結束時間

裝載

INSERT

開始

1

DateTimeOffset.MaxValue

a

INSERT

結束

1

10

a

INSERT

開始

3

DateTimeOffset.MaxValue

b

INSERT

結束

3

6

b

INSERT

開始

5

DateTimeOffset.MaxValue

c

INSERT

結束

5

20

c

這個序列沒有按照時間戳記排列順序 (1, 10, 3, 6, 5, 20)。不過,如果邊緣事件完全按照順序 (如同 (1, 3, 5, 6, 10, 20)),就會對查詢處理產生較小的效能影響。您可以輕易地達成先啟用這類排序,然後再處理的方式。請將問題分割成兩個查詢。第一個查詢可以是空白查詢,這個查詢會接收邊緣事件做為輸入、完全排列這些事件的順序,然後輸出這些已排序的邊緣事件。第二個查詢可以採用此輸入並執行主要邏輯。請注意,您應該將這些查詢定義為兩個個別的查詢,然後使用動態查詢撰寫,將它們聯結在一起。如需詳細資訊,請參閱<在執行階段撰寫查詢>。

事件裝載

事件的裝載為包含與事件相關聯之資料的 .NET 資料結構。裝載中的欄位為使用者所定義,而其類型則是根據 .NET 類型系統。裝載欄位可支援大多數的 CLR 純量和基礎類型,巢狀類型則不受支援。

配接器

配接器會將內送和外寄事件資料流與 StreamInsight 伺服器之間來回轉譯及傳遞。StreamInsight 提供高彈性的配接器 SDK,可讓您為網域特有的事件來源和輸出裝置 (接收) 建立配接器。配接器是使用 C# 程式語言所實作,而且會儲存為組件。配接器類別會在設計階段中建立為範本、在 StreamInsight 伺服器中註冊,並在執行階段於伺服器中具現化為配接器執行個體。

輸入配接器

輸入配接器執行個體會接受來自外部來源 (如資料庫、檔案、即時看板摘要、網路連接埠、感應器等) 的內送事件資料流。輸入配接器會使用所提供的格式來讀取內送事件,並將這些資料轉譯為可由 StreamInsight 伺服器取用的事件格式。

您可建立輸入配接器來處理資料來源的特定事件來源。如果事件來源只產生單一事件類型,配接器可以具有類型。也就是說,可以實作它來發出某個特定事件類型的事件。有了具類型的配接器,配接器的所有執行個體都會產生相同的固定裝載格式,這樣會事先知道欄位的數目和其類型。這類事件的範例有特定裝置所發出的即時看板摘要資料或感應器資料。如果事件來源在不同情況下發出不同的類型,也就是說,事件可能包含不同的裝載格式或者可能無法事先知道裝載格式,請實作不具類型的配接器。有了不具類型的一般配接器,查詢繫結期間會將事件裝載格式提供給配接器 (當做組態規格的一部分)。這類事件的範例包括 CSV 檔案 (其中包含變動的欄位數,其中儲存於檔案內的資料類型要等到查詢具現化時間之後才會知道) 或是 SQL Server 資料表的配接器 (所產生的事件取決於資料表的結構描述)。請務必注意一件事,單一配接器執行個體 (不論具不具備類型) 一定會發出一個特定類型的事件。不具類型的配接器會提供彈性實作方式在查詢繫結時接受事件類型的規格,而不是在實作配接器時定義事件類型。

輸出配接器

您可建立輸出配接器來接收 StreamInsight 伺服器所處理的事件、將事件轉譯成輸出裝置 (接收) 所預期的格式,並將資料發出到該裝置。設計及建立輸出配接器類似於設計及建立輸入配接器。具類型的輸出配接器是針對特定的事件裝載所設計,而不具類型的輸出配接器則只會在具現化查詢時,於執行階段與事件類型一起提供。

如需詳細資訊,請參閱<建立輸入和輸出配接器>。核心配接器 API 會提供最大的彈性來針對任何事件來源或事件接收實作。此外,StreamInsight 支援位於較高抽象層級且實作 IObservable 或 IEnumerable 介面的事件來源和接收。如需詳細資訊,請參閱<使用可觀察與可列舉事件來源和事件接收 (StreamInsight)>。

處理及分析事件

有了 StreamInsight,就可以根據您所定義的查詢邏輯將事件處理組織成查詢。這些查詢可能需要無限期地供給時間緊迫的輸入資料 (記錄或即時)、執行資料的某些計算,並以適當的方式來輸出結果。

查詢範本

查詢範本是查詢撰寫的基本單位。它是定義持續分析及處理事件所需之商務邏輯的結構,這些資料已經從輸入配接器提交給 StreamInsight 伺服器並產生由輸出配接器所取用的事件資料流。例如,您可能會想要評估一段給定期間的內送耗電量事件,以找出超過您所建立之某些臨界值的最大值或最小值。

您可撰寫查詢範本來執行特定的工作單位,然後將其撰寫成比較複雜的查詢範本。查詢範本會使用與 C# 語言結合的 LINQ 來撰寫。LINQ 是一種語言平台,可讓您依照與主機語言完全整合的方式來表達資料集的宣告式計算。如此可讓您能夠在相同的開發平台中,將事件的宣告式處理結合程式設計的彈性,而不用擔心這兩種程式設計典範之間的阻抗不符情形。

StreamInsight 伺服器提供下列功能來撰寫易懂的查詢和分析:

  • 導入其他事件屬性的計算

    使用類似單位轉換的案例需要在您收到的事件上層執行計算。在 StreamInsight 伺服器中使用投射作業時,您可以在裝載中加入其他欄位,並針對輸入事件中的欄位執行計算。如需詳細資訊,請參閱<投射>。

  • 篩選事件

    在類似警示通知的案例中,您可能會想要檢查某個裝載欄位是否超過您所監視之設備的操作臨界值。一般來說,在這些使用案例下,只有滿足某些特性的事件子集才是相關的。沒有這些特性的事件不需要進行處理,所以可以捨棄。篩選作業可讓您表達事件裝載的布林述詞,並捨棄不滿足這些述詞的事件。如需詳細資訊,請參閱<篩選>。

  • 群組事件

    假設有一個事件資料流可讀取所有溫度感應器的溫度。如果透過單一事件資料流提供所有事件,您可能會想要根據感應器位置或感應器識別碼來分割內送事件。StreamInsight 伺服器會提供群組作業,讓您根據事件屬性 (如位置或識別碼) 分割內送資料流,然後將其他作業或完整查詢片段個別套用到每一個群組。如需詳細資訊,請參閱<群組及套用>。 

  • 一段時間的視窗

    群組一段時間的事件是一個啟用多種案例的強大概念。例如,您可能會想要檢查在修正的期間發生的失敗數目,並在其超出臨界值時引發警示。跳動和滑動視窗可讓您定義事件資料流的視窗來執行這種分析。如需詳細資訊,請參閱<使用事件視窗>。

  • 彙總

    當您不在乎每一個單一事件時,您可能會想要改為查看彙總值 (例如平均值、總和或計數)。StreamInsight 伺服器會針對通常在一段時間操作的 sum、count、min、max 和 average 來提供內建彙總。如需詳細資訊,請參閱<彙總>。

  • 識別前 N 大候選項目

    當您想要根據事件資料流中的特定度量來識別排名最高的候選事件時,需要特殊種類的彙總作業。TopK 作業可讓您根據您對資料流中的事件欄位所建立的順序來檢查這些項目。如需詳細資訊,請參閱<TopK>。

  • 比對不同資料流中的事件

    常見的使用案例需要理解接收自多個資料流的事件。例如,因為事件來源會在其事件資料中提供時間戳記,所以您可能會想要確定,您只會將一個資料流中的事件與第二個資料流中的事件比對 (如果兩者具有緊密的時間相關性)。此外,您對於要比對的事件及比對的時間可能會有其他限制。StreamInsight 伺服器會提供強大的聯結運算來執行這兩種工作:首先,它會比對兩個來源的事件,看看兩者的時間是否重疊,然後,它會執行在裝載欄位上指定的聯結述詞。這類比對的結果包含了第一個和第二個事件的裝載。如需詳細資訊,請參閱<聯結>。

  • 將不同資料流中的事件結合到一個資料流

    多個資料來源可能會提供您想要注入相同查詢中的相同類型事件。StreamInsight 伺服器所提供的聯集運算可讓您將多個輸入資料流多工處理到單一輸出資料流。如需詳細資訊,請參閱<聯集>。

  • 使用者定義延伸模組

    StreamInsight 伺服器的內建查詢功能可能不足以在所有案例中使用。若要允許網域特有的延伸模組,StreamInsight 伺服器中的查詢可以叫用透過 .NET 組件提供的使用者定義功能。除了使用者定義函數以外,您也可以定義及實作自訂彙總或查詢運算子。如需詳細資訊,請參閱<使用者定義函數>和<使用者定義彙總和運算子>。

如需詳細資訊,請參閱<以 LINQ 撰寫查詢範本>。如需有關針對 StreamInsight 撰寫 LINQ 查詢的詳細指引,請參閱 StreamInsight 查詢漫遊指南

查詢執行個體

將查詢範本與特定輸入和輸出配接器繫結時,便會在 StreamInsight 伺服器中註冊查詢執行個體。您可以在 StreamInsight 伺服器中啟動、停止及管理繫結的查詢。一旦資料透過輸入配接器引進 StreamInsight 伺服器之後,可能會持續針對資料執行計算。換句話說,當個別事件送達伺服器時,這些事件會由常設查詢所處理,這些查詢會發出輸出事件來回應輸入事件的送達。下圖顯示執行階段的 StreamInsight 查詢和配接器。當輸入配接器執行個體繫結到查詢執行個體時,StreamInsight 伺服器會取用及處理事件。然後處理過的資料會發送到與相同查詢執行個體繫結的輸出配接器執行個體。

查詢與配接器生態系統

請參閱

概念

StreamInsight 伺服器架構

StreamInsight 端對端範例