Share via


Raccomandazioni 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 i consigli per ottimizzare i costi del codice. L'ottimizzazione del codice è il processo di miglioramento dell'efficienza, delle prestazioni e dell'efficacia dei costi del codice dell'applicazione. L'ottimizzazione efficace del codice comporta modifiche apportate 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 causare un aumento del consumo delle risorse e 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 La pratica di aggiungere 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 ricostruirli 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 del codice significa migliorare il codice per ottenere la stessa funzionalità con meno risorse per istanza, ad esempio cicli cpu, memoria e archiviazione. Riducendo il consumo delle 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 altre attività di ottimizzazione dei costi per ridimensionare, diritti, ridondanza e limitazione. Dopo aver preso cura di questi elementi fondamentali, è possibile considerare l'ottimizzazione del codice.

Potrebbe non essere possibile sapere se si dispone di codice inefficiente. Le funzionalità di scalabilità automatica e affidabilità serverless 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 procedura di strumentazione del codice è l'aggiunta di 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 della CPU o della memoria) e il tempo di esecuzione. Grazie alla strumentazione del 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'efficacia dei costi.

In un ambiente ideale, è necessario 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.

Automatizzare la maggior parte di questa analisi del codice il più possibile. Usare strumenti dinamici e statici per l'analisi del codice per ridurre l'impegno manuale. Tuttavia, tenere presente che questo test è ancora una simulazione di produzione. La produzione offre la comprensione più chiara dell'ottimizzazione del codice.

Compromesso: è probabile che gli strumenti di monitoraggio del codice aumentino i costi.

Identificare e ottimizzare i percorsi ad accesso frequente

Grazie alla strumentazione del 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 sull'utilizzo delle prestazioni e 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 usano risorse significative, ad esempio le operazioni CPU, memoria o I/O. Cercare modelli o sezioni di codice che vengono spesso eseguiti o richiedere molto tempo per completare.

  • Misurare le prestazioni: usare strumenti di profilatura o 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 utente: valutare l'importanza dei percorsi di codice in base alla pertinenza alle funzionalità dell'applicazione o alle operazioni aziendali critiche. Determinare quali percorsi di codice sono cruciali per offrire valore agli utenti o soddisfare i requisiti di prestazioni.

    Esaminare i consigli sulle prestazioni specifici del linguaggio di programmazione in uso. Valutare il codice rispetto a queste raccomandazioni per identificare le aree per il miglioramento. Rimuovere eventuali operazioni non necessarie all'interno del percorso del codice che potrebbero influire sulle prestazioni.

  • Rimuovere chiamate di funzione non necessarie: esaminare il codice. Identificare tutte 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 di memoria eccessiva. 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 dei dati, ad esempio 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 la compressione dei dati in modo efficiente.

  • Valutare le implementazioni incrociate: considerare gli effetti delle implementazioni incrociate, 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 nell'identificazione dell'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 multiprocessing può ottimizzare l'utilizzo delle risorse e ridurre le spese. Usando l'elaborazione asincrona, il multithreading o il multiprocessing, è possibile gestire più attività con le stesse risorse. Tuttavia, è fondamentale garantire un'implementazione appropriata per evitare un sovraccarico maggiore e mantenere l'efficacia dei costi.

Per valutare se l'uso della concorrenza è adatto, è possibile seguire queste linee guida:

  • Elaborazione asincrona: l'elaborazione asincrona consente l'esecuzione non bloccata. Ad esempio, è possibile avviare un processo e quindi sospendere il processo 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 usati 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 bloccata delle attività. Decodificare operazioni a esecuzione prolungata o di I/O dal thread di esecuzione principale usando metodi asincroni o callback. Usare API o librerie asincrone fornite dal linguaggio di programmazione o dal framework per gestire i flussi di lavoro asincroni.

  • Multithreading: in multithreading si eseguono più thread di un singolo processo simultaneamente.

    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 in uso 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 sicurezza dei thread e impedire le condizioni di gara quando il codice accede alle risorse condivise. È consigliabile usare astrazioni di livello superiore, ad esempio pool di thread o librerie parallelismo basate su attività, per semplificare la gestione di più thread e semplificare il controllo di concorrenza.

  • Multiprocessing: il multiprocessing 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 relative funzionalità di multiprocessore. Si consideri ad esempio il modulo di multi-elaborazione 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 consentire 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. Prendere in considerazione 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 simile a un costo inferiore, vale la pena prendere in considerazione. Scegliendo un sistema operativo più economico, è possibile ridurre potenzialmente i costi delle licenze 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 e i framework di codifica usati. 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 simile 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 prestazioni e le funzionalità di ottimizzazione del sistema operativo alternativo. Cercare benchmark, case study o confronti delle prestazioni per comprendere le prestazioni eseguite in scenari reali.

  • Esaminare sicurezza e 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 ed è 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 ufficiali, documentazione e una community di utenti che possono fornire assistenza se necessario.

Ottimizzare l'attraversamento della rete

L'ottimizzazione dell'attraversamento della 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 per 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 delle risorse.

Prendere in considerazione questi suggerimenti:

  • Scegliere protocolli efficienti: selezionare i 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.

  • Utilizzare il 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 della configurazione e del riavvio 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 a 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, valutare la possibilità di inviare in batch più richieste più piccole in una singola richiesta più grande. 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 prevede 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 dei dati strutturati. Usa file di definizione tipizzata per definire le strutture dei messaggi.
    MessagePack Formato di serializzazione binaria per la trasmissione compatta attraverso il cavo. Supporta vari tipi di dati e offre prestazioni veloci 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 e una deserializzazione efficienti. 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 deserializzare le strutture 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 dei dati a cui si accede di frequente più vicino ai componenti che lo richiedono. Questa tecnica riduce la necessità di attraversamento della rete servendo i dati dalla cache anziché recuperarlo sulla rete.

Considerare questi meccanismi di memorizzazione nella cache:

  • Usare una cache esterna: una soluzione di memorizzazione nella cache comune è una rete di distribuzione del contenuto. 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 il tempo di vita (TTL), per ottimizzare il vantaggio della memorizzazione nella cache riducendo al minimo 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 può aiutare a 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 dell'applicazione nel database. Ecco alcune considerazioni fondamentali e tecniche per ottimizzare il 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 query frequenti, è possibile ridurre notevolmente il tempo necessario per eseguire 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 con accesso più frequente e creare indici su tali colonne per velocizzare il recupero dei dati. Analizzare e ottimizzare regolarmente gli indici esistenti per garantire 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 necessari. Iniziare usando i tipi di join appropriati (ad esempio, join interno e join sinistro), 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 della query 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, che elimina la necessità di operazioni di database costose.

  • Usare un framework ORM (Object-Relational Mapping): Usare funzionalità ORM, ad esempio caricamento ritardato, memorizzazione nella cache e elaborazione batch per ottimizzare il recupero dei dati e ridurre al minimo i round trip del database. Usare framework ORM, ad esempio 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 efficiente e il recupero 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 suddivisione 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 è 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 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 su 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 in 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 l'architettura

Valutare l'architettura del carico di lavoro per identificare le opportunità per l'ottimizzazione delle risorse. L'obiettivo è usare i servizi giusti per il corretto lavoro.

Per raggiungere questo obiettivo, potrebbe essere necessario riprogettare parti dell'architettura per usare meno risorse. Considerare i servizi serverless o gestiti e ottimizzare l'allocazione delle risorse. Ottimizzando l'architettura, è possibile soddisfare i requisiti funzionali e non funzionali, mentre si usano meno risorse per istanza.

Usare modelli di progettazione

I modelli di progettazione sono soluzioni riutilizzabili che consentono agli sviluppatori di risolvere i problemi di progettazione ricorrenti. Forniscono un approccio strutturato alla progettazione del codice efficiente, gestibile e scalabile.

I modelli di progettazione consentono di ottimizzare l'uso delle risorse di sistema fornendo linee guida per l'allocazione e la gestione delle risorse efficienti. Ad esempio, il modello Di interruzione circuito consente di evitare l'utilizzo di risorse non necessarie fornendo un meccanismo per gestire e ripristinare da errori in modo controllato.

I modelli di progettazione consentono di ottimizzare il codice per ottimizzare i costi nei modi seguenti:

  • Tempo di sviluppo ridotto: i modelli di progettazione offrono soluzioni comprovate ai problemi di progettazione comuni, che possono risparmiare tempo di sviluppo. Seguendo i modelli stabiliti, gli sviluppatori possono evitare lavoro ripetitivo e concentrarsi sull'implementazione dei requisiti specifici delle applicazioni.

  • Miglioramento della gestibilità: i modelli di progettazione promuovono codice modulare e strutturato più semplice da comprendere, modificare e gestire. Possono comportare risparmi sui costi in termini di riduzione del debug e delle attività di manutenzione.

  • Scalabilità e prestazioni: i modelli di progettazione consentono di progettare sistemi scalabili e efficienti. I modelli come il modello di Cache-Aside possono migliorare le prestazioni memorizzando nella cache i dati con accesso 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. Prendere in considerazione l'identificazione del modello appropriato per un problema, la comprensione della struttura e dei componenti e l'integrazione del modello nella progettazione complessiva.

Sono disponibili varie risorse, ad esempio documentazione, esercitazioni e codice di esempio. Queste risorse consentono agli sviluppatori di imparare e implementare in modo efficace i modelli di progettazione.

Modificare le configurazioni

Esaminare e aggiornare regolarmente la configurazione del carico di lavoro per assicurarsi che sia allineata ai requisiti correnti. È consigliabile 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 overprovisioning 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 le 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 una migliore utilizzo delle risorse e 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.

Considerare i diritti delle macchine virtuali, la modifica dell'allocazione della memoria e l'ottimizzazione della capacità di archiviazione. Grazie ai diritti delle risorse, è possibile evitare costi non necessari associati alla sottoutilizzazione o al overprovisioning.

Compromesso: la rilaborazione del codice e dell'architettura potrebbe non adattarsi alle pianificazioni correnti del progetto e potrebbe causare la pianificazione e lo scorrimento dei costi.

Facilitazione di Azure

Strumento di 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 di percorsi ad accesso frequente e ottimizzato: Application Insights e Application Insights Profiler consentono di identificare e ottimizzare i percorsi di 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.

Usando gli 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.

Azure supporta l'elaborazione batch in vari servizi, in modo da poter raggruppare più operazioni ed eseguirle in una singola richiesta. L'elaborazione batch può migliorare notevolmente l'efficienza e ridurre il sovraccarico di rete.

Per quanto riguarda la serializzazione dei dati, Azure supporta 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 con accesso frequente più vicino all'applicazione, che comporta un recupero più veloce e una riduzione del carico back-end.

  • Indicizzazione e ottimizzazione delle query: I servizi di Azure come Azure SQL Database 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): Azure supporta framework ORM come Entity Framework. Questi framework semplificano l'accesso ai dati e il mapping tra il codice orientato agli oggetti e i database NoSQL.

  • Ottimizzazione delle stored procedure: È possibile usare servizi di Azure come Azure SQL Database per creare e ottimizzare le stored procedure. Le stored procedure possono migliorare le prestazioni riducendo i round trip di rete e precompilando le istruzioni SQL.

  • Partizionamento e partizionamento orizzontale: Azure offre funzionalità di partizionamento e partizionamento orizzontale nei servizi come Azure Cosmos DB e Azure SQL Database. È 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.

Elenco di controllo per l'ottimizzazione dei costi

Fare riferimento al set completo di raccomandazioni.