Partager via


Déploiement des entités StreamInsight sur un serveur StreamInsight

 

Les entités StreamInsight fonctionnent dans une StreamInsight qui s'exécutent sur un serveur StreamInsight. Un programme StreamInsight peut incorporer et utiliser un serveur StreamInsight intra-processus, ou se connecter à un serveur distant qui peut être partagé par plusieurs clients. Si vous avez configuré un service hôte Windows de StreamInsight lors de l'installation de StreamInsight, vous pouvez vous connecter à ce service qui joue le rôle de serveur distant. En outre, un programme StreamInsight peut exposer un point de terminaison pour un serveur incorporé pour le rendre accessible à d'autres programmes clients. Pour plus d'informations sur la configuration d'un serveur StreamInsight, consultez Publication et connexion au serveur StreamInsight.

Que le serveur soit incorporé ou distant, un client définit une entité (source, récepteur, objet ou liaison) localement et peut ensuite la déployer sur le serveur. Une fois les entités déployées, un client connecté au serveur peut obtenir un handle pour une entité déployée et lier et exécuter les entités du serveur.

Exemple

Par exemple, supposons que nous disposons de trois StreamInsight et d'un serveur distant. Notez que le serveur distant peut être un service hôte Windows de StreamInsight, comme illustré dans la Figure 1, ou il peut s'agir d'un serveur incorporé dans un programme StreamInsight qui a exposé un point de terminaison pour le serveur, comme illustré dans la Figure 2. Un client qui se connecte au point de terminaison du serveur n'a pas besoin de connaître le modèle de déploiement de serveurs utilisé. Pour plus d'informations, consultez Modèles de déploiement du serveur StreamInsight.

3 clients et un serveur distant
Figure 1 : Trois clients StreamInsight et un serveur distant

Serveur distant dans un serveur incorporé
Figure 2 : Serveur distant en tant que serveur incorporé avec un point de terminaison exposé

Définir une entité

Client 1 définit une source de données qui sera déployé ultérieurement sur le serveur. Dans cet exemple, la source est une simple série de nombres :

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

Client 1 crée la source
Figure 3 : Source définie par Client 1

DefineEnumerable, DefineObservable et DefineStreamable sont des méthodes utilisées pour définir des expressions destinées à être évaluées par le serveur ; la source de données est définie localement et n'existe que sur le client à ce stade.

Déployer une entité sur le serveur

Client 1 déploie ensuite l'entité composée sur le serveur, comme indiqué dans la Figure 4. L'entité doit être nommée lors de son déploiement, ce qui permet à d'autres clients de la détecter et de la gérer.

mySource1.Deploy("serverSource");  

Client 1 déploie la source sur le serveur
Figure 4 : Source déployée sur le serveur

Le déploiement de la source sur le serveur place une copie de la définition de la source sur le serveur où d'autres clients peuvent l'utiliser.

Obtenir un handle à une entité de serveur

Comme indiqué dans la Figure 5, Client 2 construit maintenant un handle à la source déployée en utilisant une méthode get :

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

Client 3 obtient serverSource
Figure 5 : Client 2 obtient un handle à la source sur le serveur

L'instance IQbservable<int> retournée par GetObservable est un handle pour la source sur le serveur, même si aucune connexion réelle au serveur n'est établie lors de la création du handle. La tentative de connexion a lieu lorsque les données sont prêtes à être générées à partir de la source, par exemple lorsque vous exécutez une liaison. Le processus échoue si l'entité n'existe plus lors de l'exécution de la liaison.

Lier et exécuter des entités

Un client peut définir une liaison qui peut être déployée et exécutée sur le serveur. Par exemple, dans la Figure 6, Client 3 définit et déploie un récepteur sur le serveur et utilise et obtient une méthode pour créer un handle à la source existante sur le serveur :

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

Client 3 supprime serverSource sur le serveur
Figure 6 : Client 2 définit un récepteur et obtient un handle d'une source sur le serveur

Client 3 peut maintenant définir une liaison de la source et du récepteur et crée un processus en cours d'exécution nommé qui exécute la liaison sur le serveur, comme indiqué dans la Figure 7. La liaison elle-même n'est pas stockée sur le serveur, elle identifie juste la connexion entre les entités source et récepteur sur le serveur. Client 3 crée une liaison à l'aide du handle pour la définition de source sur le serveur et la définition du récepteur local :

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

Client 3 peut également créer la liaison et l'exécuter en une étape.

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

Client 2 crée et déploie la source et le récepteur sur le serveur
Figure 7 : Client 3 lie et exécute un processus sur le serveur

Les définitions de source et de récepteur sur le serveur sont utilisées pour créer le processus. Notez que lorsque vous utilisez un serveur distant comme dans cet exemple, le processus s'exécute dans le contexte du serveur distant. Les données ou procédures dont une source liée, une requête, un récepteur ou un objet ont besoin doivent être accessibles pour le serveur lors de l'exécution du processus.

Gérer une entité de serveur

Les entités peuvent être supprimées du serveur, comme indiqué dans la Figure 8, par un client qui connaît le nom de l'entité. Dans cet exemple, Client 3 a indiqué au serveur de supprimer serverSource en écrivant simplement le code suivant :

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

Client 2 lie et exécute le processus sur le serveur
Figure 8 : Client 3 supprime une entité sur le serveur

Notez que Client 2 possède toujours un handle pour l'entité sur le serveur. Si Client 2 tente d'utiliser le handle pour lier l'entité et exécuter un processus après la suppression de l'entité, le processus échoue. Les clients doivent tenir compte de cette possibilité lorsqu'ils utilisent les handles d'entité.

Créer un objet

Un client peut aussi créer un objet sur le serveur. Par exemple, un client peut créer un objet comme suit :

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

L'objet est créé sur le serveur nommé serverSubject et la variable locale mySubject est un handle à l'objet. Notez que lorsqu'une source ou un récepteur est déployé sur le serveur, un objet réel n'est pas créé, seule la définition de la source ou du récepteur est stockée sur le serveur. Toutefois, la création d'un objet crée un objet sur le serveur.

Un objet est une entité unique qui peut être liée aux sources et aux récepteurs, en utilisant les données des sources et en transmettant les données aux récepteurs.

Par exemple, Client 3 peut lier l'objet au récepteur défini plus tôt (en supposant que le récepteur n'a pas été supprimé comme dans l'exemple précédent) et exécuter un processus, comme indiqué dans la Figure 9 :

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

Client lie l'objet et le récepteur
Figure 9 : Client 3 lie l'objet et le récepteur

Étant donné que l'objet n'est pas lié à une source, aucune donnée n'a encore été transmise au récepteur.

Ensuite, si Client 3 définit une requête q1 sur la source mySource3 :

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

Et lie l'objet à la requête, comme indiqué dans la Figure 10 :

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

Client lie l'objet à la source
Figure 10 : Client 3 lie l'objet à la source

À ce stade, les données commencent à circuler de la source via la requête vers l'objet, puis de l'objet vers le récepteur.

Une liaison supplémentaire peut être ajoutée à l'objet, comme indiqué dans la Figure 11 :

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

Client lie l'objet à une autre source
Figure 11 : Client 3 lie l'objet à une autre source

Dans cet exemple l'objet reçoit des données de deux requêtes différentes provenant de la même source et envoie les données combinées au récepteur. En outre, plusieurs sources et récepteurs peuvent être liés et exécutés en utilisant le même objet.

Voir aussi

Publication et connexion au serveur StreamInsight
Modèles de déploiement du serveur StreamInsight
Concepts de StreamInsight