Je ne cesse de voir dans les offres demploi que le candidat doit avoir de lexpérience dans la rédaction de candidatures « évolutives ». Quest-ce qui rend une application évolutive et comment savoir que mon code peut sadapter à des millions dutilisateurs?
Je suppose quune meilleure façon de formuler cette question est: Comment puis-je écrire mon code avec évolutivité à lesprit? Pour que le code soit évolutif dès le départ, par opposition à une réflexion après coup. Existe-t-il certaines méthodologies de conception? Ou sagit-il simplement de choisir les algorithmes appropriés pour le travail?
Réponse
Il existe deux directions dévolutivité:
- vertical (aka scaling up): CPU plus rapide, plus de RAM, plus despace disque;
- horizontal (aka scaling out): plus de cœurs dans le CPU, plus de CPU, plus de serveurs ;
Pour le premier, il suffit de veiller à ne pas avoir de limitations arbitraires. Celles-ci soit en raison de tailles dentiers trop petites ou de structures de longueur fixe / limitée. Ces structures peuvent être liées au système dexploitation sous-jacent. Par exemple, si vous essayez de passer à léchelle en utilisant plus de threads ou de processus, à un moment donné, vous allez atteindre les limites du système dexploitation. Cest pourquoi les serveurs conçus pour une évolutivité élevée utilisent actuellement la concurrence basée sur des événements asynchrones. Ce problème est décrit dans le célèbre C10K document .
La deuxième est plus difficile. Elle nécessite une programmation avec deux choses à lesprit: les données seront traitées en parallèle et les données pourraient être physiquement distribués. La communication entre les nœuds doit être limitée. Dans la pratique, cela signifie généralement sacrifier certaines parties dACID (il est prouvé que vous ne pouvez pas disposer dun ACID complet et dune capacité à évoluer en même temps). La solution la plus connue pour les données stockage dans ce paradigme sont des solutions NoSQL . Elles vont des magasins de valeurs-clés très simples aux systèmes de type SGBDR, seulement dépourvus de capacité à effectuer des jointures. div id = « 73fab16cf2 »>
les magasins de valeurs-clés sont ultra-évolutifs, mais cela a un prix. Vous ne pouvez interroger que sur la clé primaire. Il existe cependant une solution pour cela « s réduire la carte . Cela peut sembler très sous-optimal si vous regardez le point de vue de la complexité cumulative, mais vous devez garder à lesprit que cela fonctionne massivement en parallèle.
Si vous voulez en savoir plus sur lévolutivité avec des exemples réels , consultez le HighScalability.com blog .
Commentaires
- +1 pour mentionner la mise à léchelle. Ajouter plus de ressources est très rapide et attrayant pour les décideurs (achetez des cœurs hexadécimaux et doublez la mémoire! ). Mais si lapplication ne peut ‘ t mettre la pression sur eux, vous avez un plus gros problème.
Réponse
Lévolutivité est mesurée en termes de débit en fonction dune variable. Par exemple, le nombre de requêtes / seconde avec des utilisateurs X . La façon la plus simple de décrire lévolutivité est:
Une mesure de l efficacité lorsque la charge augmente.
La première chose que vous devez comprendre lors de la conception de lévolutivité est de savoir quelle mesure est la plus importante pour votre application? Il existe plusieurs façons de mesurer l efficacité , qui est un élément clé de lévolutivité:
- Demandes simultanées par seconde
- Temps de réponse moyen par demande
- Nombre denregistrements traités par seconde / minute
Il y a plus de mesures defficacité qui peuvent être utilisées, mais elles sont courantes pour les systèmes basés sur le Web ou les systèmes de traitement par lots.
Le prochain aspect de lévolutivité consiste à mesurer ce quil advient de votre efficacité lorsque la charge augmente. Les moyens courants daugmenter la charge sont:
- Davantage dutilisateurs sur le serveur (cest-à-dire plus de trafic Web)
- Plus de données dans la base de données (les requêtes prennent plus de temps ou le traitement prend plus)
- Panne du disque dur dans un RAID (les performances / la fiabilité du stockage sont affectées)
- Saturation du réseau
Lobjectif dune application évolutive est pour maintenir ou améliorer lefficacité pendant que nous traitons le problème de charge. Bref, si le temps de réponse est trop long, peut-on ajouter un autre serveur pour répartir la charge de manière égale? Cette approche réduit la quantité de travail à effectuer pour un serveur et permet aux serveurs de fonctionner dans ce «point idéal» pour plus defficacité.
Votre application devra être conçue spécifiquement pour évoluer. Cela signifie que vous doivent être prudents avec les données de session, acheminer les demandes vers le bon serveur, réduire les goulots détranglement qui limitent la capacité de lapplication à évoluer.
Réponse
Vous voulez essentiellement éviter les goulots détranglement des performances lorsque vous augmentez le nombre dutilisateurs et / ou traitez un ensemble de données plus important , et / ou proposer votre interface dans plus de langues, etc.
En gros, vous regardez le schéma de votre base de données, vos algorithmes et votre processus de développement logiciel et essayez de prédire les problèmes futurs. Vous souhaitez également configurer la surveillance des performances pour identifier les problèmes lorsquils commencent à se développer.
Jai suivi ces conseils en lisant Création de sites Web évolutifs (lien vers amazon).
Jespère que cela vous aidera!
Réponse
La seule façon dont les applications peut être vraiment évolutif, cest en nayant pas de restrictions qui ne peuvent pas être passées (ou seulement très cher).
Un exemple typique est ce qui se passe lorsque vous manquez de cpu-cycles disponibles? Si votre programme est multi-pistes, vous pouvez courir sur une boîte avec plusieurs noyaux mais que se passe-t-il lorsque vous ne pouvez plus acheter une boîte plus grande? Votre application ne peut tout simplement plus grandir et nest donc pas évolutive.
Toute application véritablement évolutive doit être capable de sétendre sur plusieurs ordinateurs de manière transparente et ce, sans aucun problème notable. Ce n’est pas facile, et c’est l’une des raisons pour lesquelles Google a connu un tel succès.
Réponse
Il existe des problèmes uniques qui viennent avec la prise en charge dapplications à grande échelle. Loffre demploi recherche des candidats qui ont travaillé dans cet environnement et qui ont dû résoudre de tels problèmes.
À partir dune application de haut niveau, les applications sont rendues évolutives en posant constamment la question de savoir ce qui se passerait si ce morceau de code devait être exécuté des milliers de fois en très peu de temps. Cela signifie gérer vos empreintes mémoire , en utilisant la mise en cache des totaux et des données, en utilisant des sources de données qui sont elles-mêmes évolutives, etc.
Réponse
Si vous étiez création dune fonction de recherche qui fonctionne bien lorsquelle comporte 100 lignes dans la base de données à rechercher et 10 utilisateurs lutilisant à la fois. Dans quelle mesure elle fonctionne lorsque 100 utilisateurs lutilisent en même temps et quil y a 100 000 lignes à rechercher.
Sil fonctionne de la même manière quoi quil en soit, cest très bien. Il fonctionne proportionnellement à la quantité dutilisateurs / de données (ce qui signifie 10 fois plus de données == 10 fois plus de temps à traiter), cest bien. Sil fonctionne beaucoup plus il y a de données (10x de données en mode == 10x ^ 10 de plus à traiter), alors il ne sadapte pas bien.
Mes exemples devraient vraiment être affichés en notation Big O mais je cu Je ne le connais pas assez bien pour écrire les exemples dans Big O.
Vous pouvez simuler plus de données en vidant des données factices dans votre base de données, et il existe des outils pour simuler plus dutilisateurs tels que Apache AB.