Suggerimenti per l'ottimizzazione dei costi del codice
Si applica a questa raccomandazione per l'ottimizzazione dei costi di Azure Well-Architected Framework:
CO:11 | Ottimizzare i costi del codice. Valutare e modificare il codice per soddisfare i requisiti funzionali e non funzionali con meno risorse o meno costose. |
---|
Questa guida descrive le raccomandazioni per l'ottimizzazione dei costi del codice. L'ottimizzazione del codice è il processo di miglioramento dell'efficienza, delle prestazioni e dell'efficienza del codice dell'applicazione. Un'ottimizzazione efficace del codice comporta modifiche al codice per ridurre il consumo delle risorse, ridurre al minimo il tempo di esecuzione e migliorare le prestazioni complessive.
Ottimizzando il codice, è possibile identificare ed eliminare inefficienze che potrebbero portare a un maggiore consumo di risorse e a costi più elevati. È possibile ridurre il tempo di elaborazione, l'utilizzo della memoria e il sovraccarico di rete, che può causare applicazioni più veloci e più reattive. Prestazioni migliorate migliorano l'esperienza utente e consentono al sistema di gestire in modo efficiente carichi di lavoro più grandi.
Definizioni
Termine | Definizione |
---|---|
Strumentazione del codice | Procedura di aggiunta di frammenti di codice o librerie al codice che raccolgono dati e monitorano le prestazioni del codice durante il runtime. |
Concorrenza | Esecuzione di più processi contemporaneamente. |
Serializzazione dei dati | Processo di conversione di oggetti dati in un formato che può essere archiviato o trasmesso e quindi ricostruirlo nel formato originale quando necessario. |
Percorsi ad accesso frequente | Sezioni critiche o frequenti di un programma che richiedono prestazioni elevate e bassa latenza. |
Strategie di progettazione chiave
L'ottimizzazione dei costi del codice implica il miglioramento del codice per ottenere la stessa funzionalità con un minor numero di risorse per istanza, ad esempio cicli cpu, memoria e archiviazione. Riducendo il consumo di risorse, è possibile risparmiare denaro quando le applicazioni gestiscono grandi volumi di dati o riscontrano carichi di traffico elevati.
I miglioramenti del codice sono più efficaci quando si seguono altri sforzi di ottimizzazione dei costi per ridimensionare, diritti, ridondanza e limitazione. Dopo aver preso cura di questi elementi fondamentali, è possibile prendere in considerazione l'ottimizzazione del codice.
Si potrebbe non sapere se si dispone di codice inefficiente. Le funzionalità serverless, scalabilità automatica e affidabilità possono mascherare l'inefficienze del codice. Le strategie seguenti consentono di identificare e correggere il codice dell'applicazione che costa più di quanto dovrebbe.
Instrumentare il codice
La strumentazione del codice è la procedura per aggiungere frammenti di codice o librerie che raccolgono dati e monitorano le prestazioni del codice durante il runtime. Consente agli sviluppatori di raccogliere informazioni sulle metriche chiave, ad esempio il consumo di risorse (utilizzo cpu o memoria) e il tempo di esecuzione. Instrumentando il codice, gli sviluppatori possono ottenere informazioni dettagliate sui percorsi ad accesso frequente del codice, identificare i colli di bottiglia delle prestazioni e ottimizzare il codice per migliorare l'efficienza e l'efficienza dei costi.
In un ambiente ideale, è consigliabile eseguire l'analisi del codice all'inizio del ciclo di vita dello sviluppo software. In precedenza si rileva un problema di codice, più economico è risolvere il problema.
Automatizzare la maggior parte di questa analisi del codice possibile. Usare strumenti dinamici e statici per l'analisi del codice per ridurre il lavoro manuale. Tenere tuttavia presente che questo test è ancora una simulazione della produzione. L'ambiente di produzione fornisce la comprensione più chiara dell'ottimizzazione del codice.
Compromesso: è probabile che gli strumenti di monitoraggio del codice aumentino i costi.
Ottimizzare i percorsi ad accesso frequente
Instrumentando il codice, è possibile misurare l'utilizzo delle risorse dei percorsi di codice. Queste misurazioni consentono di identificare i percorsi ad accesso frequente. I percorsi ad accesso frequente hanno un effetto significativo sulle prestazioni e sull'utilizzo delle risorse. Sono sezioni critiche o frequenti di un programma che richiedono prestazioni elevate e bassa latenza.
Per identificare i percorsi ad accesso frequente, prendere in considerazione queste attività:
Analizzare i dati di runtime: raccogliere e analizzare i dati di runtime per identificare le aree del codice che utilizzano risorse significative, ad esempio cpu, memoria o operazioni di I/O. Cercare modelli o sezioni di codice che vengono eseguiti di frequente o che richiedono molto tempo per il completamento.
Misurare le prestazioni: usare gli strumenti di profilatura o i framework di test delle prestazioni per misurare il tempo di esecuzione e il consumo delle risorse dei percorsi di codice. Questa misurazione consente di identificare colli di bottiglia e aree per migliorare.
Prendere in considerazione la logica di business e l'effetto dell'utente: valutare l'importanza dei percorsi di codice in base alla pertinenza delle funzionalità dell'applicazione o alle operazioni aziendali critiche. Determinare quali percorsi di codice sono fondamentali per offrire valore agli utenti o soddisfare i requisiti di prestazioni.
Esaminare le raccomandazioni sulle prestazioni specifiche del linguaggio di programmazione con cui si sta lavorando. Valutare il codice in base a queste raccomandazioni per identificare le aree per il miglioramento. Rimuovere tutte le operazioni non necessarie all'interno del percorso del codice che potrebbero influire sulle prestazioni.
Rimuovere le chiamate di funzione non necessarie: esaminare il codice. Identificare le funzioni che non sono essenziali per la funzionalità desiderata e potrebbero influire negativamente sulle prestazioni. Ad esempio, se una chiamata di funzione esegue una convalida eseguita in precedenza nel codice, è possibile rimuovere tale chiamata di funzione non necessaria.
Ridurre al minimo le operazioni di registrazione: la registrazione può essere utile per il debug e l'analisi, ma la registrazione eccessiva può influire sulle prestazioni. Valutare la necessità di ogni operazione di registrazione e rimuovere tutte le chiamate di registrazione non necessarie che non sono critiche per l'analisi delle prestazioni.
Ottimizzare cicli e condizionali: analizzare cicli e condizionali nel codice. Identificare eventuali iterazioni o condizioni non necessarie che è possibile eliminare. Semplificare e ottimizzare queste strutture può migliorare le prestazioni del codice.
Ridurre l'elaborazione dei dati non necessaria: esaminare il codice per eventuali operazioni di elaborazione dati non necessarie, ad esempio calcoli o trasformazioni ridondanti. Eliminare queste operazioni non necessarie per migliorare l'efficienza del codice.
Ridurre al minimo le richieste di rete: se il codice effettua richieste di rete, ridurre al minimo il numero di richieste e ottimizzare l'utilizzo. Richieste batch quando possibile ed evitare round trip non necessari per migliorare le prestazioni.
Ridurre al minimo le allocazioni: identificare le aree in cui si verifica un'allocazione eccessiva di memoria. Ottimizzare il codice riducendo le allocazioni non necessarie e riutilizzando le risorse esistenti, quando possibile.
Riducendo al minimo le allocazioni, è possibile migliorare l'efficienza della memoria e le prestazioni complessive. Usare le strategie appropriate di gestione della memoria e Garbage Collection per il linguaggio di programmazione.
Ridurre le dimensioni della struttura dei dati: valutare le dimensioni delle strutture di dati, ad esempio le classi, e identificare le aree in cui è possibile ridurre. Esaminare i requisiti dei dati ed eliminare eventuali campi o proprietà non necessari. Ottimizzare l'utilizzo della memoria selezionando i tipi di dati appropriati e inserendo i dati in modo efficiente.
Valutare le implementazioni trasversali: prendere in considerazione gli effetti delle implementazioni di taglio incrociato, ad esempio il middleware o i controlli dei token. Valutare se influiscono negativamente sulle prestazioni.
Compromesso: l'ottimizzazione del codice e dei percorsi ad accesso frequente richiede competenze per gli sviluppatori per identificare l'inefficienze del codice. Questi individui altamente qualificati potrebbero dover dedicare tempo ad altre attività.
Valutare l'uso della concorrenza
La valutazione dell'uso della concorrenza comporta la valutazione dell'elaborazione asincrona, del multithreading o del multiprocessore può ottimizzare l'utilizzo delle risorse e ridurre le spese. Tramite l'elaborazione asincrona, ovvero il multithreading o il multiprocessore, è possibile gestire più attività con le stesse risorse. Tuttavia, è fondamentale garantire un'implementazione corretta per evitare un sovraccarico maggiore e mantenere l'efficienza dei costi.
Per valutare se l'uso della concorrenza è una scelta ottimale, è possibile seguire queste linee guida:
Elaborazione asincrona: l'elaborazione asincrona consente l'esecuzione non bloccante. Ad esempio, è possibile avviare un processo e quindi sospenderlo per consentire il completamento di un secondo processo.
Determinare i componenti o le operazioni di codice che è possibile eseguire in modo asincrono. Identificare il linguaggio di programmazione o il framework in uso e comprendere il modello di programmazione asincrono supportato, ad esempio
async
/await
in .NET o promesse in JavaScript.Ristrutturare il codice per usare costrutti di programmazione asincroni abilitando l'esecuzione non bloccante delle attività. Separare le operazioni a esecuzione prolungata o con utilizzo intensivo di I/O dal thread di esecuzione principale usando metodi asincroni o callback. Usare API asincrone o librerie fornite dal linguaggio di programmazione o dal framework per gestire flussi di lavoro asincroni.
Multithreading: nel multithreading si eseguono più thread di un singolo processo contemporaneamente.
Identificare le sezioni del codice che è possibile eseguire simultaneamente e in modo indipendente. Leggere la documentazione o le linee guida specifiche del linguaggio di programmazione o del framework usato per le procedure consigliate per il multithreading. Creare più thread o pool di thread per gestire l'esecuzione parallela delle attività.
Implementare meccanismi di sincronizzazione, ad esempio blocchi, mutex o semafori, per garantire la thread safety e prevenire le race condition quando il codice accede alle risorse condivise. È consigliabile usare astrazioni di livello superiore, ad esempio pool di thread o librerie di parallelismo basate su attività, per semplificare la gestione di più thread e semplificare il controllo della concorrenza.
Multiprocessing: il multiprocessore può avere processi eseguiti in parallelo. Può offrire un utilizzo migliore di più core CPU rispetto al multithreading.
Determinare se il carico di lavoro o le operazioni nel codice si prestano all'elaborazione parallela. Identificare il linguaggio di programmazione o il framework in uso ed esplorare le funzionalità di multiprocessore. Si consideri ad esempio il modulo di multiprocessore in Python o flussi paralleli in Java. Progettare il codice per suddividere il carico di lavoro in più attività indipendenti che possono essere elaborate contemporaneamente.
Usare API o librerie multiprocessore per creare e gestire processi paralleli. Distribuire il carico di lavoro tra queste API o librerie. Per abilitare il coordinamento e la condivisione dei dati tra più processi, implementare meccanismi di comunicazione come la comunicazione interprocesso (IPC), la memoria condivisa o il passaggio di messaggi, a seconda del linguaggio di programmazione o del framework.
Usare gli SDK corretti
Per l'ottimizzazione dei costi, selezionare SDK progettati per ottimizzare l'utilizzo delle risorse e migliorare le prestazioni. È importante valutare le funzionalità e le funzionalità di ogni SDK. Considerarne la compatibilità con il linguaggio di programmazione e l'ambiente di sviluppo.
Ecco le indicazioni per scegliere gli SDK migliori per il carico di lavoro:
Eseguire test delle prestazioni: confrontare l'utilizzo delle risorse e le prestazioni degli SDK tramite test delle prestazioni. Scegliere l'SDK più adatto alle proprie esigenze in termini di ottimizzazione delle risorse e miglioramento delle prestazioni. Integrare l'SDK scelto nella codebase seguendo la documentazione e le linee guida fornite.
Monitorare l'utilizzo delle risorse e ottimizzare il codice: monitorare l'utilizzo delle risorse con l'SDK implementato. Raccogliere informazioni dettagliate dal monitoraggio e dall'analisi per ottimizzare il codice.
Scegliere il sistema operativo corretto
La maggior parte dei linguaggi di codifica può essere eseguita in vari sistemi operativi, quindi è importante valutare il sistema operativo rispetto a alternative più economiche. Se un sistema operativo alternativo supporta la stessa funzionalità o una funzionalità simile a un costo inferiore, vale la pena prendere in considerazione. Scegliendo un sistema operativo più economico, è possibile ridurre potenzialmente il costo delle tariffe di licenza e i costi dell'infrastruttura.
Il sistema operativo corretto può contribuire all'ottimizzazione complessiva dei costi per il carico di lavoro. Per scegliere il sistema operativo appropriato per il carico di lavoro, provare queste attività:
Valutare i requisiti: comprendere le esigenze specifiche del carico di lavoro, inclusi i linguaggi di codifica e i framework in uso. Prendere in considerazione eventuali dipendenze o integrazioni con altri sistemi.
Valutare la compatibilità: assicurarsi che il sistema operativo scelto sia compatibile con i linguaggi di codifica, i framework e le librerie o gli strumenti di terze parti usati. Controllare la documentazione e il supporto della community per il sistema operativo per assicurarsi che abbia una buona compatibilità con lo stack di tecnologie.
Valutare la funzionalità: determinare se il sistema operativo alternativo supporta la stessa funzionalità o la stessa funzionalità del sistema operativo corrente. Valutare se fornisce le funzionalità e le funzionalità necessarie per il carico di lavoro.
Confrontare i costi: confrontare i costi associati ai sistemi operativi. Prendere in considerazione fattori come i costi di licenza, i costi di supporto e i requisiti dell'infrastruttura. Cercare alternative più economiche in grado di soddisfare i requisiti del carico di lavoro senza compromettere la funzionalità.
Valutare le prestazioni e l'ottimizzazione: valutare le funzionalità di prestazioni e ottimizzazione del sistema operativo alternativo. Cercare benchmark, case study o confronti delle prestazioni per comprendere le prestazioni eseguite in scenari reali.
Esaminare la sicurezza e la stabilità: valutare la sicurezza e la stabilità del sistema operativo alternativo. Cercare gli aggiornamenti della sicurezza, le patch e il supporto della community per garantire che il sistema operativo venga mantenuto attivamente e sia sicuro e stabile nel complesso.
Prendere in considerazione il supporto del fornitore: valutare il livello di supporto del fornitore disponibile per il sistema operativo alternativo. Controllare se sono presenti canali di supporto, documentazione e una community di utenti che possono fornire assistenza se necessario.
Ottimizzare il traffico di rete
L'ottimizzazione dell'attraversamento di rete consiste nel ridurre al minimo il traffico di rete tra i componenti del carico di lavoro. Il trasferimento dei dati comporta spesso un costo associato. Riducendo al minimo il traffico di rete, è possibile ridurre la quantità di dati che devono essere trasferiti riducendo i costi.
Analizzare il carico di lavoro e identificare eventuali trasferimenti di dati non necessari tra i componenti. Evitare di trasferire dati ridondanti o duplicati e trasmettere solo informazioni essenziali. Ad esempio, se un componente richiede ripetutamente gli stessi dati da un altro componente, è un candidato per l'ottimizzazione. È possibile effettuare il refactoring del codice per ridurre le chiamate non necessarie o le richieste batch, riducendo al minimo i dati trasferiti. Le applicazioni possono inviare interi oggetti o strutture di dati quando sono necessari solo alcuni campi. Ottimizzando il codice per inviare solo i dati necessari, è possibile ridurre al minimo le dimensioni di ogni trasferimento dei dati.
Ottimizzare i protocolli di rete
I protocolli di rete svolgono un ruolo fondamentale nell'efficienza della comunicazione di rete. Ottimizzando i protocolli di rete, è possibile migliorare l'efficienza complessiva del trasferimento dei dati e ridurre il consumo di risorse.
Prendere in considerazione questi suggerimenti:
Scegliere protocolli efficienti: selezionare protocolli noti per la loro efficienza in termini di velocità di trasferimento dei dati e riduzione del sovraccarico. Si consideri ad esempio l'uso di protocolli come HTTP/2 su HTTP/1.1. Questi protocolli sono progettati per migliorare le prestazioni riducendo la latenza e ottimizzando il trasferimento dei dati. Usare librerie e framework nell'applicazione per usare questi protocolli.
Supporto della compressione: implementare meccanismi di compressione nei protocolli di rete per ridurre le dimensioni dei dati trasferiti. La compressione può ridurre significativamente la quantità di dati trasmessi in rete, con conseguente miglioramento delle prestazioni e riduzione dell'utilizzo della larghezza di banda. La compressione lato server è in genere abilitata nel codice dell'applicazione o nella configurazione del server.
Utilizzo del pool di connessioni: il pool di connessioni consente il riutilizzo delle connessioni di rete stabilite per ridurre il sovraccarico di stabilire nuove connessioni per ogni richiesta. Il pool di connessioni può migliorare l'efficienza della comunicazione di rete evitando il sovraccarico di configurazione e disinstallazione della connessione. Scegliere una libreria o un framework di pool di connessioni e configurare per soddisfare le esigenze del carico di lavoro.
Implementare altre ottimizzazioni: esplorare altre ottimizzazioni specifiche per il carico di lavoro e l'ambiente di rete. Ad esempio, è possibile usare la memorizzazione nella cache del contenuto, il bilanciamento del carico e il data shaping del traffico per ottimizzare ulteriormente l'attraversamento della rete.
Ridurre al minimo il sovraccarico di rete
Ridurre al minimo la quantità di traffico di rete e il trasferimento dei dati tra i componenti del carico di lavoro. Riducendo il sovraccarico di rete, è possibile ridurre i costi associati ai dati in uscita e in ingresso e migliorare le prestazioni complessive della rete.
Considerare queste tecniche:
Ridurre le richieste ridondanti: analizzare il codice per identificare eventuali richieste duplicate o non necessarie. Anziché effettuare più richieste per gli stessi dati, è possibile modificare il codice per recuperare i dati una sola volta e riutilizzarlo in base alle esigenze.
Ottimizzare le dimensioni dei dati: esaminare i dati trasmessi tra componenti o sistemi e cercare opportunità per ridurre al minimo le dimensioni. Prendere in considerazione tecniche come la compressione dei dati prima della trasmissione o l'uso di formati di dati più efficienti. Riducendo le dimensioni dei dati, è possibile ridurre l'utilizzo della larghezza di banda di rete e migliorare l'efficienza complessiva.
Richieste batch: se applicabile, prendere in considerazione l'invio in batch di più richieste più piccole in una singola richiesta di dimensioni maggiori. L'invio in batch riduce il sovraccarico di stabilire più connessioni e riduce la trasmissione complessiva dei dati.
Usare la serializzazione dei dati: la serializzazione dei dati è il processo di conversione di strutture di dati o oggetti complessi in un formato che può essere facilmente trasmesso tramite una rete o archiviato in un sistema di archiviazione permanente. Questa strategia implica la rappresentazione dei dati in un formato standardizzato, in modo che i dati possano essere trasmessi, elaborati e ricostruiti in modo efficiente alla fine della ricezione.
Selezionare un formato di serializzazione compatto, veloce e adatto ai requisiti del carico di lavoro.
Formato di serializzazione Descrizione Protocol Buffers (protobuf) Formato di serializzazione binaria che offre codifica e decodifica efficienti di dati strutturati. Usa file di definizione tipizzato per definire le strutture dei messaggi. MessagePack Formato di serializzazione binaria per la trasmissione compatta in rete. Supporta vari tipi di dati e offre prestazioni rapide di serializzazione e deserializzazione. JavaScript Object Notation (JSON) Un formato di serializzazione dei dati ampiamente usato che è leggibile e facile da usare. JSON è basato su testo e offre un ampio supporto multipiattaforma. JSON binario (BSON) Un formato di serializzazione binario simile a JSON, ma progettato per una serializzazione efficiente e la deserializzazione. BSON include tipi di dati aggiuntivi che non sono disponibili in JSON. A seconda del formato di serializzazione, è necessario implementare la logica per serializzare oggetti o strutture di dati nel formato scelto e deserializzarli nuovamente nel formato originale. È possibile implementare questa logica usando librerie o framework che forniscono funzionalità di serializzazione per il formato.
Ottimizzare l'accesso ai dati
L'ottimizzazione dell'accesso ai dati si riferisce alla semplificazione dei modelli e delle tecniche per il recupero e l'archiviazione dei dati, per ridurre al minimo le operazioni non necessarie. Quando si ottimizza l'accesso ai dati, è possibile risparmiare sui costi riducendo l'utilizzo delle risorse, riducendo il recupero dei dati e migliorando l'efficienza dell'elaborazione dei dati. Prendere in considerazione tecniche come la memorizzazione nella cache dei dati, l'esecuzione efficiente di query sui dati e la compressione dei dati.
Usare i meccanismi di memorizzazione nella cache
La memorizzazione nella cache comporta l'archiviazione di dati a cui si accede di frequente più vicino ai componenti che lo richiedono. Questa tecnica riduce la necessità di attraversamento di rete servendo i dati dalla cache invece di recuperarli in rete.
Considerare questi meccanismi di memorizzazione nella cache:
Usare una cache esterna: una soluzione di memorizzazione nella cache comune è una rete per la distribuzione di contenuti. Consente di ridurre al minimo la latenza e ridurre l'attraversamento della rete memorizzando nella cache il contenuto statico più vicino ai consumer.
Ottimizzare i parametri di memorizzazione nella cache: configurare i parametri di memorizzazione nella cache, ad esempio la durata (TTL), per ottimizzare il vantaggio della memorizzazione nella cache riducendo al minimo i potenziali svantaggi. L'impostazione di un TTL appropriato garantisce che i dati memorizzati nella cache rimangano aggiornati e pertinenti.
Usare la memorizzazione nella cache in memoria: oltre alle soluzioni di memorizzazione nella cache esterna, è consigliabile implementare la memorizzazione nella cache in memoria nell'applicazione. La memorizzazione nella cache in memoria consente di usare le risorse di calcolo inattive e aumentare la densità di calcolo delle risorse allocate.
Ottimizzare il traffico del database
È possibile migliorare l'efficienza della comunicazione delle applicazioni con il database. Ecco alcune considerazioni e tecniche chiave per l'ottimizzazione del traffico del database:
Creare indici: l'indicizzazione è il processo di creazione di strutture di dati che migliorano la velocità di recupero dei dati. Creando indici su colonne sottoposte a query frequenti, è possibile ridurre significativamente il tempo necessario per l'esecuzione di query. Ad esempio, se si dispone di una tabella di utenti con una colonna per i nomi utente, è possibile creare un indice nella colonna nome utente per velocizzare le query che cercano nomi utente specifici.
Identificare le colonne a cui si accede più di frequente e creare indici in tali colonne per velocizzare il recupero dei dati. Analizzare e ottimizzare regolarmente gli indici esistenti per assicurarsi che siano ancora efficaci. Evitare l'over-indexing perché può influire negativamente sulle operazioni di inserimento e aggiornamento.
Ottimizzare le query: progettare query efficienti considerando i requisiti di dati specifici e riducendo al minimo il recupero dei dati non necessario. Iniziare usando i tipi di join appropriati ,ad esempio inner join e left join, in base alla relazione tra tabelle. Usare tecniche di ottimizzazione delle query, ad esempio hint di query, analisi del piano di query e riscrittura delle query per migliorare le prestazioni.
Risultati delle query della cache: è possibile archiviare i risultati delle query eseguite di frequente in memoria o in una cache. Le esecuzioni successive della stessa query possono quindi essere gestite dalla cache, eliminando così la necessità di operazioni di database costose.
Usare un framework ORM (Object-Relational Mapping): usare funzionalità ORM, ad esempio caricamento differita, memorizzazione nella cache ed elaborazione batch per ottimizzare il recupero dei dati e ridurre al minimo i round trip del database. Usare framework ORM come Entity Framework per C# o Hibernate per Java.
Ottimizzare le stored procedure: analizzare e ottimizzare la logica e le prestazioni delle stored procedure. L'obiettivo è evitare calcoli non necessari o query ridondanti nelle stored procedure. Ottimizzare l'uso di tabelle, variabili e cursori temporanei per ridurre al minimo l'utilizzo delle risorse.
Organizzare i dati
L'organizzazione dei dati per l'accesso e il recupero efficienti comporta la strutturazione e l'archiviazione dei dati in modo da ottimizzare le prestazioni e ridurre al minimo l'utilizzo delle risorse. Può migliorare i tempi di risposta delle query, ridurre i costi di trasferimento dei dati e ottimizzare l'utilizzo dell'archiviazione.
Ecco alcune tecniche per organizzare i dati in modo efficiente:
Partizione: il partizionamento comporta la divisione di un set di dati di grandi dimensioni in subset più piccoli e gestibili denominati partizioni. È possibile archiviare ogni partizione separatamente per consentire l'elaborazione parallela e migliorare le prestazioni delle query. Ad esempio, è possibile partizionare i dati in base a un intervallo specifico di valori o distribuendo i dati tra server. Questa tecnica può migliorare la scalabilità, ridurre la contesa e ottimizzare l'utilizzo delle risorse.
Partizione: il partizionamento orizzontale è una tecnica di divisione orizzontale dei dati tra più istanze o server di database. Ogni partizione contiene un subset dei dati e le query possono essere elaborate in parallelo tra queste partizioni. Il partizionamento orizzontale può migliorare le prestazioni delle query distribuendo il carico di lavoro e riducendo la quantità di dati a cui ogni query accede.
Compressione: la compressione dei dati comporta la riduzione delle dimensioni dei dati per ridurre al minimo i requisiti di archiviazione e migliorare l'efficienza del trasferimento dei dati. Poiché i dati compressi richiedono meno spazio su disco, consente di risparmiare sui costi di archiviazione. I dati compressi possono anche essere trasferiti più rapidamente sulle reti e ridurre i costi di trasferimento dei dati.
Si consideri, ad esempio, uno scenario in cui si dispone di un set di dati di grandi dimensioni di informazioni sui clienti. Partizionando i dati in base alle aree dei clienti o ai dati demografici, è possibile distribuire il carico di lavoro tra più server e migliorare le prestazioni delle query. È anche possibile comprimere i dati per ridurre i costi di archiviazione e migliorare l'efficienza del trasferimento dei dati.
Ottimizzare la progettazione della soluzione
Valutare l'architettura del carico di lavoro per identificare le opportunità di ottimizzazione delle risorse. L'obiettivo è usare i servizi giusti per il lavoro corretto.
Per raggiungere questo obiettivo, potrebbe essere necessario riprogettare parti dell'architettura per usare meno risorse. Prendere in considerazione i servizi serverless o gestiti e ottimizzare l'allocazione delle risorse. Ottimizzando l'architettura, è possibile soddisfare i requisiti funzionali e non funzionali, consumando al tempo stesso meno risorse per istanza.
Usare modelli di progettazione
I modelli di progettazione sono soluzioni riutilizzabili che consentono agli sviluppatori di risolvere problemi di progettazione ricorrenti. Forniscono un approccio strutturato alla progettazione di codice efficiente, gestibile e scalabile.
I modelli di progettazione consentono di ottimizzare l'uso delle risorse di sistema fornendo linee guida per un'efficiente allocazione e gestione delle risorse. Ad esempio, il modello interruttore consente di evitare il consumo di risorse non necessario fornendo un meccanismo per gestire e recuperare da errori in modo controllato.
I modelli di progettazione consentono di ottimizzare i costi del codice nei modi seguenti:
Riduzione del tempo di sviluppo: i modelli di progettazione offrono soluzioni comprovate ai problemi di progettazione comuni, che consentono di risparmiare tempo di sviluppo. Seguendo i modelli stabiliti, gli sviluppatori possono evitare il lavoro ripetitivo e concentrarsi sull'implementazione dei requisiti specifici delle applicazioni.
Manutenibilità migliorata: i modelli di progettazione promuovono codice modulare e strutturato più facile da comprendere, modificare e gestire. Possono comportare risparmi sui costi in termini di riduzione delle attività di debug e manutenzione.
Scalabilità e prestazioni: i modelli di progettazione consentono di progettare sistemi scalabili ed efficienti. I modelli come il modello Cache-Aside possono migliorare le prestazioni memorizzando nella cache i dati a cui si accede di frequente per ridurre la necessità di calcoli costosi o chiamate esterne.
Per implementare modelli di progettazione, gli sviluppatori devono comprendere i principi e le linee guida di ogni modello e applicarli nel codice. Valutare la possibilità di identificare il modello appropriato per un problema, comprenderne la struttura e i componenti e integrare il modello nella progettazione complessiva.
Sono disponibili varie risorse, ad esempio documentazione, esercitazioni e codice di esempio. Queste risorse consentono agli sviluppatori di apprendere e implementare modelli di progettazione in modo efficace.
Modificare le configurazioni
Esaminare e aggiornare regolarmente la configurazione del carico di lavoro per assicurarsi che sia allineata ai requisiti correnti. Valutare la possibilità di modificare le impostazioni di ridimensionamento e configurazione delle risorse in base alle esigenze del carico di lavoro. Ottimizzando le configurazioni, è possibile allocare in modo efficace le risorse ed evitare il provisioning eccessivo per risparmiare sui costi.
Architettura di refactoring
Valutare l'architettura del carico di lavoro e identificare le opportunità di refactoring o riprogettazione dei componenti per ottimizzare l'utilizzo delle risorse. Prendere in considerazione tecniche come l'adozione di un'architettura di microservizi, l'implementazione del modello di interruttore e l'uso del calcolo serverless. Ottimizzando l'architettura, è possibile ottenere un migliore utilizzo delle risorse e un'efficienza dei costi.
Modificare le dimensioni delle risorse
Monitorare e analizzare continuamente l'utilizzo delle risorse del carico di lavoro. In base ai modelli e alle tendenze osservati, modificare le impostazioni di ridimensionamento e configurazione delle risorse per ottimizzare l'utilizzo delle risorse.
Valutare la possibilità di modificare le macchine virtuali, regolare l'allocazione della memoria e ottimizzare la capacità di archiviazione. Con diritti sulle risorse, è possibile evitare costi non necessari associati alla sottoutilizzazione o all'overprovisioning.
Compromesso: la rielaborazione del codice e dell'architettura potrebbe non adattarsi alle pianificazioni correnti del progetto e potrebbe comportare la pianificazione e lo scorrimento dei costi.
Facilitazione di Azure
Strumentazione del codice: Azure offre strumenti di monitoraggio e registrazione come Monitoraggio di Azure, Application Insights e Log Analytics. È possibile usare questi strumenti per tenere traccia e analizzare le prestazioni e il comportamento del codice in tempo reale.
Identificazione dei percorsi ad accesso frequente e ottimizzazione: Application Insights e Application Insights Profiler consentono di identificare e ottimizzare i percorsi ad accesso frequente nel codice analizzando i tempi di esecuzione e l'utilizzo delle risorse. È possibile ridurre al minimo le allocazioni di memoria non necessarie e ottimizzare l'utilizzo della memoria con Profiler.
Uso degli SDK corretti: Azure offre SDK in più linguaggi di programmazione, ottimizzati per prestazioni e facilità d'uso. Questi SDK forniscono funzioni e librerie predefinite che interagiscono con i servizi di Azure per ridurre la necessità di implementazione personalizzata.
Ottimizzazione dell'attraversamento della rete: vari servizi di Azure supportano protocolli di rete ad alta velocità, ad esempio HTTP/2 e QUIC , per una comunicazione efficiente tra servizi e applicazioni.
Servizi di Azure, ad esempio Database di Azure per PostgreSQL - Server flessibile, supportano il pool di connessioni.
supporto tecnico di Azure l'elaborazione batch in vari servizi, in modo da poter raggruppare più operazioni ed eseguirle in una singola richiesta. L'elaborazione batch può migliorare significativamente l'efficienza e ridurre il sovraccarico di rete.
Per quanto riguarda la serializzazione dei dati, supporto tecnico di Azure vari formati di serializzazione, tra cui JSON e XML. Scegliere il formato di serializzazione appropriato in base alle dimensioni dei dati, ai requisiti di prestazioni e alle esigenze di interoperabilità.
Ottimizzazione dell'accesso ai dati: Azure offre servizi di memorizzazione nella cache come cache di Azure per Redis. È possibile usare la memorizzazione nella cache per archiviare i dati a cui si accede di frequente più vicino all'applicazione, il che comporta un recupero più rapido e una riduzione del carico back-end.
Indicizzazione e ottimizzazione delle query: i servizi di Azure come database SQL di Azure e Azure Cosmos DB offrono funzionalità di indicizzazione per ottimizzare le prestazioni delle query. Scegliendo la strategia di indicizzazione corretta e ottimizzando le query, è possibile migliorare l'efficienza complessiva del recupero dei dati.
Mapping relazionale a oggetti (ORM): supporto tecnico di Azure framework ORM come Entity Framework. Questi framework semplificano l'accesso ai dati e il mapping tra il codice orientato agli oggetti e i database relazionali o NoSQL.
Ottimizzazione delle stored procedure: è possibile usare servizi di Azure come database SQL di Azure per creare e ottimizzare le stored procedure. Le stored procedure possono migliorare le prestazioni riducendo i round trip di rete e precompilazione delle istruzioni SQL.
Partizionamento e partizionamento orizzontale: Azure offre funzionalità di partizionamento e partizionamento orizzontale in servizi come Azure Cosmos DB e database SQL di Azure. È possibile usare il partizionamento per distribuire i dati tra più nodi per la scalabilità e l'ottimizzazione delle prestazioni.
Compressione dei dati: i servizi di Azure supportano tecniche di compressione dei dati come GZIP e DEFLATE.
Ottimizzazione dell'architettura: Azure fornisce indicazioni sull'architettura e modelli di progettazione per la progettazione di applicazioni scalabili, resilienti ed efficienti. Per altre informazioni, vedere Modelli di progettazione.
Collegamenti correlati
- Monitoraggio di Azure
- Application Insights
- Log Analytics
- Application Insights Profiler
- Pool di connessioni
- Database di Azure per PostgreSQL - Pool di connessioni server flessibili
- Ottimizzazione dell'indice database SQL di Azure
- Criteri di indicizzazione di Azure Cosmos DB
- Partizionamento di Azure Cosmos DB
- partizionamento database SQL di Azure
Elenco di controllo per l'ottimizzazione dei costi
Fare riferimento al set completo di raccomandazioni.