將 StreamInsight 實體部署至 StreamInsight 伺服器

 

StreamInsight 實體會在 StreamInsight 伺服器中執行的 StreamInsight 應用程式內運作。 StreamInsight 程式可以在同處理序內嵌及使用 StreamInsight 伺服器,或者它可以連接到遠端伺服器,該遠端伺服器可以讓多個用戶端共用。 如果您在安裝 StreamInsight 時設定 StreamInsight 主機 Windows 服務,那麼就可以連接到做為遠端伺服器的該服務。 此外,StreamInsight 程式可以公開內嵌伺服器的端點,讓其他用戶端程式可以存取該伺服器。 如需設定 StreamInsight 伺服器的詳細資訊,請參閱<發行及連接到 StreamInsight 伺服器>。

無論是內嵌或遠端伺服器,用戶端都是在本機*「定義」(Define) 實體 (來源、接收、主旨或繫結),然後才有選項得以將它「部署」(Deploy) 在伺服器中。 部署實體之後,連接到伺服器的用戶端可以「取得」(Get) 所部署實體的控制代碼,然後在伺服器中「繫結」(Bind) 及「執行」*(Run) 實體。

範例

例如,假設我們有三個 StreamInsight 用戶端和一個遠端伺服器。 請注意,遠端伺服器可以是 StreamInsight 主機 Windows 服務 (如圖 1),或者可以是 StreamInsight 程式中的內嵌伺服器,該程式已公開伺服器的端點 (如圖 2)。 連接到伺服器端點的用戶端不需要注意所使用的伺服器部署模型。 如需詳細資訊,請參閱<StreamInsight 伺服器部署模型>。

3 個用戶端和遠端伺服器
圖 1:三個 StreamInsight 用戶端和一個遠端伺服器

遠端伺服器是內嵌的伺服器
圖 2:遠端伺服器是具有已公開端點的內嵌伺服器

定義實體

用戶端 1*「定義」*(Define) 資料來源,該資料來源稍後會部署至伺服器。 在本範例中,來源是一個簡單的數列:

IQbservable<int> mySource1 = app.DefineObservable(() => Observable.Range(0, 10));  

用戶端 1 建立來源
圖 3:由用戶端 1 定義的來源

DefineEnumerableDefineObservableDefineStreamable 都是方法,用來定義要由伺服器評估的運算式;資料來源是在本機定義,並只在此時存在於用戶端中。

將實體部署到伺服器

用戶端 1 接著將所撰寫的實體*「部署」*(Deploy) 至伺服器,如圖 4 所示。 部署實體時必須將它命名,這樣可讓其他用戶端能夠探索及管理它。

mySource1.Deploy("serverSource");  

用戶端 1 將來源部署到伺服器
圖 4:來源部署至伺服器

將來源部署至伺服器時會在伺服器中放置一份來源定義,供其他用戶端使用。

取得伺服器實體的控制代碼

如圖 5 所示,用戶端 2 現在使用*「取得」*(Get) 方法建構所部署來源的控制代碼:

var mySource2 = app.GetObservable<int>("serverSource");  

用戶端 3 取得 serverSource
圖 5:用戶端 2 取得伺服器中來源的控制代碼

GetObservable 所傳回的 IQbservable<int> 執行個體是伺服器中來源的控制代碼,在控制代碼建立的時候並沒有建立連到伺服器的實際連接。 當資料已經準備好要從來源產生時 (例如,當您執行繫結時) 才會試圖建立連接,如果您在執行繫結的時候實體已不存在,處理序就會失敗。

繫結及執行實體

用戶端可以定義繫結,該繫結可以在伺服器中部署及執行。 例如,在圖 6 中,用戶端 3 定義接收並將它部署至伺服器,並使用 Get 方法建立伺服器中現有來源的控制代碼:

  
var mySink3 = app.DefineObserver(() => Observer.Create<int>(x => Console.WriteLine(x)));  
mySink3.Deploy("serverSink");  
var mySource3 = app.GetObservable<int>("serverSource");  
  

用戶端 3 刪除伺服器上的 serverSource
圖 6:用戶端 2 定義接收並取得伺服器中來源的控制代碼

用戶端 3 現在可以定義來源和接收的繫結,並建立具名的執行處理序,該處理序會在伺服器中執行繫結,如圖 7 所示。 繫結本身並不會儲存在伺服器上,它只會識別伺服器上來源和接收實體之間的連接。 用戶端 3 使用伺服器中來源定義的控制代碼以及本機接收定義來建立繫結:

  
var binding = mySource3.Bind(mySink3);  
binding.Run("serverProcess");  
  

或者,用戶端 3 也可以一個步驟建立及執行繫結。

mySource3.Bind(mySink3).Run("serverProcess");  

用戶端 2 在伺服器上建立部署來源和接收
圖 7:用戶端 3 在伺服器中繫結及執行處理序

伺服器上的來源和接收定義會用來建立處理序。 請注意,使用遠端伺服器時 (如同本範例),處理序是在遠端伺服器的內容中執行,所繫結的來源、查詢、接收或主旨所需的任何資料或程序都必須在處理序執行時可供伺服器使用。

管理伺服器實體

知道實體名稱的任何用戶端都可以刪除伺服器上的實體,如圖 8 所示。 在本範例中,用戶端 3 只撰寫了下列程式碼就可以指示伺服器刪除 serverSource

app.Entities["serverSource"].Delete();  

用戶端 2 在伺服器上繫結和執行處理
圖 8:用戶端 3 刪除伺服器中的實體

請注意,用戶端 2 仍然具有伺服器中實體的控制代碼。 如果用戶端 2 在實體刪除之後試圖使用該控制代碼來繫結實體及執行處理序,處理序會失敗。 用戶端在使用實體控制代碼時需要考慮這個可能性。

建立主旨

用戶端也可以在伺服器上*「建立」*(Create) 主旨。 例如,用戶端可以建立如下的主旨:

var mySubject = app.CreateSubject<long,long>("serverSubject", () => new Subject<long>());  

主旨以名稱 serverSubject 在伺服器中建立,而區域變數 mySubject 則是該物件的控制代碼。 請注意,當來源或接收部署至伺服器時並不會建立實際物件,只會在伺服器中儲存來源或接收的定義。 不過,建立主旨時會在伺服器上建立物件。

主旨是一種獨特的實體,可以繫結至來源和接收,以取用來自來源的資料以及將資料傳遞至接收。

例如,用戶端 3 可以將主旨繫結至先前定義的接收 (假設該接收並沒有如同上一個範例一樣被刪除) 並執行處理序,如圖 9 所示:

mySubject.Bind(mySink3).Run("serverSubjectProcess1");  

用戶端繫結主旨和接收
圖 9:用戶端 3 繫結主旨和接收

因為主旨並未繫結至來源,所以尚未有任何資料流向接收。

接著假設用戶端 3 透過來源 mySource3 定義查詢 q1

  
var q1 = from x in mySource3  
         where x % 2 == 0  
         select x;  
  

並將主旨繫結至該查詢,如圖 10 所示:

q1.Bind(mySubject).Run("serverSubjectProcess2");  

用戶端依來源繫結用戶端
圖 10:用戶端 3 將主旨繫結至來源

此時資料會開始從來源經由查詢流至主旨,然後再從主旨流至接收。

您可以在主旨中加入其他繫結,如圖 11 所示:

  
var q2 = from y in mySource3  
         select y * 1000;  
q2.Bind(mySubject).Run("serverSubjectProcess3");  
  

依其他來源繫結的用戶端
圖 11:用戶端 3 將主旨繫結至其他來源

在本範例中,主旨透過相同來源從兩個不同的查詢中拿取資料,然後再將結合的資料傳送至接收。 此外,您還可以使用相同的主旨來繫結及執行多個來源與接收。

請參閱

發行及連接到 StreamInsight 伺服器
StreamInsight 伺服器部署模型
StreamInsight 概念