2010-02-01 4 views
2

Je suis chargé de créer une application Web. J'utilise actuellement C# & asp.net (mvc - mais je doute que c'est pertinent à la question) - suis un développeur novice et un peu nouveau à. Une partie de la logique dans l'application im building consiste à envoyer des requêtes à un smsgateway externe en tapant une URL particulière avec une requête - soit dans le cadre d'une action initiée par l'utilisateur dans la webapp (peut-être deux ou trois). messages envoyés) ou dans le cadre d'une tâche planifiée exécutée tous les jours (pourrait et sera plusieurs milliers envoyer un message). En ce qui concerne une tâche quotidienne, je crains que boucler - disons - 10.000 fois dans un thread (surtout si im aussi de prendre des mesures en fonction de la réponse de la demande - comme écrire à un DB) n'est pas le meilleur stratégie et que je pourrais gagner un peu de performance/gain de temps d'une certaine parallélisation. En fin de compte j'ai plus peur que des milliers d'utilisateurs en même temps (très probable) exécuteront l'action qui déclenche une demande. Avec une implémentation naïve qui engendre une sorte de thread d'arrière-plan (quel que soit son nom) pour chaque requête, je crains un scénario avec des centaines/milliers de requêtes à la fois. Donc, si mes hypothèses sont correctes, comment puis-je gérer cela? dois-je générer manuellement un nombre approprié de nouveaux Thread() et coordonner leur travail à partir d'une file d'attente de type producteur/consommateur ou y a-t-il un moyen facile?Un bon moyen de gérer des milliers d'appels au service externe à partir de asp.net (mvc)

Vive

Répondre

3

Si vous devez faire 10.000 demandes à un service, cela signifie que l'API du service est anémique - probablement CRUD -based, conçu comme un wrapper mince sur une base de données au lieu d'un service réel. Une seule "demande" adressée à un service bien conçu devrait transmettre toutes les informations nécessaires pour effectuer une seule "unité de travail" - en d'autres termes, ces 10 000 demandes pourraient fort probablement être regroupées en une seule demande, ou moins une petite poignée de demandes. Cela est particulièrement important si les demandes sont envoyées à un serveur distant ou peuvent prendre beaucoup de temps (et 2-3 secondes est un extrêmement longtemps en informatique).

Si vous n'avez pas le contrôle sur le service, si vous n'avez pas la possibilité de changer la spécification ou l'API - alors je pense que vous allez trouver cela très difficile. Une seule machine ne peut tout simplement pas gérer 10 000 connexions sortantes à la fois; il se battra même avec quelques centaines. Vous pouvez essayer de paralléliser cela, mais même si vous augmentez le débit de dix fois, cela prendra encore une demi-heure, ce qui est le genre de tâche que vous ne voulez probablement pas faire sur un site web public (mais alors, peut-être que vous faites, je ne connais pas les détails). Peut-être que vous pourriez être plus précis sur l'environnement, l'architecture, et ce que vous essayez de faire?


En réponse à votre mise à jour (peut-être avoir des milliers d'utilisateurs tous effectuer une action en même temps que vous oblige à envoyer un ou deux messages SMS pour chaque):

Cela ressemble exactement le genre du scénario où vous devriez utiliser Message Queuing. En fait, il n'est pas trop difficile de configurer un solution using WCF. Certaines des principales raisons pour lesquelles on utilise une file d'attente de messages sont:

  • Il y a un grand nombre de messages à envoyer;
  • L'application émettrice ne peut pas se permettre de les envoyer de manière synchrone ou d'attendre une réponse quelconque;
  • Les messages doivent être livrés éventuellement par.

Et vos exigences s'adaptent comme un gant. Puisque vous êtes déjà sur la pile Microsoft, je recommanderais certainement un service WCF asynchrone soutenu par MSMQ.

+0

fait question un peu plus spécifique –

+0

im va recherche msmq. Entre-temps, je vais le signaler comme une réponse en reconnaissance de votre aide –

0

Si vous travaillez avec SOAP, ou une autre requête de type XML, vous ne pouvez pas avoir un problème concernant le niveau des demandes dans une boucle.

Je mis en place quelque chose de similaire en utilisant un serveur SOAP avec 4-5k requêtes sans problème ...

0

Une requête SOAP à un service Web (en supposant .NET 2.0 et supérieur) ressemble à quelque chose comme ceci:

WebServiceProxyClient myclient = new WebServiceProxyClient(); 

myclient.SomeOperation(parameter1, parameter2); 

myclient.Close(); 

Je suppose que ce code sera intégré dans votre logique métier que vous serez déclencher dans le cadre de l'action initiée par l'utilisateur ou dans le cadre de la tâche planifiée.

Vous n'avez pas besoin de faire quoi que ce soit de particulier dans votre code pour faire face à un grand nombre d'utilisateurs. Ce sera en fait une question d'écaillage sur votre plate-forme.

Quand vous dites 10.000 demande, que voulez-vous dire? 10.000 demande par seconde/minute/heure, ceci est votre page hit par jour, etc?

0

Je voudrais également utiliser un AsyncController, afin que votre site ne devienne pas rapidement complètement inutilisable.

Questions connexes