原文連結:http://blogs.msdn.com/b/masimms/archive/2010/07/23/secundus-posting-of-sorts.aspx
原文作者:Mark Simms,微軟SQL客戶諮詢小組進階程式經理。
(由於原文有一些過時的且不相關的話,我做了一些刪節和重寫,固將標題定為了“編譯”,而不是“翻譯”,兩者的區別可以見這裡。)
有段時間沒有在這裡發表新文章了(好吧,坦白說是很長時間沒發表了)。自從09年開始,我在微軟的角色就有了一些微妙的轉變。我將坐鎮SQL客戶諮詢小組(SQL Customer Advisory Team),負責利用StreamInsight技術協助客戶和夥伴更好地構建大規模的事件驅動應用。
隨著StreamInsight作為SQL Server 2008 R2的子集發布,我終於在結束幾個驚人的項目之後,空出了足夠的時間來談一談我們在這個產品中學到的最佳實務,同時也希望分享一些有價值的資訊來協助大家更好地構建自己的StreamInsight應用。
好吧,讓我們一起來看看StreamInsight 吧!
什麼是StreamInsight?
熟悉我或者聽過我演講的朋友都知道我愛打比方(雖然有的時候比方的很爛),這裡也不例外。注意:我這裡舉的例子都是人為設定的,文章後面我們會談到一些真實的情境。
假如我們要回答這麼一個問題——“有多少量紅色轎車停在你辦公室後面的停車場裡?”,那麼利用物理方式和關聯式資料庫的方式可以這麼回答:
|
物理方式 |
關聯式資料庫 |
- 帶著一個本子一支筆走到停車場;
- 步行穿過停車場,查看每一輛車;
- 如果該車是客車而且是紅色,在紙上作個記號;
- 統計所有的記號數量,回去辦公室。
|
- 串連目標資料庫;
- 執行SQL命令,如SELECT COUNT(*) FROM ParkingLot WHERE type = ‘AUTO’ AND color = ‘RED’ 。
|
非常直接的做法!我們可以繼續思考怎麼最佳化這個查詢,例如先把所有的車都停在停車場的一邊,然後根據顏色來安排停靠(在關聯式資料庫中,我們可以考慮增加一個索引)。可以看出對於此類問題,我們已經有了一個不錯的關聯式資料庫平台。然而,還有一類問題關聯式資料庫引擎並沒有能夠很好的進行處理。
假設現在的問題變為——“在最近的20分鐘內,高速公路上有多少量車經過了你的辦公室?”。類似地,我們分別採用物理方式和純粹的關聯式資料庫的方式來進行回答,那麼結果會是:
|
物理方式 |
關聯式資料庫 |
- 把高速公路上的車拖到一個候車區;
- 將每輛車扣留至少20分鐘,並記錄誰可以允許通過;
- 在每次有車進入或者離開時統計車輛數目。
|
- 將進入車輛記錄放入資料庫;
- 不斷執行如下的SQL命令,如SELECT COUNT(*) FROM ParkingLot WHERE type = ‘AUTO’ AND color = ‘RED’ ;
- 使用一個單獨的作業周期性的將車輛(記錄)移除資料庫。
|
可以看出,上面的兩個做法都不是回答這個問題的最佳辦法。StreamInsight正好填補了這個空白——它通過提供流處理平台可以有效處理大規模流資料。同樣的問題用StreamInsight來解決會是這樣:
|
物理方式 |
StreamInsight |
|
|
- 使用下面的LINQ語句來設定一個持續不斷啟動並執行查詢;
- 使用Streaminsight引擎將該查詢串連到不斷進入的車流事件上。
|
var x = from e in cars where e.Type == "AUTO" && e.Color == "RED" select e; var count = from e in x.HoppingWindow( TimeSpan.FromMinutes(2), TimeSpan.FromSeconds(30), HoppingWindowOutputPolicy.ClipToWindowEnd) select new { count = e.Count() };
上面的LINQ語句是一個StreamInsight查詢,它的操作過程如下:
- 查看包含待觀察車輛的流資料(cars流);
- 過濾掉任何不是AUTO(機動車)或不是RED(紅色)車輛的事件;
- 定義視窗時間查看最近的2分鐘事件,並將視窗以30秒的間隔向前移動;
- 在每一個視窗中,統計事件總數(也就是統計最近2分鐘內的紅色汽車數量),並報告總計。
額,等等,想知道LINQ是怎麼神奇的解決了傳輸中的資料問題的嗎?哈哈,這就是STreamInsight的神奇之處。它提供的平台包括了:
- 記憶體中的流處理引擎;
- 串連流資料來源(適配器)進行持續不斷的查詢;
- 詢問臨時資料和關聯資料(某個時間內的視窗,某個時間內的關聯關係),包括動態連結和組合查詢;
- 針對查詢(queries),操作符(operators),彙總(aggregates)和資料聯通性(data connectivity)的擴充。
StreamInsight有什麼用?
StreamInsight是設計用來協助使用者開發強有力的大規模事件處理應用。這也決定了它可以適用於許多不同的工業領域,例如:
|
製造業 |
- 車間樓層感應器的過程分析;
- 針對異常、趨向等發生時的裝置控制器響應;
|
|
金融服務 |
|
|
操作分析 |
|
|
公用事業 |
- 針對成千上萬電錶的智能電網分析;
- 識別趨向、使用模式和潛在出錯狀態;
|
基本上來說,StreamInsight適用於那些具有大量流資料且需要較低延隔時間得到處理結果的應用。
聽起來不錯,怎麼著手?
想要著手StreamInsight,你需要熟悉C#和LINQ,並且要有Visual Studio(2008或2010)。一旦把這些準備好,你就可以開始了:
- 從Microsoft 下載中心下載安裝StreamInsight 當前最新版本1.2;
- 64位安裝檔案 和 64位用戶端安裝檔案
- 32位安裝檔案 和 32位用戶端安裝檔案
註:用戶端檔案(Microsoft StreamInsight Client package)僅僅安裝Microsoft StreamInsight的一個子集,它僅允許使用者編寫用戶端相關的功能:串連已有的StreamInsight伺服器、管理查詢和使用調試工具。它不支援允許內建伺服器或建立StreamInsight服務。此外,安裝Microsoft StreamInsight Client不需要產品金鑰。
- 從codeplex下載參考範例到本機硬碟;
- 由於codeplex下載下來的檔案(網上下載的檔案大多如此)預設情況下是不可信的,你需要首先“解除鎖定”,然後再解壓檔案夾;
- 右擊StreamInsightProductTeamSamples壓縮包,點擊“屬性”,你會看到:
- 點擊“解除鎖定”。
- 從Visual Studio中開啟Applications\TrafficJoinQuery\TrafficJoinQuery.sln解決方案;
- TrafficJoinQuery應用使用類比的交通資料(就是方案套件含的那兩個.csv檔案),執行CreateQueryTemplate函數(在Program.cs檔案中)中列出的查詢;
- 按下F5鍵調試,應用程式會在兩個類比資料流上執行查詢,運行結果類似如下:
|
Creating CEP Server
Creating CEP Application
Registering LINQ query template
Registering Adapter Factories
Registering bound query
Start query
INSERT 6/25/2009 12:00:00 AM +00:00 1 1001 18
INSERT 6/25/2009 12:00:00 AM +00:00 1 1003 19
-- snip --
NSERT 6/25/2009 12:18:20 AM +00:00 2 1004 21
INSERT 6/25/2009 12:18:20 AM +00:00 2 1005 19
INSERT 6/25/2009 12:18:20 AM +00:00 2 1006 21
INSERT 6/25/2009 12:18:20 AM +00:00 3 1007 22
CTI 12/31/9999 11:59:59 PM +00:00
Diagnostic View for 'cep:/Server/EventManager':
AllEventsCount: 18
AllEventsMemory: 417792
Diagnostic View for 'cep:/Server/PlanManager':
-- snip --
QueryTotalIncomingEventCount: 497
QueryTotalConsumedEventCount: 497
QueryTotalProducedEventCount: 192
QueryTotalOutgoingEventCount: 192
-- snip -- |
以上顯示了StreamInsight引擎啟動、啟用查詢、輸出結果和最後的匯出診斷資訊的全部過程。
還有什麼學習資料?
接下去我會發表一系列的博文來討論如何構建StreamInsight應用的方方面面,包括適配器開發,查詢編寫,託管StreamInsight,串連到其他技術平台(如AppFabric Cache)等等。現在我先給出一些非常不錯的參考連結供您參考學習:
- StreamInsight產品部落格
- StreamInsight論壇
- MSDN的StreamInsight文檔
- StreamInsight查詢指南