Test delle prestazioni e antipattern per le applicazioni cloud

Gli antipattern delle prestazioni, analogamente ai modelli di progettazione, sono processi e implementazioni difettosi comuni all'interno delle organizzazioni. Si tratta di procedure comuni che causeranno problemi di scalabilità quando un'applicazione è sotto pressione. La consapevolezza di queste procedure può aiutare a semplificare la comunicazione di concetti di alto livello tra professionisti del software e la conoscenza degli antipattern può essere utile quando si esamina il codice o si diagnosticano i problemi di prestazioni.

Ecco uno scenario comune: un'applicazione si comporta correttamente durante i test delle prestazioni. Viene rilasciata nell'ambiente di produzione e inizia a gestire carichi di lavoro reali. A questo punto, le prestazioni iniziano a peggiorare: rifiuta le richieste utente, si blocca o genera eccezioni. Il team di sviluppo deve rispondere a domande:

  • Perché questo comportamento non si è manifestato durante il test?
  • Come risolviamo in problema?

La risposta alla prima domanda è semplice. In un ambiente di test è difficile simulare utenti reali, i relativi modelli di comportamento e i volumi di lavoro che potrebbero eseguire. L'unico modo completamente sicuro per comprendere il comportamento di un sistema sotto carico è osservare l'ambiente in produzione. Per chiarire, non si suggerisce di omettere i test delle prestazioni. I test delle prestazioni sono fondamentali per ottenere le metriche delle prestazioni di base. Ma è necessario essere pronti osservare e correggere i problemi di prestazioni quando si verificano nel sistema in tempo reale.

La risposta alla seconda domanda, come risolvere il problema, è meno semplice. Ci sono molti fattori che possono contribuire e a volte il problema si manifesta solo in determinate circostanze. La strumentazione e la creazione di logo sono fondamentali per individuare la causa principale, ma è necessario anche sapere cosa cercare.

Insieme ai clienti di Microsoft Azure sono stati identificati alcuni dei problemi di prestazioni più comuni che i clienti riscontrano nell'ambiente di produzione. Per ogni antipattern sono indicati il motivo per cui l'antipattern si verifica in genere, i sintomi dell'antipattern e le tecniche per la risoluzione del problema. Viene fornito anche il codice di esempio che illustra sia l'antipattern sia la soluzione di scalabilità suggerita.

Alcuni di questi antipattern potrebbero sembrare ovvi quando si leggono le descrizioni, ma si verificano più spesso di quanto si potrebbe pensare. In alcuni casi un'applicazione eredita una progettazione che funzionava in locale, ma non è facilmente scalabile nel cloud. Oppure un'applicazione potrebbe iniziare con una progettazione molto pulita, ma con l'aggiunta di nuove funzionalità, potrebbe subentrare uno o più di questi antipattern. Indipendentemente dalla causa specifica, questa guida consentirà di identificare e correggere questi antipattern.

Catalogo di antipattern

Ecco l'elenco degli antipattern identificati:

Antipattern Descrizione
Database occupato Offload di troppa elaborazione in un archivio dati.
Front-end occupato Spostamento attività a intenso uso di risorse nei thread di background.
I/O "frammentato" Invio continuativo di molte richieste di rete di piccole dimensioni.
Recupero estraneo Recupero di più dati del necessario, che determina un I/O inutile.
Creazione di istanze non corretta Creazione e distruzione di oggetti che sono progettati per essere condivisi e riutilizzati.
Persistenza monolitica Usare lo stesso archivio dati per dati con modelli di utilizzo molto diversi.
Nessuna memorizzazione nella cache Impossibilità di memorizzare i dati nella cache.
Vicino rumoroso Un singolo tenant usa una quantità sproporzionata delle risorse.
Tempesta di tentativi Ripetizione troppo frequente delle richieste non riuscite a un server.
I/O sincrono Bloccare il thread chiamante durante il completamento dell'I/O.

Passaggi successivi

Per altre informazioni sull'ottimizzazione delle prestazioni, vedere Ottimizzazione delle prestazioni di un'applicazione distribuita