Recommandations pour optimiser les coûts du code
S’applique à cette recommandation de liste de contrôle Azure Well-Architected Framework Cost Optimization :
CO :11 | Optimisez les coûts du code. Évaluez et modifiez le code pour répondre aux exigences fonctionnelles et non fonctionnelles avec moins de ressources ou moins coûteuses. |
---|
Ce guide décrit les recommandations relatives à l’optimisation des coûts du code. L’optimisation du code est le processus d’amélioration de l’efficacité, des performances et de l’efficacité du code d’application. Une optimisation efficace du code implique d’apporter des modifications au code pour réduire la consommation des ressources, réduire le temps d’exécution et améliorer les performances globales.
En optimisant le code, vous pouvez identifier et éliminer les inefficacités susceptibles d’entraîner une consommation accrue des ressources et des coûts plus élevés. Vous pouvez réduire le temps de traitement, l’utilisation de la mémoire et la surcharge réseau, ce qui peut entraîner des applications plus rapides et plus réactives. Une amélioration des performances améliore l’expérience utilisateur et permet à votre système de gérer efficacement des charges de travail plus volumineuses.
Définitions
Terme | Définition |
---|---|
Instrumentation du code | La pratique d’ajout d’extraits de code ou de bibliothèques à du code qui collectent des données et surveillent les performances du code pendant l’exécution. |
Concurrence | Exécution de plusieurs processus en même temps. |
Sérialisation des données | Processus de conversion d’objets de données dans un format qui peut être stocké ou transmis, puis en les reconstruisant dans leur forme d’origine si nécessaire. |
Chemins d’accès chauds | Sections critiques ou fréquemment exécutées d’un programme nécessitant des performances élevées et une faible latence. |
Stratégies de conception
L’optimisation des coûts du code signifie améliorer le code pour obtenir les mêmes fonctionnalités avec moins de ressources par instance, telles que les cycles de processeur, la mémoire et le stockage. En réduisant la consommation des ressources, vous pouvez économiser de l’argent lorsque les applications gèrent de grands volumes de données ou rencontrent des charges de trafic élevées.
Les améliorations du code sont plus efficaces lorsque vous suivez d’autres efforts d’optimisation des coûts autour de la mise à l’échelle, de la rightsisation, de la redondance et de la limitation. Après avoir pris soin de ces éléments fondamentaux, vous pouvez envisager l’optimisation du code.
Vous ne savez peut-être pas si vous avez du code inefficace. Les fonctionnalités serverless, de mise à l’échelle automatique et de fiabilité peuvent masquer les inefficacités du code. Les stratégies suivantes peuvent vous aider à identifier et à corriger le code d’application qui coûte plus cher que cela ne le devrait.
instrumentalisation de votre code
L’instrumentation du code est la pratique d’ajout d’extraits de code ou de bibliothèques qui collectent des données et surveillent les performances du code pendant l’exécution. Il permet aux développeurs de collecter des informations sur les métriques clés, telles que la consommation de ressources (utilisation du processeur ou de la mémoire) et le temps d’exécution. En instrumentant le code, les développeurs peuvent obtenir des insights sur les chemins chauds du code, identifier les goulots d’étranglement des performances et optimiser le code pour améliorer l’efficacité et l’efficacité des coûts.
Dans un environnement idéal, vous devez effectuer une analyse du code au début du cycle de vie du développement logiciel. Plus vous rencontrez un problème de code plus tôt, le moins cher c’est de résoudre.
Automatisez autant que possible cette analyse du code. Utilisez des outils dynamiques et statiques pour l’analyse du code afin de réduire l’effort manuel. Toutefois, gardez à l’esprit que ce test est toujours une simulation de production. La production offre la meilleure compréhension de l’optimisation du code.
Compromis : Les outils de surveillance du code sont susceptibles d’augmenter les coûts.
Optimiser les chemins d’accès à chaud
En instrumentant votre code, vous pouvez mesurer la consommation de ressources des chemins de code. Ces mesures vous aident à identifier les chemins d’accès chauds. Les chemins à chaud ont un effet significatif sur les performances et l’utilisation des ressources. Ils sont critiques ou fréquemment exécutés dans des sections d’un programme qui nécessitent des performances élevées et une faible latence.
Pour identifier les chemins d’accès à chaud, tenez compte des tâches suivantes :
Analyser les données d’exécution : collectez et analysez les données d’exécution pour identifier les zones du code qui consomment des ressources importantes, telles que le processeur, la mémoire ou les opérations d’E/S. Recherchez des modèles ou des sections de code qui sont fréquemment exécutés ou prennent beaucoup de temps.
Mesurer les performances : utilisez des outils de profilage ou des frameworks de test de performances pour mesurer le temps d’exécution et la consommation des ressources des chemins de code. Cette mesure permet d’identifier les goulots d’étranglement et les domaines à améliorer.
Considérez la logique métier et l’effet utilisateur : évaluez l’importance des chemins de code en fonction de leur pertinence pour les fonctionnalités de l’application ou les opérations métier critiques. Déterminez quels chemins de code sont essentiels pour fournir une valeur aux utilisateurs ou répondre aux exigences de performances.
Passez en revue les recommandations de performances spécifiques au langage de programmation avec lequel vous travaillez. Évaluez votre code par rapport à ces recommandations pour identifier les domaines d’amélioration. Supprimez toutes les opérations inutiles dans le chemin d’accès du code susceptibles d’affecter les performances.
Supprimez les appels de fonction inutiles : passez en revue votre code. Identifiez les fonctions qui ne sont pas essentielles pour les fonctionnalités souhaitées et peuvent affecter négativement les performances. Par exemple, si un appel de fonction effectue une validation qui s’est produite précédemment dans le code, vous pouvez supprimer cet appel de fonction inutile.
Réduire les opérations de journalisation : la journalisation peut être utile pour le débogage et l’analyse, mais la journalisation excessive peut affecter les performances. Évaluez la nécessité de chaque opération de journalisation et supprimez les appels de journalisation inutiles qui ne sont pas essentiels pour l’analyse des performances.
Optimiser les boucles et les conditions : analyser les boucles et les conditions dans votre code. Identifiez les itérations ou conditions inutiles que vous pouvez éliminer. La simplification et l’optimisation de ces structures peuvent améliorer les performances de votre code.
Réduire le traitement inutile des données : passez en revue votre code pour toutes les opérations de traitement des données inutiles, telles que les calculs ou transformations redondants. Éliminez ces opérations inutiles pour améliorer l’efficacité de votre code.
Réduire les demandes réseau : si votre code effectue des requêtes réseau, réduisez le nombre de requêtes et optimisez leur utilisation. Les requêtes batch lorsque cela est possible et évitent les allers-retours inutiles pour améliorer les performances.
Réduire les allocations : identifiez les zones où l’allocation de mémoire excessive se produit. Optimisez le code en réduisant les allocations inutiles et en réutilisant les ressources existantes lorsque cela est possible.
En réduisant les allocations, vous pouvez améliorer l’efficacité de la mémoire et les performances globales. Utilisez les stratégies de gestion de la mémoire et de garbage collection appropriées pour votre langage de programmation.
Réduire la taille de la structure des données : évaluez la taille de vos structures de données, telles que les classes, et identifiez les zones où la réduction est possible. Passez en revue les exigences de données et éliminez les champs ou propriétés inutiles. Optimisez l’utilisation de la mémoire en sélectionnant efficacement les types de données appropriés et en empaquetant les données.
Évaluer les implémentations croisées : tenez compte des effets des implémentations croisées, telles que les middlewares ou les vérifications de jetons. Évaluez s’ils affectent négativement les performances.
Compromis : L’optimisation du code et des chemins chauds nécessite une expertise du développeur pour identifier les inefficacités du code. Ces personnes hautement qualifiées peuvent avoir besoin de consacrer du temps à d’autres tâches.
Évaluer l’utilisation de la concurrence
L’évaluation de l’utilisation de la concurrence implique d’évaluer si le traitement asynchrone, le multithreading ou le multitraitement peut optimiser l’utilisation des ressources et réduire les dépenses. En utilisant le traitement asynchrone, le multithreading ou le traitement multiprocesseur, vous pouvez gérer davantage de tâches avec les mêmes ressources. Toutefois, il est essentiel de garantir une implémentation appropriée afin d’éviter une surcharge plus élevée et de maintenir l’efficacité des coûts.
Pour déterminer si l’utilisation de la concurrence est adaptée, vous pouvez suivre ces instructions :
Traitement asynchrone : le traitement asynchrone autorise l’exécution non bloquante. Par exemple, vous pouvez démarrer un processus, puis le suspendre pour permettre la fin d’un deuxième processus.
Déterminez les composants ou opérations de code que vous pouvez exécuter de manière asynchrone. Identifiez le langage de programmation ou l’infrastructure que vous utilisez et comprenez le modèle de programmation asynchrone qu’il prend en charge, comme
async
/await
dans .NET ou les promesses en JavaScript.Restructurez votre code pour utiliser des constructions de programmation asynchrones en activant l’exécution non bloquante des tâches. Dissociez les opérations nécessitant beaucoup d’E/S ou d’E/S à partir du thread d’exécution principal à l’aide de méthodes asynchrones ou de rappels. Utilisez des API ou bibliothèques asynchrones que votre langage de programmation ou infrastructure fournit pour gérer les flux de travail asynchrones.
Multithreading : dans le multithreading, vous exécutez simultanément plusieurs threads d’un seul processus.
Identifiez les sections de votre code que vous pouvez exécuter simultanément et indépendamment. Lisez la documentation ou les instructions spécifiques au langage de programmation ou à l’infrastructure que vous utilisez pour les meilleures pratiques de multithreading. Créez plusieurs threads ou pools de threads pour gérer l’exécution parallèle des tâches.
Implémentez des mécanismes de synchronisation, tels que des verrous, des mutex ou des sémaphores, pour garantir la sécurité des threads et empêcher les conditions de concurrence lorsque le code accède aux ressources partagées. Envisagez d’utiliser des abstractions de niveau supérieur, telles que des pools de threads ou des bibliothèques de parallélisme basés sur des tâches, pour simplifier la gestion de plusieurs threads et simplifier le contrôle d’accès concurrentiel.
Multiprocessage : le multitraitement peut avoir des processus exécutés en parallèle. Il peut fournir une meilleure utilisation de plusieurs cœurs de processeur que le multithreading.
Déterminez si la charge de travail ou les opérations de votre code se prêtent au traitement parallèle. Identifiez le langage de programmation ou l’infrastructure que vous utilisez et explorez ses fonctionnalités multiprocesseur. Par exemple, considérez le module multiprocesseur en Python ou en flux parallèles en Java. Concevez votre code pour fractionner la charge de travail en plusieurs tâches indépendantes qui peuvent être traitées simultanément.
Utilisez des API ou des bibliothèques multiprocesseurs pour créer et gérer des processus parallèles. Distribuez la charge de travail entre ces API ou bibliothèques. Pour permettre la coordination et le partage de données entre plusieurs processus, implémentez des mécanismes de communication tels que la communication interprocesseur (IPC), la mémoire partagée ou le passage de messages, en fonction de votre langage de programmation ou de votre infrastructure.
Utiliser les kits SDK appropriés
Pour optimiser les coûts, sélectionnez des kits SDK conçus pour optimiser l’utilisation des ressources et améliorer les performances. Il est important d’évaluer les fonctionnalités et les fonctionnalités de chaque Kit de développement logiciel (SDK). Tenez compte de sa compatibilité avec votre langage de programmation et votre environnement de développement.
Voici des conseils pour vous aider à choisir les meilleurs kits SDK pour votre charge de travail :
Effectuer des tests de performances : comparez l’utilisation des ressources et les performances des kits SDK par le biais de tests de performances. Choisissez le SDK qui répond le mieux à vos besoins en termes d’optimisation des ressources et d’amélioration des performances. Intégrez le Kit de développement logiciel (SDK) choisi à votre codebase en suivant la documentation et les instructions fournies.
Surveillez l’utilisation des ressources et optimisez le code : surveillez l’utilisation des ressources avec le Kit de développement logiciel (SDK) implémenté. Rassemblez des insights à partir de la supervision et de l’analyse pour optimiser votre code.
Choisir le système d’exploitation approprié
La plupart des langages de codage peuvent s’exécuter sur différents systèmes d’exploitation. Il est donc important d’évaluer votre système d’exploitation par rapport à des alternatives moins coûteuses. Si un autre système d’exploitation prend en charge les mêmes fonctionnalités ou similaires à moindre coût, il vaut la peine d’envisager. En choisissant un système d’exploitation moins cher, vous pouvez potentiellement réduire le coût des frais de licence et des coûts d’infrastructure.
Le bon système d’exploitation peut contribuer à l’optimisation globale des coûts pour votre charge de travail. Pour choisir le système d’exploitation approprié pour votre charge de travail, essayez ces activités :
Évaluez vos besoins : comprenez les besoins spécifiques de votre charge de travail, y compris les langages de codage et les frameworks que vous utilisez. Envisagez toutes les dépendances ou intégrations avec d’autres systèmes.
Envisagez la compatibilité : assurez-vous que le système d’exploitation que vous choisissez est compatible avec vos langages de codage, infrastructures et toutes les bibliothèques ou outils tiers que vous utilisez. Consultez la documentation et la prise en charge de la communauté pour le système d’exploitation pour vous assurer qu’il a une bonne compatibilité avec votre pile technologique.
Évaluer les fonctionnalités : déterminez si le système d’exploitation alternatif prend en charge les mêmes fonctionnalités que votre système d’exploitation actuel. Évaluez s’il fournit les fonctionnalités et fonctionnalités nécessaires dont votre charge de travail a besoin.
Comparer les coûts : comparez les coûts associés aux systèmes d’exploitation. Tenez compte des facteurs tels que les frais de licence, les coûts de support et les exigences en matière d’infrastructure. Recherchez des alternatives moins coûteuses qui peuvent répondre aux exigences de votre charge de travail sans compromettre les fonctionnalités.
Envisagez les performances et l’optimisation : évaluez les fonctionnalités de performances et d’optimisation du système d’exploitation alternatif. Recherchez des benchmarks, des études de cas ou des comparaisons de performances pour comprendre comment il s’exécute dans des scénarios réels.
Passez en revue la sécurité et la stabilité : évaluez la sécurité et la stabilité du système d’exploitation alternatif. Recherchez les mises à jour de sécurité, les correctifs et la prise en charge de la communauté pour vous assurer que le système d’exploitation est géré activement et qu’il est sécurisé et stable dans l’ensemble.
Prenez en charge le fournisseur : évaluez le niveau de prise en charge du fournisseur disponible pour le système d’exploitation alternatif. Vérifiez s’il existe des canaux de support officiels, une documentation et une communauté d’utilisateurs qui peuvent fournir de l’aide si vous en avez besoin.
Optimiser le trafic réseau
L’optimisation du parcours réseau consiste à réduire le trafic réseau entre les composants de charge de travail. Le transfert de données a souvent un coût associé. En réduisant le trafic réseau, vous pouvez réduire la quantité de données qui doivent être transférées tout en réduisant les coûts.
Analysez votre charge de travail et identifiez les transferts de données inutiles entre les composants. Évitez de transférer des données redondantes ou dupliquées et de transmettre uniquement des informations essentielles. Par exemple, si un composant demande à plusieurs reprises les mêmes données d’un autre composant, il s’agit d’un candidat à l’optimisation. Vous pouvez refactoriser votre code pour réduire les appels inutiles ou les requêtes par lots, ce qui réduit les données transférées. Les applications peuvent envoyer des objets ou des structures de données entiers lorsque seuls quelques champs sont nécessaires. En optimisant le code pour envoyer uniquement les données requises, vous réduisez la taille de chaque transfert de données.
Optimiser les protocoles réseau
Les protocoles réseau jouent un rôle crucial dans l’efficacité de la communication réseau. En optimisant les protocoles réseau, vous pouvez améliorer l’efficacité globale du transfert de données et réduire la consommation des ressources.
Tenez compte de ces suggestions :
Choisissez des protocoles efficaces : sélectionnez les protocoles connus pour leur efficacité en termes de vitesse de transfert de données et minimisant la surcharge. Par exemple, envisagez d’utiliser des protocoles tels que HTTP/2 sur HTTP/1.1. Ces protocoles sont conçus pour améliorer les performances en réduisant la latence et en optimisant le transfert de données. Utilisez des bibliothèques et des frameworks dans votre application pour utiliser ces protocoles.
Prise en charge de la compression : implémentez des mécanismes de compression dans vos protocoles réseau pour réduire la taille des données transférées. La compression peut réduire considérablement la quantité de données transmises sur le réseau, ce qui permet d’améliorer les performances et de réduire l’utilisation de la bande passante. La compression côté serveur est généralement activée dans le code d’application ou la configuration du serveur.
Utiliser le regroupement de connexions : le regroupement de connexions permet la réutilisation des connexions réseau établies afin de réduire la surcharge liée à l’établissement de nouvelles connexions pour chaque requête. Le regroupement de connexions peut améliorer l’efficacité de la communication réseau en évitant la surcharge liée à la configuration de la connexion et à la suppression. Choisissez une bibliothèque ou une infrastructure de regroupement de connexions et configurez-la pour répondre aux besoins de la charge de travail.
Implémentez d’autres optimisations : explorez d’autres optimisations spécifiques à votre charge de travail et à votre environnement réseau. Par exemple, vous pouvez utiliser la mise en cache du contenu, l’équilibrage de charge et la mise en forme du trafic pour optimiser davantage la traversée du réseau.
Réduire la surcharge réseau
Réduisez la quantité de trafic réseau et de transfert de données entre les composants de votre charge de travail. En réduisant la surcharge réseau, vous pouvez réduire les coûts associés à la sortie et à l’entrée des données et améliorer les performances globales du réseau.
Tenez compte de ces techniques :
Réduire les demandes redondantes : analysez le code pour identifier les demandes dupliquées ou inutiles. Au lieu d’effectuer plusieurs requêtes pour les mêmes données, vous pouvez modifier le code pour récupérer les données une fois et les réutiliser en fonction des besoins.
Optimiser la taille des données : passez en revue les données transmises entre les composants ou les systèmes et recherchez des opportunités pour réduire sa taille. Envisagez des techniques telles que la compression des données avant la transmission ou l’utilisation de formats de données plus efficaces. En réduisant la taille des données, vous pouvez réduire l’utilisation de la bande passante réseau et améliorer l’efficacité globale.
Demandes par lots : le cas échéant, envisagez de traiter plusieurs demandes plus petites en une seule demande plus grande. Le traitement par lots réduit la surcharge liée à l’établissement de plusieurs connexions et réduit la transmission globale des données.
Utiliser la sérialisation des données : la sérialisation des données est le processus de conversion de structures ou d’objets de données complexes dans un format qui peut être facilement transmis sur un réseau ou stocké dans un système de stockage persistant. Cette stratégie implique de représenter les données dans un format standardisé, afin que les données puissent être transmises, traitées et reconstruites efficacement à la fin de la réception.
Sélectionnez un format de sérialisation compact, rapide et adapté aux exigences de votre charge de travail.
Format de sérialisation Description Protocol Buffers (Protobuf) Format de sérialisation binaire qui offre un encodage et un décodage efficaces des données structurées. Il utilise des fichiers de définition typés pour définir des structures de message. MessagePack Format de sérialisation binaire pour la transmission compacte sur le fil. Il prend en charge différents types de données et fournit des performances de sérialisation et de désérialisation rapides. JSON (JavaScript Object Notation) Format de sérialisation des données largement utilisé qui est lisible par l’homme et facile à utiliser. JSON est basé sur du texte et offre une prise en charge multiplateforme étendue. JSON binaire (BSON) Format de sérialisation binaire similaire à JSON, mais conçu pour une sérialisation et une désérialisation efficaces. BSON inclut des types de données supplémentaires qui ne sont pas disponibles dans JSON. Selon le format de sérialisation, vous devez implémenter la logique pour sérialiser des objets ou des structures de données dans le format choisi et les désérialiser dans leur formulaire d’origine. Vous pouvez implémenter cette logique à l’aide de bibliothèques ou de frameworks qui fournissent des fonctionnalités de sérialisation pour le format.
Optimiser l’accès aux données
L’optimisation de l’accès aux données fait référence à la rationalisation des modèles et techniques de récupération et de stockage des données, afin de réduire les opérations inutiles. Lorsque vous optimisez l’accès aux données, vous pouvez réduire les coûts en réduisant l’utilisation des ressources, en réduisant la récupération des données et en améliorant l’efficacité du traitement des données. Envisagez des techniques telles que la mise en cache des données, l’interrogation efficace des données et la compression des données.
Utiliser des mécanismes de mise en cache
La mise en cache implique le stockage des données fréquemment sollicitées plus près des composants qui en ont besoin. Cette technique réduit le besoin de traversée réseau en servant les données du cache au lieu de les extraire sur le réseau.
Tenez compte de ces mécanismes de mise en cache :
Utilisez un cache externe : une solution de mise en cache populaire est un réseau de distribution de contenu. Cela permet de réduire la latence et de réduire la traversée du réseau en mettant en cache du contenu statique plus près des consommateurs.
Paramétrez les paramètres de mise en cache : configurez les paramètres de mise en cache, tels que le temps de vie (TTL), pour optimiser l’avantage de la mise en cache tout en réduisant les inconvénients potentiels. La définition d’une durée de vie appropriée garantit que les données mises en cache restent fraîches et pertinentes.
Utilisez la mise en cache en mémoire : en plus des solutions de mise en cache externes, envisagez d’implémenter la mise en cache en mémoire dans votre application. La mise en cache en mémoire peut aider à utiliser des ressources de calcul inactives et à augmenter la densité de calcul des ressources allouées.
Optimiser le trafic de base de données
Vous pouvez améliorer l’efficacité de la communication entre les applications et la base de données. Voici quelques considérations et techniques clés pour optimiser le trafic de base de données :
Créer des index : l’indexation est le processus de création de structures de données qui améliorent la vitesse de récupération des données. En créant des index sur des colonnes fréquemment interrogées, vous pouvez réduire considérablement le temps nécessaire pour exécuter des requêtes. Par exemple, si vous avez une table d’utilisateurs avec une colonne pour les noms d’utilisateur, vous pouvez créer un index sur la colonne de nom d’utilisateur pour accélérer les requêtes qui recherchent des noms d’utilisateur spécifiques.
Identifiez les colonnes les plus fréquemment sollicitées et créez des index sur ces colonnes pour accélérer la récupération des données. Analysez et optimisez régulièrement les index existants pour vous assurer qu’ils sont toujours efficaces. Évitez l’indexation excessive, car elle peut affecter négativement les opérations d’insertion et de mise à jour.
Optimiser les requêtes : concevez des requêtes efficaces en tenant compte des exigences spécifiques en matière de données et en réduisant la récupération inutile des données. Commencez par utiliser les types de jointure appropriés (par exemple, jointure interne et jointure gauche), en fonction de la relation entre les tables. Utilisez des techniques d’optimisation des requêtes telles que les indicateurs de requête, l’analyse du plan de requête et la réécriture des requêtes pour améliorer les performances.
Résultats des requêtes de cache : vous pouvez stocker les résultats des requêtes fréquemment exécutées en mémoire ou dans un cache. Les exécutions suivantes de la même requête peuvent ensuite être traitées à partir du cache, ce qui élimine le besoin d’opérations de base de données coûteuses.
Utilisez une infrastructure de mappage relationnel objet (ORM) : utilisez des fonctionnalités ORM telles que le chargement différé, la mise en cache et le traitement par lots pour optimiser la récupération des données et réduire les allers-retours de base de données. Utilisez des frameworks ORM tels que Entity Framework pour C# ou Hibernate pour Java.
Optimiser les procédures stockées : analysez et optimisez la logique et les performances des procédures stockées. L’objectif est d’éviter les calculs inutiles ou les requêtes redondantes dans les procédures stockées. Optimisez l’utilisation de tables temporaires, de variables et de curseurs pour réduire la consommation des ressources.
Organiser les données
L’organisation des données pour un accès et une récupération efficaces implique la structuration et le stockage des données d’une manière qui optimise les performances et réduit la consommation des ressources. Il peut améliorer les temps de réponse des requêtes, réduire les coûts de transfert de données et optimiser l’utilisation du stockage.
Voici quelques techniques permettant d’organiser efficacement les données :
Partition : le partitionnement implique de diviser un jeu de données volumineux en sous-ensembles plus petits et plus gérables appelés partitions. Vous pouvez stocker chaque partition séparément pour permettre un traitement parallèle et améliorer les performances des requêtes. Par exemple, vous pouvez partitionner des données en fonction d’une plage de valeurs spécifique ou en distribuant des données sur plusieurs serveurs. Cette technique peut améliorer l’extensibilité, réduire la contention et optimiser l’utilisation des ressources.
Partition : le partitionnement est une technique de division horizontale des données sur plusieurs instances ou serveurs de base de données. Chaque partition contient un sous-ensemble des données, et les requêtes peuvent être traitées en parallèle sur ces partitions. Le partitionnement peut améliorer les performances des requêtes en distribuant la charge de travail et en réduisant la quantité de données auxquelles chaque requête accède.
Compresser : la compression des données implique de réduire la taille des données afin de réduire les exigences de stockage et d’améliorer l’efficacité du transfert de données. Étant donné que les données compressées occupent moins d’espace disque, elles permettent d’économiser des coûts de stockage. Les données compressées peuvent également être transférées plus rapidement sur les réseaux et réduire les coûts de transfert de données.
Par exemple, envisagez un scénario dans lequel vous disposez d’un grand jeu de données d’informations client. En partitionnant les données en fonction des régions clientes ou démographiques, vous pouvez distribuer la charge de travail sur plusieurs serveurs et améliorer les performances des requêtes. Vous pouvez également compresser les données pour réduire les coûts de stockage et améliorer l’efficacité du transfert de données.
Optimiser la conception de la solution
Évaluez votre architecture de charge de travail pour identifier les opportunités d’optimisation des ressources. L’objectif est d’utiliser les services appropriés pour le bon travail.
Pour atteindre cet objectif, vous devrez peut-être redéfinir les parties de l’architecture pour utiliser moins de ressources. Envisagez d’utiliser des services serverless ou managés et d’optimiser l’allocation de ressources. En optimisant votre architecture, vous pouvez répondre aux exigences fonctionnelles et non fonctionnelles tout en consommant moins de ressources par instance.
Utiliser des modèles de conception
Les modèles de conception sont des solutions réutilisables qui aident les développeurs à résoudre les problèmes de conception récurrents. Ils fournissent une approche structurée pour concevoir du code efficace, gérable et évolutif.
Les modèles de conception permettent d’optimiser l’utilisation des ressources système en fournissant des instructions pour une allocation et une gestion efficaces des ressources. Par exemple, le modèle Disjoncteur permet d’empêcher la consommation inutile de ressources en fournissant un mécanisme permettant de gérer et de récupérer des défaillances de manière contrôlée.
Les modèles de conception peuvent aider à optimiser le code de la manière suivante :
Temps de développement réduit : les modèles de conception fournissent des solutions éprouvées aux problèmes de conception courants, ce qui peut gagner du temps de développement. En suivant les modèles établis, les développeurs peuvent éviter le travail répétitif et se concentrer sur l’implémentation des exigences spécifiques de leurs applications.
Amélioration de la facilité de maintenance : les modèles de conception favorisent le code modulaire et structuré qui est plus facile à comprendre, modifier et gérer. Ils peuvent entraîner des économies de coûts en termes de réduction des efforts de débogage et de maintenance.
Scalabilité et performances : les modèles de conception aident à concevoir des systèmes évolutifs et performants. Les modèles comme le modèle Cache-Aside peuvent améliorer les performances en mettant en cache les données fréquemment sollicitées afin de réduire le besoin de calculs coûteux ou d’appels externes.
Pour implémenter des modèles de conception, les développeurs doivent comprendre les principes et instructions de chaque modèle et les appliquer dans le code. Envisagez d’identifier le modèle approprié pour un problème, de comprendre sa structure et ses composants, et d’intégrer le modèle dans la conception globale.
Diverses ressources sont disponibles, telles que la documentation, les didacticiels et l’exemple de code. Ces ressources peuvent aider les développeurs à apprendre et à implémenter efficacement des modèles de conception.
Modifier les configurations
Passez régulièrement en revue et mettez à jour la configuration de votre charge de travail pour vous assurer qu’elle s’aligne sur vos exigences actuelles. Envisagez d’ajuster le dimensionnement des ressources et les paramètres de configuration en fonction des demandes de charge de travail. En optimisant les configurations, vous pouvez allouer efficacement des ressources et éviter le surprovisionnement pour économiser des coûts.
Architecture de refactorisation
Évaluez votre architecture de charge de travail et identifiez les opportunités de refactorisation ou de reconfiguration des composants pour optimiser la consommation des ressources. Envisagez des techniques telles que l’adoption d’une architecture de microservices, l’implémentation du modèle Disjoncteur et l’utilisation de l’informatique serverless. En optimisant votre architecture, vous pouvez améliorer l’utilisation des ressources et l’efficacité des coûts.
Modifier les tailles de ressources
Surveillez et analysez en continu l’utilisation des ressources de votre charge de travail. En fonction des modèles et tendances observés, ajustez le dimensionnement des ressources et les paramètres de configuration pour optimiser la consommation des ressources.
Envisagez de rightsiser les machines virtuelles, d’ajuster l’allocation de mémoire et d’optimiser la capacité de stockage. En droits sur les ressources, vous pouvez éviter les coûts inutiles associés à la sous-utilisation ou au surprovisionnement.
Compromis : la remaniement du code et de l’architecture risque de ne pas correspondre aux planifications actuelles du projet et peut entraîner un glissement de planification et de coût.
Facilitation Azure
Code d’instrumentation : Azure fournit des outils de supervision et de journalisation tels qu’Azure Monitor, Application Insights et Log Analytics. Vous pouvez utiliser ces outils pour suivre et analyser les performances et le comportement de votre code en temps réel.
Identification des chemins chauds et optimisés : Application Insights et Application Insights Profiler permettent d’identifier et d’optimiser les chemins d’accès chauds dans votre code en analysant les temps d’exécution et l’utilisation des ressources. Vous pouvez réduire les allocations de mémoire inutiles et optimiser l’utilisation de la mémoire avec Profiler.
Utilisation des kits de développement logiciel (SDK) appropriés : Azure offre des kits SDK dans plusieurs langages de programmation, optimisés pour les performances et la facilité d’utilisation. Ces kits SDK fournissent des fonctions et des bibliothèques prédéfinies qui interagissent avec les services Azure afin de réduire la nécessité d’une implémentation personnalisée.
Optimisation de la traversée du réseau : différents services Azure prennent en charge des protocoles réseau à grande vitesse tels que HTTP/2 et QUIC pour une communication efficace entre les services et les applications.
Les services Azure, tels que Azure Database pour PostgreSQL - Serveur flexible, prennent en charge le regroupement de connexions.
support Azure le traitement par lots dans différents services. Vous pouvez donc regrouper plusieurs opérations et les exécuter dans une seule requête. Le traitement par lots peut améliorer considérablement l’efficacité et réduire la surcharge réseau.
En ce qui concerne la sérialisation des données, support Azure différents formats de sérialisation, notamment JSON et XML. Choisissez le format de sérialisation approprié en fonction de la taille des données, des exigences de performances et des besoins d’interopérabilité.
Optimisation de l’accès aux données : Azure fournit des services de mise en cache comme Azure Cache pour Redis. Vous pouvez utiliser la mise en cache pour stocker les données fréquemment sollicitées plus près de l’application, ce qui entraîne une récupération plus rapide et une charge back-end réduite.
Indexation et optimisation des requêtes : les services Azure tels qu’Azure SQL Database et Azure Cosmos DB fournissent des fonctionnalités d’indexation pour optimiser les performances des requêtes. En choisissant la stratégie d’indexation appropriée et en optimisant les requêtes, vous pouvez améliorer l’efficacité globale de la récupération des données.
Mappage relationnel objet (ORM) : support Azure des frameworks ORM comme Entity Framework. Ces frameworks simplifient l’accès aux données et le mappage entre le code orienté objet et les bases de données relationnelles ou NoSQL.
Optimisation des procédures stockées : vous pouvez utiliser des services Azure comme Azure SQL Database pour créer et optimiser des procédures stockées. Les procédures stockées peuvent améliorer les performances en réduisant les allers-retours réseau et en précompilant les instructions SQL.
Partitionnement et partitionnement : Azure offre des fonctionnalités de partitionnement et de partitionnement dans des services tels qu’Azure Cosmos DB et Azure SQL Database. Vous pouvez utiliser le partitionnement pour distribuer des données sur plusieurs nœuds pour optimiser la scalabilité et les performances.
Compression des données : les services Azure prennent en charge les techniques de compression des données telles que GZIP et DEFLATE.
Optimisation de l’architecture : Azure fournit des conseils architecturaux et des modèles de conception pour la conception d’applications évolutives, résilientes et performantes. Pour plus d’informations, consultez Modèles de conception.
Liens connexes
- Azure Monitor
- Application Insights
- Log Analytics
- Application Insights Profiler
- Regroupement de connexions
- Azure Database pour PostgreSQL - Regroupement de connexions serveur flexibles
- Paramétrage d’index Azure SQL Database
- Stratégies d’indexation Azure Cosmos DB
- Partitionnement Azure Cosmos DB
- Partitionnement Azure SQL Database
Liste de contrôle d’optimisation des coûts
Reportez-vous à l’ensemble complet de recommandations.