2010-05-20 10 views
0

J'ai été chargé de créer un ensemble de services Web. Nous sommes un magasin Microsoft, donc je vais utiliser WCF pour ce projet. Il y a une considération de conception intéressante que je n'ai pas été en mesure de trouver une solution pour l'instant. Je vais essayer de l'expliquer avec un exemple:Besoin d'aide avec la conception WCF

Mon service WCF expose une méthode nommée Foo().

10 utilisateurs différents appellent Foo() à peu près en même temps.

J'ai 5 ressources spéciales appelées R1, R2, R3, R4 et R5. Nous n'avons pas vraiment besoin de savoir ce qu'est la ressource, à part le fait qu'une ressource particulière ne peut être utilisée que par un appelant à la fois. Foo() est responsable de l'exécution d'une action à l'aide de l'une de ces ressources spéciales. Donc, de manière circulaire, Foo() doit trouver une ressource qui n'est pas utilisée. Si aucune ressource n'est disponible, il doit attendre que l'un soit libéré. Dans un premier temps, cela semble être une tâche facile. Je pourrais peut-être créer un singleton qui garde la trace des ressources actuellement utilisées. Le gros problème est le fait que j'ai besoin de cette solution pour être viable dans un scénario de ferme web.

Je suis sûr qu'il existe une bonne solution à ce problème, mais je n'ai jamais rencontré ce scénario auparavant. J'ai besoin d'un outil de suivi/fournisseur de ressources qui peut être partagé entre plusieurs hôtes WCF.

Toutes les idées des architectes seraient grandement appréciées!

Répondre

3

Créez un autre service central que seuls les services Web connaissent. Ce service assume le rôle de gestionnaire de ressources. Tous les services Web de la batterie communiquent avec ce service central pour rechercher la disponibilité des ressources et pour extraire les ressources.

0

Vous pouvez suivre l'utilisation des ressources dans une table de base de données accessible à tous les serveurs de la batterie. Chaque ressource aurait un enregistrement dans la base de données, avec des champs indiquant si (ou depuis quand) elle est en cours d'utilisation. Vous pourriez avoir envie et mettre en œuvre une fonctionnalité de délai d'attente ainsi.

À des fins de dépannage, vous pouvez également enregistrer qui utilise la ressource. Si vous enregistrez lorsque chaque ressource est utilisée (dans une autre table), vous pourrez vérifier que votre round-robin fonctionne comme prévu, décider si vous devez ajouter d'autres copies de la ressource, etc.

0

Il existe un certain nombre d'approches pour résoudre ce problème, chacune avec ses propres coûts et avantages. Par exemple:

  • Utilisation de la file d'attente MSMQ pour toutes les demandes, les processus de travail tirent des messages de la file d'attente, passez à Rn et les réponses post retour à une file d'attente de réponse pour Foo d'envoyer à l'appelant approprié.
  • Utilisation d'un répartiteur de messages en mémoire ou localement persistant pour envoyer la requête suivante à un service sur boîte (par exemple via des tubes nommés pour perf) sur la base d'un algorithme de distribution de votre choix.

etc.Hélas, vous n'indiquez pas si vos requêtes doivent survivre à des coupures de courant, si elles doivent être transactionnelles, si les appelants sont également WCF, la rapidité avec laquelle ces appels seront reçus, le temps que prend Rn pour retourner avec les résultats, etc.

Quelle que soit la solution choisie, je vous encourage fortement à diviser votre appel à Foo() en une paire RequestFoo() et GetFooResponse() ou à implémenter un callback WCF hébergé par l'appelant pour recevoir les résultats de façon asynchrone . Si vous NE faites PAS cela, vous risquez de constater que l'ensemble de votre système s'arrêtera et que le second trafic dépassera le niveau de vos ressources pour satisfaire la charge de travail.