Je suis nouveau dans les services de la WCF et je me demandais quelle serait la meilleure façon de traiter les problèmes suivants.
J’ai beaucoup de clients (~ 200 – ~ 500) qui font tous des demandes de mon service assez constamment pendant la journée de travail. La plupart des demandes impliquent l’interrogation d’une firebase database sous-jacente afin de renvoyer la réponse correcte.
Ce qui me préoccupe, c’est le nombre potentiel de connexions à la firebase database générées par les demandes entrantes. Si tous les clients font des demandes simultanées, le serveur de firebase database sera durement touché. J’aimerais éviter un nombre ridicule de connexions à la firebase database si possible.
Serait-il préférable de limiter le nombre de connexions simultanées au service WCF et donc de réduire par inadvertance le nombre possible de connexions de firebase database?
J’ai envisagé de faire du service un singleton qui génère des threads pour effectuer la transaction de firebase database afin que je puisse contrôler le nombre de threads, mais cela est-il excessif et une ressortingction des connexions au service suffit-elle?
Merci beaucoup pour tout conseil.
Comme Marcos l’a déjà mentionné, WCF dispose d’une fonction intégrée de limitation du service, que vous pouvez modifier sur le serveur. Cela évite que votre serveur de firebase database ne soit inondé de trop nombreuses demandes à la fois.
Les valeurs par défaut sont:
Consultez la documentation MSDN sur ServiceThrottlingBehavior pour plus de détails.
Cela signifie qu’un maximum de 16 appels sont traités simultanément par WCF – autrement dit, SI votre classe de service WCF autorise plusieurs appelants à la fois!
Contrairement à Marcos, je ne recommanderais pas de faire de votre classe de service WCF un singleton. La meilleure pratique courante consiste à avoir une classe de service WCF simple et à l’utiliser au cas par cas – chaque demande entrante obtiendra sa propre instance, totalement distincte et nouvellement créée de votre classe de service WCF – jusqu’à un maximum défini par le comportement de limitation du service et contrôlé par le runtime WCF.
Si vous faites de votre classe de service WCF un singleton, vous devez définir son paramètre ConcurrencyMode sur Multiple. Vous devez ensuite faire très attention de ne pas laisser deux threads simultanés de votre classe modifier les mêmes valeurs, l’un en dessous de l’autre. la programmation multi-threading en toute sécurité est un défi majeur! Sinon, vous ne définissez pas le mode d’access simultané sur Multiple, mais votre seule et même instance de classe de service WCF ne peut gérer les demandes que de manière sérielle, une à la fois, ce qui n’est pas très évolutif!
Un appel à la fois et une instance de service par demande constituent sans aucun doute le moyen le plus simple. Avec la limitation de service en place et le regroupement de connexions ADO.NET, vous obtenez un environnement très puissant et bien conçu!
Consultez également l’excellent article de Dan Rigsby sur la limitation du service de la WCF pour plus de détails.
Si vous utilisez ADO pour vous connecter à votre firebase database, il convient de fournir un mécanisme de regroupement des connexions afin que vous n’ayez pas à vous en occuper.
Veuillez lire cet article pour plus d’informations: Vue d’ensemble de la mise en commun de la connexion ADO.NET
Nous avons un scénario similaire et nous le résolvons en utilisant une seule connexion de notre WebService à la firebase database et en utilisant MARS de SqlServer qui fonctionne parfaitement et assez rapidement. Sql Server sait vraiment comment gérer les requêtes simultanées auxquelles vous ne devez pas penser.
Vous évitez ainsi les frais généraux d’ouverture et de fermeture des connexions (évidemment, le regroupement de connexions est utile dans ce cas)
Pensez également à append dans votre service Web quelque chose comme:
[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single, ConcurrencyMode = ConcurrencyMode.Multiple)]
Et dans la config:
Cette option est à l’intérieur
J’espère que cela t’aides 🙂