2010-11-11 11 views
1

J'écris une application web avec django sur le côté serveur. Il faut environ 4 secondes au serveur pour générer une réponse à l'utilisateur. Il utilise une api météo. Mon application doit faire ~ 50 requête à cette api pour chaque demande de l'utilisateur. Le côté serveur utilise urllib de python pour l'utilisation de l'api météo. J'ai utilisé le threading python pour accélérer le processus car urllib est synchrone. J'utilise wsgi avec apache. Le problème est que la pile wsgi est entièrement synchrone et lorsque de nombreux utilisateurs utilisent mon application, ils doivent attendre qu'une autre requête se termine. Puisque chaque requête prend ~ 4 secondes, ceci est inacceptable.Comment puis-je mettre à l'échelle une webapp avec un temps de réponse long, qui utilise actuellement django

Je suis coincé, que puis-je faire?
Merci

+0

Pouvez-vous précacher les données au lieu de le faire au moment de la demande? –

+0

Il se peut que les données de n'importe quel point de la Terre doivent être interrogées en fonction de l'utilisateur. Je dois mettre en cache les données météo du monde entier et c'est beaucoup trop. De plus, il change toutes les heures. – refik

Répondre

0

Si vous utilisez mod_wsgi dans une configuration multithread, ou même une configuration multi-processus, une requête ne devrait pas empêcher une autre de faire quelque chose. Ils devraient pouvoir fonctionner simultanément. Si vous utilisez une configuration multithread, êtes-vous sûr de ne pas utiliser de mécanisme de verrouillage sur certaines ressources de votre propre application, ce qui exclut les demandes qui s'exécutent dans la même section de code? Une autre possibilité est que vous avez mal configuré le mode Apache MPM et/ou le mode démon mod_wsgi afin d'empêcher les requêtes simultanées. De toute façon, comme mentionné dans une autre réponse, vous feriez mieux d'examiner les stratégies de mise en cache pour éviter les recherches météo ou pour décharger le client.

+0

J'ai configuré wsgi comme il est dit ici: http: // bit. ly/EaatF J'utilise des threads pour aller chercher url donc je ne pense pas que je verrouille quoi que ce soit. Je n'ai rien fait de spécial avec ma configuration apache donc peut-être que c'est le problème comme tu l'as dit. Je vais regarder. Les recherches météo sont nécessaires côté serveur, j'en ai parlé sous cette réponse. – refik

+1

Votre commentaire "J'utilise des threads pour aller chercher l'url" n'a pas de sens. Vous n'avez pas besoin de créer des unités d'exécution distinctes pour extraire les données, à moins que vous ne lanciez simultanément plusieurs unités d'exécution en arrière pour tenter de paralléliser les demandes, puis d'attendre qu'elles se terminent toutes. Est ce que c'est ce que tu es en train de faire? –

+0

BTW, vous devriez vraiment regarder dans le mode démon de mod_wsgi. Si vous avez seulement suivi ces instructions, vous seriez en mode embarqué, ce qui à moins que vous ne configuriez correctement Apache MPM, puisse causer des problèmes. Lire 'http://blog.dscpl.com.au/2009/03/load-spikes-and- excessive-memory-usage.html '. –

0

50 requêtes à une ressource externe par requête est probablement un mauvais endroit pour être, et probablement pas nécessaire du tout.

La météo ne change pas si vite, et vous pouvez probablement en profiter énormément en mettant en cache les résultats pendant un certain temps. Ensuite, peu importe le nombre de demandes que vous recevez, vous n'avez pas besoin de faire plus que quelques requêtes par jour.

Si ce n'est pas votre cas, vous pourriez être en mesure d'amener le client à faire le travail pour toi. Refactorisez le code de sorte que l'agrégation d'api météo se passe sur le client en javascript, plutôt que de l'acheminer à travers le serveur. Editer: en fonction des commentaires que vous avez publiés, ce que vous demandez ne peut probablement pas être optimisé dans les contraintes de l'API que vous utilisez. Le problème est que le service fait un bon travail d'abstraction des différences dans les nombreuses sources d'informations météorologiques qu'ils regroupent dans une requête de localisation la plus proche. après tout, les stations météorologiques ne fournissent que des données ponctuelles.

Si vous parlez directement aux personnes de support technique qui fournissent l'API, vous pouvez constater qu'elles acceptent de prendre en charge des requêtes plus complexes (boîte englobante), pour lesquelles elles vous donneront des instructions. Plus probablement, cependant, ils abstraits parce qu'ils ne veulent pas révéler la résolution que leur API fournit réellement, ou parce qu'il y a une raison technique dans la façon dont ils modélisent leurs données ou effectuent leurs calculs qui feraient de telles requêtes trop difficile à supporter.

Sans cela ou la mise en cache, vous n'avez tout simplement pas de chance.

+0

50 requêtes sont effectuées pour 50 emplacements différents. L'utilisateur choisit un emplacement sur la carte et l'application doit regarder la météo de 50 points autour de cet endroit. C'est nécessaire pour une évaluation. L'emplacement choisi par l'utilisateur peut être n'importe quel point de la terre, donc je ne suis pas sûr que la mise en cache puisse aider.J'ai également pensé à utiliser javascript, mais la politique d'utilisation des API empêche de rendre ma clé publique api, ce qui ne ressemble pas à une option. – refik

+0

L'API prend-elle en charge les requêtes de boîte englobante? – SingleNegationElimination

+0

Malheureusement pas. C'est ce que j'utilise - http://bit.ly/dlIAIp Cette api semble être la seule que j'ai pu trouver qui peut être interrogée avec lat/lon – refik