10
votes

Lors de la mise à l'échelle du site Web ASP.NET-MVC, quelles sont les meilleures choses à se concentrer sur la priorité?

J'ai posé cette question sur la défaillance du serveur autour de l'évolutivité du site Web, mais c'était plus ciblé autour de la configuration matérielle, de la mémoire croissante, etc., donc je pensais que je le demanderais ici aussi bien que le côté de ma question de développement. < / p>

Selon la question, j'ai un bon fonctionnement de l'ASP.NET-MVC parfait avec SQL Server Backend et en utilisant le cache de Nibernate et Syscache 2nd de niveau et j'ai une demande d'augmentation de la base d'utilisateurs d'environ 1000 à 7000 et j'essaie d'essayer Pour déterminer où je devrais concentrer mes énergies de développement en termes de choses qui fonctionnent parfaitement bien maintenant, mais vont causer des problèmes à l'échelle. Je fais beaucoup de lecture et j'ai jusqu'à présent des choses qui semblent intéresser d'un point de vue codant sont;

  1. contrôleurs asynconx < / a>
  2. Caching de sortie (non vraiment pertinent pour moi, car la plupart de mes pages sont dynamiques et les droits d'utilisateur spécifiques
  3. Autre?

    Mon serveur SQL aujourd'hui est de 4 Go et en termes de données, je m'attendrais à ce que quelques-uns de la table augmentent de taille linéairement (comme une table de personnes qui passerait de 1000 lignes à 7 000 rangées) avec cette augmentation des utilisateurs mais La plupart des autres tableaux (données de référence, etc.) ne doivent avoir que la croissance marginale (une table comme un emplacement similaire peut-être doublerait)


8 commentaires

L'augmentation de la base de l'utilisateur entraîne-t-elle une multiplication de 7x de l'ensemble de données stockée ou 7X les utilisateurs accédant à la même taille de données de données que les 1 000 utilisateurs font aujourd'hui?


Bonne question, j'ai ajouté ma réponse dans les questions ci-dessus. laissez-moi savoir si cela répond à votre question


Oui, dans la théorie, vos requêtes existantes de NHibernate ne devraient pas souffrir à cause d'un ensemble de données beaucoup plus grand. Du côté de la base de données, vos problèmes peuvent venir de manipuler un nombre beaucoup plus important de demandes - problèmes de concurrence / verrouillage, etc.


Merci pour le commentaire. J'imagine que SQL Server est utilisé pour des systèmes beaucoup plus grands et concurrents que la mienne :). Existe-t-il des recommandations spécifiques au niveau de la base de données que vous pensez être examinées lors de la gestion de cette échelle. Jusqu'à présent, je viens de confirmer que nous avons suffisamment d'espace disque pour grandir.


Je suis d'accord sur SQL Server, il peut gérer de très grandes bases de données. Que lesdites bases de données plus grandes nécessitent une maintenance et un réglage constants. J'ai une application Web exécutant 5000 utilisateurs et nous rencontrons toujours des problèmes de performance occasionnels après plusieurs années - principalement en raison de la croissance des données.


Une augmentation de 1000 à 7000, je ne m'attendais pas à ce que vous ayez besoin de faire beaucoup. Le plus grand cou de bouteille est invariablement la base de données. Je regarderais les requêtes les plus chères que vous exécutées, puis dans votre environnement de test, augmente votre nombre d'utilisateurs avec un faux générateur de données d'environ 10000, puis essayez d'exécuter le site, il montrera bientôt tout point de douleur que vous pourriez avoir. Après cela, examinez les tests de charge pour voir si les pages qui ont vos requêtes les plus coûteuses à souffrir de plusieurs utilisateurs frappent. Ce serait mon point de départ


Base de données - et éviter les impasses. Avec une augmentation des utilisateurs viendra une augmentation des impacts possibles. Je voudrais examiner un plan solide de détection et de prévention de l'impasse et de sauvegarder des graphiques de dépôt.


Ce n'est jamais la faute de personne, cependant, lorsque vous évomhez sauvagement, vous trouverez des pièges dans «Qu'est-ce qui a fonctionné alors« vs »ce qui est nécessaire maintenant». Vous pouvez bénéficier de serrures de relaxation sur les opérations de lecture pour signaler les procédures stockées, par exemple.


3 Réponses :


1
votes

Sauvegardes

Vous devez vraiment avoir un système solide de sauvegarde de données. Avec la chance d'éviter une erreur critique avec la quantité d'utilisateurs, un bon système de sauvegarde est très important. Aussi, vous pouvez aller hors ligne et perdre des données.

Stockage des données pour Offline

Les données ont besoin d'une maison. La création d'un système robuste de stockage de données est très important. Ceci est pour quand vous êtes hors ligne pour une raison quelconque.

Test structurel

Les tests de stress vous aideront à savoir quoi corriger. Remplissez la base de données avec 10 000 éléments aléatoires et testez toutes les fonctions que vous pouvez. Essayez de rechercher des spécifications numéros d'identification.

Assurez-vous que la bande passante du serveur sera en mesure de le gérer. L'augmentation de la base d'utilisateurs chargera de plus en plus le serveur. Plus les utilisateurs sont plus utilisés à la fois.

Comme la quantité de données demandée augmente, les chances d'impasse augmentent-elles. Vous voudrez peut-être lire Ceci Article


0 commentaires

6
votes

L'architecture que vous décrivez n'est pas évolutive. Mais sur la base des chiffres que vous avez fournis, peut-être que l'évolutivité n'est pas une nécessité pour vous du tout? Être pragmatique avant de concevoir une évolutivité. Ne vous impliquez pas si vous en avez besoin.

Quoi qu'il en soit, si vous voulez aller pour cela, vous devez mettre l'échelle comme suit.

Premièrement, distinguer entre Commandes et questions . Commandes Modifier les données, les requêtes Récupérez les données.

Pour les commandes, vous pouvez utiliser un courtier de messages (par exemple, Rabbit MQ ) ou un bus de service (par exemple < un href = "https://particult.net/nservicebus" rel = "noreferrer"> nservicebus ). L'idée est que Web Server peut rapidement placer une commande sur la file d'attente et renvoyer la réponse à l'utilisateur. L'évolutivité est obtenue en éteignant le nombre de gestionnaires de commandes sans toucher le serveur Web. Évidemment, si vous souhaitez informer l'utilisateur, vous devez utiliser une technologie telle que Signalr .

Pour les requêtes, vous devez comprendre qu'ils ne sont pas si bons à l'échelle que les commandes sont. Donc, vous devez être créatif avec ceux-ci.

  1. Données de cache. Cela vient avec des considérations pour les données obsolètes, ainsi que des stratégies de rafraîchir les données.
  2. distribuer des données ( Sharding ), lorsque vous avez de nombreux serveurs de base de données, chacun seul sous-ensemble des données. Web Server émet des demandes parallèles aux serveurs, chaque serveur interroge le sous-ensemble (qui est petit et si rapide) et retourne en arrière, puis Web Server place toutes les morceaux de données de l'utilisateur. La plupart des bases de données NOSQL d'aujourd'hui sont fournies avec des requêtes au frastissement et distribuées intégrées.
  3. Redesignez le flux utilisateur pour traiter la requête en tant que commande. par exemple. Prenez la demande d'utilisateur et laissez l'utilisateur continuer à naviguer. Recueillez toutes les données requises en arrière-plan (en utilisant généralement la même technique que pour les commandes) et informez l'utilisateur lorsque vous avez terminé. Lorsque l'utilisateur passe à la page Résultats, récupérez les données pré-générées (typiquement de la base de données locale plus rapide que la récupération).
  4. ASYNC et attendre des mots-clés en C # . Non seulement pour les contrôleurs, mais également pour d'autres méthodes que vos contrôleurs appellent, à condition qu'ils / vous bloquiez le fil en attendant l'achèvement. L'utilisation d'ASYNC et d'attendre libérera les threads des demandes afin que d'autres demandes parallèles puissent utiliser ces threads. N'oubliez pas que cela ne raccourcit pas la demande effective de l'utilisateur, elle libère uniquement les ressources du serveur Web pour une utilisation optimale.

0 commentaires

1
votes

J'approcherais ce problème dans plusieurs étapes pour obtenir les meilleurs résultats.

NIVEAU D'APPLICATION

En règle générale dans mes projets, certains des pièges de performance les plus performants proviennent de plusieurs requêtes de DB par charge. Essayez de charger des pages et de consulter les journaux de la requête de base de données. S'il existe des requêtes supplémentaires, essayez de consolider les demandes d'éclaircissement de la charge sur la DB.

En outre, assurez-vous que toutes vos feuilles de style et vos actifs JavaScript sont compilées dans des fichiers simples minifiés dans votre environnement de production. Cela réduira la charge sur votre serveur Web.

Niveau de backend

Affichez vos journaux de base de données et voyez quelles transactions causent les analyses de la table la plus latté ou la plus déclenchante. Ajoutez de bons index à ces zones problématiques et surveillez vos performances de l'application.

Test

Dans un environnement de test (!!!) Utilisez un outil de fabrique d'entrée de base de données telle que Faker ( C'est rubis mais vous avez l'idée). Testez des transactions communes avec une taille de table beaucoup plus grande que d'habitude et les goulots d'étranglement de la performance commenceront à se montrer plus en évidence.


0 commentaires