Recommandations pour optimiser les coûts du code

S’applique à cette recommandation de liste de contrôle d’optimisation des coûts d’Azure Well-Architected Framework :

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 cher.

Ce guide décrit les recommandations pour optimiser les coûts du code. L’optimisation du code est le processus d’amélioration de l’efficacité, des performances et de la rentabilité du code d’application. L’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 qui peuvent 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. L’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 Pratique consistant à ajouter des extraits de code ou des bibliothèques au code qui collectent des données et surveillent les performances du code pendant l’exécution.
Accès concurrentiel Exécution de plusieurs processus en même temps.
Sérialisation des données Processus consistant à convertir des objets de données dans un format qui peut être stocké ou transmis, puis à les reconstruire dans leur forme d’origine si nécessaire.
Chemins d’accès chauds Sections critiques ou fréquemment exécutées d’un programme qui nécessitent des performances élevées et une faible latence.

Stratégies de conception

L’optimisation du code des coûts signifie améliorer le code pour obtenir les mêmes fonctionnalités avec moins de ressources par instance, telles que les cycles du processeur, la mémoire et le stockage. En réduisant la consommation de ressources, vous pouvez économiser de l’argent lorsque les applications gèrent de grands volumes de données ou subissent 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 en matière de mise à l’échelle, de droits, de redondance et de limitation. Après avoir pris en charge ces éléments fondamentaux, vous pouvez envisager l’optimisation du code.

Vous ne savez peut-être pas si votre code est 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 qu’il ne le devrait.

instrumentalisation de votre code

L’instrumentation de code consiste à ajouter des extraits de code ou des 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 des 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 informations sur les chemins d’accès à chaud du code, identifier les goulots d’étranglement des performances et optimiser le code pour améliorer l’efficacité et la rentabilité.

Dans un environnement idéal, vous devez effectuer une analyse du code au début du cycle de vie du développement logiciel. Plus tôt vous interceptez un problème de code, moins il est nécessaire de le résoudre.

Automatisez autant que possible cette analyse de 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 fournit la compréhension la plus claire de l’optimisation du code.

Compromis : les outils de surveillance du code sont susceptibles d’augmenter les coûts.

Identifier et optimiser les chemins d’accès chauds

En instrumentant votre code, vous pouvez mesurer la consommation de ressources des chemins de code. Ces mesures vous aident à identifier les chemins chauds. Les chemins d’accès chauds ont un effet significatif sur les performances et l’utilisation des ressources. Il s’agit de sections critiques ou fréquemment exécutées d’un programme qui nécessitent des performances élevées et une faible latence.

Pour identifier les chemins d’accès chauds, envisagez les 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 qui prennent beaucoup de temps.

  • Mesurer les performances : utilisez des outils de profilage ou des infrastructures de test des performances pour mesurer le temps d’exécution et la consommation de ressources des chemins de code. Cette mesure permet d’identifier les goulots d’étranglement et les domaines à améliorer.

  • Tenez compte de la logique métier et de l’effet utilisateur : évaluez l’importance des chemins de code en fonction de leur pertinence par rapport aux fonctionnalités de l’application ou aux opérations métier critiques. Déterminez quels chemins de code sont essentiels pour fournir de la valeur aux utilisateurs ou répondre aux exigences de performances.

    Passez en revue les recommandations en matière de performances spécifiques au langage de programmation avec lequel vous travaillez. Évaluez votre code par rapport à ces recommandations pour identifier les domaines à améliorer. Supprimez toutes les opérations inutiles dans le chemin de code qui peuvent affecter les performances.

  • Supprimer 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 qui 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 une journalisation excessive peut affecter les performances. Évaluez la nécessité de chaque opération de journalisation et supprimez tous les appels de journalisation inutiles qui ne sont pas critiques pour l’analyse des performances.

  • Optimiser les boucles et les conditionnels : analysez 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 des calculs ou des transformations redondants. Éliminez ces opérations inutiles pour améliorer l’efficacité de votre code.

  • Réduire les requêtes réseau : si votre code effectue des requêtes réseau, réduisez le nombre de requêtes et optimisez leur utilisation. Traiter les demandes par lot lorsque cela est possible et éviter les allers-retours inutiles pour améliorer les performances.

  • Réduire les allocations : identifiez les zones où une 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 de 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 en matière de données et éliminez les champs ou propriétés inutiles. Optimisez l’utilisation de la mémoire en sélectionnant les types de données appropriés et en empaquetant efficacement les données.

  • Évaluer les implémentations transversales : tenez compte des effets des implémentations transversales, telles que les intergiciels ou les vérifications de jetons. Évaluez s’ils affectent négativement les performances.

Compromis : L’optimisation du code et des chemins d’accès chauds nécessite une expertise des développeurs dans l’identification des 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 de déterminer si le traitement asynchrone, le multithreading ou le multitraitement peuvent optimiser l’utilisation des ressources et réduire les dépenses. En utilisant le traitement asynchrone, le multithreading ou le multitraitement, vous pouvez gérer plus de tâches avec les mêmes ressources. Toutefois, il est essentiel d’assurer une implémentation appropriée pour éviter plus de surcharge et maintenir la rentabilité.

Pour déterminer si l’utilisation de la concurrence est adaptée, vous pouvez suivre ces instructions :

  • Traitement asynchrone : le traitement asynchrone permet une exécution sans blocage. Par exemple, vous pouvez démarrer un processus, puis le suspendre pour permettre à un deuxième processus de se terminer.

    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, par async/await exemple 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 longues ou gourmandes en E/S du thread d’exécution main à l’aide de méthodes asynchrones ou de rappels. Utilisez des API asynchrones ou des bibliothèques que votre langage de programmation ou votre 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 à des ressources partagées. Envisagez d’utiliser des abstractions de niveau supérieur, comme 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 de concurrence.

  • Multitraitement : 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 de multitraitement. Par exemple, considérez le module multitraitement en Python ou les 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 de multitraitement pour créer et gérer des processus parallèles. Distribuez la charge de travail entre ces API ou bibliothèques. Pour activer la coordination et le partage de données entre plusieurs processus, implémentez des mécanismes de communication tels que la communication interprocessus (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 les 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 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 dans votre codebase en suivant la documentation et les instructions fournies.

  • Surveiller l’utilisation des ressources et optimiser le code : surveillez l’utilisation des ressources avec le Kit de développement logiciel (SDK) implémenté. Collectez 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 la même fonctionnalité ou une fonctionnalité similaire à moindre coût, cela vaut la peine d’être pris en compte. En choisissant un système d’exploitation moins cher, vous pouvez potentiellement réduire le coût des licences et des coûts d’infrastructure.

Le système d’exploitation approprié peut contribuer à l’optimisation globale des coûts pour votre charge de travail. Pour choisir le système d’exploitation adapté à votre charge de travail, essayez les activités suivantes :

  • Évaluez vos besoins : comprenez les besoins spécifiques de votre charge de travail, notamment les langages de codage et les frameworks que vous utilisez. Tenez compte des dépendances ou des intégrations avec d’autres systèmes.

  • Tenez compte de la compatibilité : vérifiez que le système d’exploitation que vous choisissez est compatible avec vos langages de codage, vos infrastructures et les bibliothèques ou outils tiers que vous utilisez. Consultez la documentation et le support de la communauté pour le système d’exploitation pour vous assurer qu’il est compatible avec votre pile technologique.

  • Évaluer les fonctionnalités : déterminez si l’autre système d’exploitation prend en charge la même fonctionnalité ou des fonctionnalités similaires 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 de 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.

  • Tenez compte des performances et de l’optimisation : évaluez les performances et les fonctionnalités d’optimisation du système d’exploitation alternatif. Recherchez des benchmarks, des études de cas ou des comparaisons de performances pour comprendre comment ils fonctionnent dans des scénarios réels.

  • Passer 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 le support de la communauté pour vous assurer que le système d’exploitation est activement géré et qu’il est sécurisé et stable dans l’ensemble.

  • Prendre en compte le support du fournisseur : évaluez le niveau de prise en charge du fournisseur disponible pour l’autre système d’exploitation. Vérifiez s’il existe des canaux de support officiels, de la documentation et une communauté d’utilisateurs qui peuvent vous aider si vous en avez besoin.

Optimiser la traversée réseau

L’optimisation de la traversée 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 transmettez uniquement les informations essentielles. Par exemple, si un composant demande à plusieurs reprises les mêmes données d’un autre composant, il est candidat à l’optimisation. Vous pouvez refactoriser votre code pour réduire les appels inutiles ou les demandes par lots, ce qui réduit les données transférées. Les applications peuvent envoyer des objets entiers ou des structures de données quand 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 des suggestions suivantes :

  • Choisir des protocoles efficaces : sélectionnez des protocoles connus pour leur efficacité en termes de vitesse de transfert de données et de réduction de la surcharge. Par exemple, envisagez d’utiliser des protocoles comme 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 améliore les performances et réduit l’utilisation de la bande passante. La compression côté serveur est généralement activée dans le code de l’application ou la configuration du serveur.

  • Utiliser le regroupement de connexions : le regroupement de connexions permet de réutiliser les 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 et à la suppression de la connexion. Choisissez une bibliothèque ou une infrastructure de regroupement de connexions et configurez-le pour répondre aux besoins de charge de travail.

  • Implémenter 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 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 réseau globales.

Considérez les techniques suivantes :

  • Réduire les demandes redondantes : analysez le code pour identifier les demandes en double ou inutiles. Au lieu d’effectuer plusieurs demandes pour les mêmes données, vous pouvez modifier le code pour récupérer les données une seule fois et les réutiliser si nécessaire.

  • Optimiser la taille des données : passez en revue les données transmises entre les composants ou les systèmes et recherchez les possibilités de réduire leur 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 par lot 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 diminue 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 de données ou d’objets complexes dans un format qui peut être facilement transmis sur un réseau ou stockés dans un système de stockage persistant. Cette stratégie consiste à représenter les données dans un format standardisé, afin que les données puissent être transmises, traitées et reconstruites efficacement à l’extrémité de la réception.

    Sélectionnez un format de sérialisation compact, rapide et adapté aux besoins 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 réseau. 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é, lisible 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 une logique pour sérialiser des objets ou des structures de données dans le format choisi et les désérialiser dans leur forme 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 consiste à simplifier les modèles et les 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 consiste à stocker les données fréquemment consultées plus près des composants qui en ont besoin. Cette technique réduit le besoin de traversée réseau en fournissant les données à partir du cache au lieu de les extraire sur le réseau.

Considérez les mécanismes de mise en cache suivants :

  • Utiliser un cache externe : une solution de mise en cache populaire est un réseau de distribution de contenu. Il permet de réduire la latence et de réduire la traversée réseau en mettant en cache le contenu statique plus près des consommateurs.

  • Régler les paramètres de mise en cache : configurez les paramètres de mise en cache, tels que la durée de vie (TTL), pour optimiser les avantages de la mise en cache tout en minimisant 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.

  • Utiliser 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 de l’application avec 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 à l’exécution 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 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 consulté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 la surindexation, 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 de données spécifiques et en réduisant au minimum la récupération des données inutiles. 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 mise en 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 ultérieures de la même requête peuvent ensuite être servies à partir du cache, ce qui élimine la nécessité d’opérations de base de données coûteuses.

  • Utilisez une infrastructure de mappage d’objet relationnel (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 qu’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 des tables, variables et curseurs temporaires 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 la division d’un jeu de données volumineux en sous-ensembles plus petits et plus faciles à gérer, 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 entre les serveurs. Cette technique peut améliorer la scalabilité, réduire les conflits et optimiser l’utilisation des ressources.

  • Partitionnement : le partitionnement est une technique qui consiste à diviser horizontalement les données sur plusieurs instances ou serveurs de base de données. Chaque partition contient un sous-ensemble de 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 la réduction de la taille des données pour réduire les besoins en stockage et améliorer l’efficacité du transfert de données. Étant donné que les données compressées occupent moins d’espace disque, cela permet d’économiser sur les 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, considérez un scénario dans lequel vous disposez d’un jeu de données volumineux d’informations client. En partitionnant les données en fonction des régions ou des données démographiques du client, vous pouvez répartir 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 l’architecture

Évaluez votre architecture de charge de travail pour identifier les opportunités d’optimisation des ressources. L’objectif est d’utiliser les bons services pour le bon travail.

Pour atteindre cet objectif, vous devrez peut-être reconcevoir des parties de l’architecture afin d’utiliser moins de ressources. Envisagez les services managés ou serverless et optimisez l’allocation des 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 des problèmes de conception récurrents. Ils fournissent une approche structurée de la conception de code qui est efficace, maintenable et scalable.

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’éviter la consommation inutile de ressources en fournissant un mécanisme permettant de gérer et de récupérer les défaillances de manière contrôlée.

Les modèles de conception peuvent aider à optimiser les coûts du code des manières suivantes :

  • 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 faire gagner du temps de développement. En suivant les modèles établis, les développeurs peuvent éviter les tâches répétitives et se concentrer sur l’implémentation des exigences spécifiques de leurs applications.

  • Amélioration de la maintenabilité : les modèles de conception favorisent le code modulaire et structuré, plus facile à comprendre, à modifier et à gérer. Elles peuvent entraîner des économies 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. Des modèles tels que le modèle Cache-Aside peuvent améliorer les performances en mettant en cache les données fréquemment consultées pour 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 les 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 tutoriels et les exemples 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 votre configuration de charge de travail pour vous assurer qu’elle s’aligne sur vos exigences actuelles. Envisagez d’ajuster les paramètres de dimensionnement et de configuration des ressources en fonction des demandes de charge de travail. En optimisant les configurations, vous pouvez allouer efficacement des ressources et éviter le surapprovisionnement pour réduire les coûts.

Architecture de refactorisation

Évaluez votre architecture de charge de travail et identifiez les opportunités de refactorisation ou de refonte 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 obtenir une meilleure utilisation des ressources et une meilleure rentabilité.

Modifier la taille des 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 les paramètres de dimensionnement et de configuration des ressources pour optimiser la consommation des ressources.

Envisagez de faire des droits sur les machines virtuelles, d’ajuster l’allocation de mémoire et d’optimiser la capacité de stockage. En droits des ressources, vous pouvez éviter les coûts inutiles associés à la sous-utilisation ou au surapprovisionnement.

Compromis : Le remaniement du code et de l’architecture peut ne pas correspondre aux planifications de projet actuelles et peut entraîner des retards de planification et de coûts.

Animation Azure

Instrumentation du code : 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 d’accès à chaud et d’optimisation : 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 SDK appropriés : Azure propose 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 pour réduire le besoin d’implémentation personnalisée.

Optimisation de la traversée réseau : différents services Azure prennent en charge les protocoles réseau à haut débit 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.

Azure prend en charge le traitement par lots dans différents services, ce qui vous permet de regrouper plusieurs opérations et de 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, Azure prend en charge 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 tels que Azure Cache pour Redis. Vous pouvez utiliser la mise en cache pour stocker les données fréquemment consulté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 comme 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 objet-relationnel (ORM) : Azure prend en charge les frameworks ORM comme Entity Framework. Ces infrastructures simplifient l’accès aux données et le mappage entre du code orienté objet et des 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 à des fins d’évolutivité et d’optimisation des 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 d’architecture et des modèles de conception pour la conception d’applications évolutives, résilientes et performantes. Pour plus d’informations, consultez Concevoir des modèles.

Liste de contrôle d’optimisation des coûts

Reportez-vous à l’ensemble complet de recommandations.