StreamInsight 서버에 StreamInsight 엔터티 배포

 

StreamInsight 엔터티는 StreamInsight 서버에서 실행되는 StreamInsight 응용 프로그램 내에서 작동합니다. StreamInsight 프로그램은 StreamInsight 서버 in-process를 포함 및 사용할 수 있으며 여러 클라이언트가 공유할 수 있는 원격 서버에 연결할 수도 있습니다. StreamInsight를 설치할 때 StreamInsight Host Windows 서비스를 구성하면 원격 서버의 역할을 하는 그 서비스에 연결할 수 있습니다. 또한 StreamInsight 프로그램은 포함된 서버에 대한 끝점을 표시하여 다른 클라이언트 프로그램에 액세스할 수 있습니다. StreamInsight 서버 구성에 대한 자세한 내용은 StreamInsight Server 서버에 게시 및 연결를 참조하십시오.

서버가 포함되었거나 원격이거나 클라이언트는 엔터티(원본, 싱크, 주체 또는 바인딩)를 정의하며 서버에 배포할 수 있습니다. 엔터티가 배포된 후에 서버에 연결된 클라이언트는 배포된 엔터티에 대한 핸들을 가져오고 서버에 있는 엔터티를 바인딩실행할 수 있습니다.

예를 들어 세 개의 StreamInsight 클라이언트와 원격 서버가 있다고 가정합니다. 원격 서버는 그림 1과 같이 StreamInsight Host Windows 서비스이거나 그림 2와 같이 서버의 끝점을 표시하는 StreamInsight 프로그램 내에서 포함된 서버일 수 있습니다. 서버 끝점에 연결한 클라이언트는 사용한 서버 배포 모델에 대해 숙지할 필요가 없습니다. 자세한 내용은 StreamInsight 서버 배포 모델를 참조하십시오.

클라이언트 3대와 원격 서버
그림 1: 세 개의 StreamInsight 클라이언트 및 원격 서버

원격 서버가 포함된 서버임
그림 2: 표시된 끝점이 있는 포함된 서버인 원격 서버

엔터티 정의

Client 1은 나중에 서버에 배포될 데이터 원본을 정의합니다. 이 예에서는 원본이 숫자의 간단한 시퀀스입니다.

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

클라이언트 1이 원본을 생성함
그림 3: Client 1로부터 정의된 원본

DefineEnumerable, DefineObservableDefineStreamable은 서버에서 평가되는 식을 정의하는 데 사용되는 메서드입니다. 데이터 원본은 로컬로 정의되며 이 시점에는 클라이언트에만 정의됩니다.

서버에 엔터티 배포

그런 다음 Client 1은 그림 4에 표시된 것처럼 구성된 엔터티를 서버에 배포합니다. 엔터티는 배포될 때 명명되어야 하며 다른 클라이언트에 의해 가져오거나 관리할 수 있게 합니다.

mySource1.Deploy("serverSource");  

클라이언트 1이 원본을 서버에 배포함
그림 4: 원본이 서버에 배포됨

원본을 서버에 배포하면 원본 정의 복사본이 서버에 지정되어 다른 클라이언트도 사용할 수 있습니다.

서버 엔터티에 핸들 가져오기

그림 5에 표시된 것처럼 Client 2는 가져오기 메서드를 사용하여 배포된 원본에 핸들을 생성합니다.

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

클라이언트 3이 serverSource를 가져옴
그림 5: Client 2가 서버에 있는 원본에 핸들 가져오기

GetObservable에서 반환되는 IQbservable<int> 인스턴스는 핸들이 만들어질 시점에 서버 연결이 구축되지 않았음에도 서버에 있는 원본에 대한 핸들입니다. 예를 들어 바인딩을 실행할 때 원본으로부터 데이터가 생성될 준비가 되면 연결이 시도됩니다. 바인딩을 실행할 때 엔터티가 없을 경우 프로세스는 실행되지 않습니다.

엔터티 바인딩 및 실행

클라이언트는 배포될 수 있는 바인딩을 정의하고 서버에서 실행할 수 있습니다. 예를 들어 그림 6에서 Client 3은 싱크를 서버에 정의 및 배포하며 가져오기 메서드를 사용하여 서버에 있는 기존 원본에 핸들을 만듭니다.

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

클라이언트 3이 서버에서 serverSource를 삭제함
그림 6: Client 2가 싱크를 정의하고 서버에 있는 원본에 대한 핸들 가져오기

그림 7에서 표시된 것처럼 이제 Client 3은 원본 및 싱크 바인딩을 정의하고 서버에 있는 바인딩을 실행하는 명명된 실행 프로세스를 만들 수 있습니다. 바인딩 자체는 서버에 저장되어 있지 않으며 서버에 있는 원본 및 싱크 엔터티 간의 연결만 식별합니다. Client 3은 서버에 있는 원본 정의에 대한 핸들과 로컬 싱크 정의를 사용하여 바인딩을 만듭니다.

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

또는 바인딩을 만들어 하나의 단계에 실행할 수 있습니다.

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

클라이언트 2가 서버에 원본과 싱크를 만들어 배포함
그림 7: Client 3에서 서버에 있는 프로세스를 바인딩 및 실행

서버에 있는 원본 및 싱크 정의는 프로세스를 만드는 데 사용됩니다. 이 예에서와 같이 원격 서버를 사용할 때 프로세스는 원격 서버 컨텍스트 내에서 실행됩니다. 바인딩된 원본, 쿼리, 싱크 또는 주체가 필요한 모든 데이터 또는 프로시저는 프로세스가 실행될 때 서버에서 사용할 수 있어야 합니다.

서버 엔터티 관리

그림 8에 표시된 것처럼 엔터티 이름을 알고 있는 클라이언트에 의해 엔터티를 서버에서 삭제할 수 있습니다. 이 예에서 Client 3은 다음을 작성하기만 하면 서버에서 serverSource를 삭제하도록 지시합니다.

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

클라이언트 2가 서버에서 프로세스를 바인딩하여 실행함
그림 8: Client 3에서 서버에 있는 엔터티 삭제

Client 2에 서버에 있는 엔터티에 대한 핸들이 있습니다. 엔터티가 삭제된 후 Client 2가 핸들을 사용하여 엔터티를 바인딩하고 프로세스를 실행할 경우 프로세스는 실패합니다. 클라이언트는 엔터티 핸들로 작업할 때의 가능성에 대해 설명해야 합니다.

주체 만들기

또한 클라이언트는 서버에 있는 주체를 만들 수 있습니다. 예를 들어 다음과 같이 주체를 만들 수 있습니다.

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

서버에 있는 주체는 serverSubject라는 이름과 함께 만들어지며 지역 변수인 mySubject는 개체에 대한 핸들입니다. 원본 또는 싱크가 서버에 배포되면 실제 개체가 만들어지지 않으며 원본 또는 싱크 정의가 서버에 저장될 때만 개체가 만들어집니다. 그러나 주체를 만들면 개체를 서버에 만듭니다.

주체는 원본에서 데이터를 사용하고 싱크에 데이터를 전달하는 원본과 싱크에 모두 바인딩할 수 있는 고유 엔터티입니다.

예를 들어 그림 9에 표시된 것처럼 Client 3은 이전 예처럼 싱크가 삭제되지 않았다고 가정했을 때 주체를 미리 정의된 싱크에 바인딩하고 프로세스를 실행할 수 있습니다.

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

클라이언트가 주체와 싱크를 바인딩함
그림 9: Client 3에서 주체 및 싱크 바인딩

주체가 원본에 바인딩되지 않기 때문에 싱크에 데이터 흐름이 없습니다.

그런 다음 Client 3이 쿼리 q1을 원본 mySource3에 정의한다고 가정합니다.

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

그림 10에 표시된 것처럼 주체를 쿼리에 바인딩합니다.

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

클라이언트가 주체를 원본에 바인딩함
그림 10: Client 3에서 주체를 원본에 바인딩

이때 데이터는 쿼리를 통해 원본에서 주체로 이동되며 다음에는 주체에서 싱크로 이동됩니다.

그림 11에 표시된 것처럼 추가 바인딩이 주체에 추가될 수 있습니다.

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

클라이언트가 주체를 다른 원본에 바인딩함
그림 11: Client 3에서 주체를 다른 원본에 바인딩

이 예에서는 주체는 동일한 원본에 대한 두 개의 다른 쿼리에서 데이터를 가져오며 결합된 데이터를 싱크에 전송합니다. 동일한 주체를 사용하여 추가, 여러 원본 및 싱크를 바인딩 및 실행할 수 있습니다.

참고 항목

StreamInsight Server 서버에 게시 및 연결
StreamInsight 서버 배포 모델
StreamInsight 개념