2010-08-09 5 views
1

Je souhaiterais pouvoir hiérarchiser les données/messages sortants d'un service WCF.Comment hiérarchiser les messages sortants avec WCF

Voici le scénario de base:

  1. demandes client de serveur un flux de données. Le flux de données est actif, volumineux et potentiellement interminable (données de surveillance de l'équipement). Nous appellerons ce HighPriorityDataStream.
  2. Le client demande des données supplémentaires. Nous appellerons ce LowPriorityData.

La bande passante est limitée (pensez au modem commuté ou au satellite). Il est très important que le HigPriorityDataStream actuel ne soit pas interrompu ou retardé lorsqu'une requête pour LowPriorityData est faite.

Je dispose déjà d'un système hérité basé sur les sockets où cela est accompli en contrôlant manuellement l'ordre dans lequel les données sont placées dans le tampon socket. Les données haute priorité sont placées dans le tampon, et s'il reste de la place, des données de priorité inférieure sont ajoutées pour remplir le reste du tampon. J'essaie de réorganiser ce processus avec WCF ... Je ne connais pas de solutions prêtes à l'emploi et je pense que je devrais écrire un comportement de canal personnalisé, mais je voudrais choisir les cerveaux de la communauté avant que j'aille cette route :)

Répondre

0

Après beaucoup de farfouillé (merci Ladislav pour vos idées réfléchies), je suis venu à la conclusion que je pose la couche de communication pour résoudre un problème de couche buisness . Pour mieux décrire le problème, il existe plusieurs connexions et une source de données. La source de données doit prioriser les données qu'elle recueille à partir de ses propres sources de données (flux de données en direct et bases de données persistantes) et renvoyer les données aux différents clients en fonction de leur priorité. Pour être clair, les clients ont une priorité relative basée sur leur identité basée sur les rôles, les sources de données ont une priorité (préfèrent les données réelles sur les données persistantes) et les champs individuels dans une source de données ont un ordre de priorité (toutes choses égales par ailleurs). X doit toujours être envoyé avant le champ Y). C'est tout à fait la logique métier et la solution que nous avons adoptée comme un ensemble de files d'attente prioritaires qui ont automatiquement trié les éléments de données d'entrée en fonction de ces exigences de priorité, puis servi chaque requête dans cet ordre.

0

Je pense qu'il n'y a pas de solution générale prête à l'emploi. La solution dépend de vos autres exigences. Voulez-vous contrôler la bande passante par client ou par serveur entier (tous les clients)? Voulez-vous appeler une opération de priorité basse à partir du même proxy ou démarrez-vous un nouveau proxy pour une nouvelle opération? Voulez-vous exécuter plusieurs opérations prioritaires en même temps? Voulez-vous prioriser les demandes entrantes? La solution la plus simple attend que vous contrôliez la bande passante par client, vous réutilisez le même proxy pour tous les appels, une seule opération haute priorité peut être effectuée en même temps et les demandes sont traitées dans l'ordre FIFO. Que vous marquez simplement votre implémentation de service avec [ServiceBehavior (InstanceContextMode = InstanceContextMode.PerSession, ConcurrencyMode = ConcurrencyMode.Single)] (cela devrait être le paramètre par défaut pour les services exposés sur NET.TCP). Ces paramètres réutiliseront la même instance de service pour tous les appels provenant du même proxy client, mais un seul appel sera traité à la fois (les autres attendront dans la file d'attente jusqu'à ce qu'ils soient traités ou expirés).

Meilleures salutations, Ladislav

Questions connexes