approfondimento

Applicazioni Cloud: nuove frontiere per scalabilità e AI



Indirizzo copiato

Cosa sono e come funzionano. La differenza fra Cloud native e tradizionali. Architettura e componenti. I vantaggi per le aziende. Le applicazioni cloud native: agilità, scalabilità e facilità di gestione superiori

Pubblicato il 29 nov 2024

Paolo Dotti

Quence – TXTGROUP



Cloud applicazioni

Le applicazioni cloud rappresentano una svolta significativa nel modo in cui il software viene distribuito e gestito, offrendo vantaggi distintivi rispetto alle applicazioni tradizionali. Questi software, ospitati su infrastrutture remote e accessibili via Internet, sono gestiti da fornitori di servizi come Amazon Web Services, Microsoft Azure e Google Cloud Platform. Le applicazioni cloud native, in particolare, sono progettate per sfruttare appieno i benefici del cloud, garantendo agilità, scalabilità e facilità di gestione superiori.

A differenza delle applicazioni tradizionali, spesso monolitiche e legate a specifiche configurazioni hardware, le applicazioni cloud native adottano un’architettura a microservizi, utilizzano container per l’isolamento e la portabilità, e supportano la scalabilità automatica.

Inoltre, il processo di deployment continuo e gli aggiornamenti incrementali riducono i rischi di interruzione del servizio. Questa distinzione nel design e nell’approccio alla progettazione sottolinea l’evoluzione tecnologica verso soluzioni più flessibili ed efficienti.

Cosa sono le applicazioni cloud e come funzionano

Le applicazioni cloud sono software ospitati su infrastrutture remote e accessibili tramite Internet. A differenza delle applicazioni tradizionali installate localmente, quelle cloud sono distribuite e gestite da fornitori di servizi cloud come Amazon Web Services (AWS), Microsoft Azure, Google Cloud Platform (GCP).

Differenza tra applicazioni cloud native e tradizionali

Le applicazioni cloud native sono progettate specificamente per funzionare nel cloud, sfruttando i suoi vantaggi; sono progettate per sfruttare al meglio i vantaggi del cloud, offrendo maggiore agilità, scalabilità e facilità di gestione rispetto alle applicazioni tradizionali. Le applicazioni tradizionali, invece, sono state inizialmente sviluppate per sistemi locali, hanno una scalabilità limitata e in molti casi è difficile migrarle nel cloud per i motivi esposti di seguito.

La distinzione tra applicazioni cloud native e tradizionali risiede fondamentalmente nel loro design e nell’approccio alla progettazione.

  • Le applicazioni tradizionali hanno una o più delle seguenti caratteristiche:
    • Monolitiche: sono costruite come un’unica unità, con tutte le funzionalità interconnesse.
    • Dipendono dal sistema operativo: sono spesso legate a specifiche configurazioni hardware e software.
    • Difficoltà di scalabilità: scalare un’applicazione monolitica può essere complesso e richiedere modifiche significative al codice. Inoltre, la scalabilità locale dipende molto dalle risorse hardware a disposizione che sono in genere inferiori rispetto alle disponibilità in cloud.
    • Processo di deployment lento: il processo di deployment non è sempre ottimizzato e richiede tempi lunghi; un sistema gestito in regime di CI/CD (Continuous Integration/Continuous Delivery) è oneroso se gestito localmente.
    • Aggiornamenti rischiosi: ogni aggiornamento comporta un rischio di interruzione del servizio.
  • Le applicazioni cloud native sono caratterizzate da:
    • Microservizi: sono suddivise in piccoli servizi indipendenti che comunicano tra loro tramite API.
    • Containerizzazione: utilizzano container (tramite Docker, Kubernetes, etc) per isolare i microservizi e renderli portabili.
    • Scalabilità automatica: possono essere scalate automaticamente in base al carico di lavoro.
    • Deployment continuo: la gestione CI/CD è facilitata e ottimizzata.
    • Aggiornamenti incrementali: gli aggiornamenti possono essere effettuati a livello di singolo microservizio.
    • Linguaggi e framework diversi: possono utilizzare diversi linguaggi di programmazione e framework per ogni microservizio, offrendo maggiore flessibilità. Ogni microservizio può essere sviluppato col linguaggio più adatto alle funzionalità richieste.
cloud applicazioni

Vantaggi delle applicazioni cloud per le aziende

Le applicazioni cloud offrono numerosi vantaggi che possono aiutare le aziende a diventare più agili, innovative e competitive. Le caratteristiche delle applicazioni cloud native portano all’azienda maggiore flessibilità, scalabilità, riduzione dei costi, accesso a servizi gestiti, aggiornamenti continui, miglioramento della collaborazione e aumento della resilienza. Tuttavia, la scelta di migrare verso il cloud richiede una valutazione attenta delle esigenze specifiche di ciascuna azienda.

Tra i vantaggi sottolineiamo:

  • Scalabilità e flessibilità: le applicazioni cloud possono adattarsi automaticamente alle variazioni del carico di lavoro, sia in aumento che in diminuzione. Ciò significa poter far fronte a picchi di traffico senza dover investire in hardware aggiuntivo e ridurre i costi pagando solo le risorse che si utilizzano. Non è più necessario acquistare e gestire hardware in loco.
  • Velocità di sviluppo: i processi di sviluppo e deployment sono più rapidi e ottimizzati grazie all’utilizzo di strumenti disponibili nelle stesse piattaforme cloud. Le applicazioni cloud possono essere aggiornate più frequentemente, consentendo l’introduzione di nuove funzionalità e miglioramenti in modo più rapido e meno soggetto a errori in quanto le procedure di aggiornamento sono automatizzate con strumenti dell’infrastruttura.
  • Resilienza: le applicazioni cloud possono essere distribuite su più server e data center, il che le rende più resistenti a guasti hardware e software; diminuisce drasticamente la mancanza di disponibilità di un servizio.
  • Innovazione: le aziende possono accedere a una vasta gamma di servizi cloud, come l’intelligenza artificiale, l’analisi dei dati e l’Internet of Things, per stare sempre al passo coi tempi coi propri prodotti e servizi.

Architettura e componenti delle applicazioni cloud

Virtualizzazione, microservizi, container, completa integrazione tra le componenti, sono pilastri fondamentali nell’architettura delle applicazioni cloud native. L’utilizzo di microservizi e container è diventato lo standard per lo sviluppo di applicazioni in cloud. Questa combinazione offre una serie di vantaggi in termini di scalabilità, agilità e resilienza, tuttavia, è importante considerare le sfide associate a questa architettura e pianificare attentamente la migrazione e la gestione delle applicazioni.

Microservizi e container nelle applicazioni cloud

I microservizi sono piccole unità di software indipendenti che comunicano tra loro tramite API. I container, come Docker, forniscono un ambiente isolato per eseguire i microservizi, garantendo portabilità e scalabilità. Immaginate un’applicazione suddivisa in piccoli servizi indipendenti, ognuno con una specifica responsabilità; ogni microservizio può essere sviluppato, distribuito e scalato in modo autonomo. Il container è un ambiente isolato in cui viene eseguito un microservizio; questo contiene tutto e solo ciò di cui il servizio ha bisogno per funzionare, dal codice sorgente alle librerie.

Microservizi e container sono un connubio perfetto perché la loro sinergia permette di avere applicazioni con le caratteristiche di scalabilità, resilienza, veloci da sviluppare e da mettere in produzione senza interruzioni di servizio, sviluppati con tecnologie miste scegliendo la più adatta senza vincoli legati a un’architettura monolitica.

Come funzionano insieme? Ogni microservizio viene sviluppato come un’unità indipendente e rilasciato in un container, generalmente un’immagine Docker. Un “orchestrator” (per esempio Kubernetes o Openshift) gestisce il ciclo di vita dei container garantendo scalabilità e disponibilità del servizio. I microservizi comunicano tra loro tramite API Rest.

Tanti vantaggi con un’architettura innovativa e agile nell’adattamento ai cambiamenti del mercato comportano però la necessità di competenze specifiche nella gestione dei microservizi, una comunicazione tra microservizi ben progettata per evitare problemi di prestazioni e affidabilità, un’attività di test più complessa rispetto a quella per un’applicazione monolitica.

Database e storage distribuito

I database e lo storage distribuiti sono componenti essenziali in ambiente cloud, hanno la stessa importanza dei microservizi e dei container; consentono di gestire grandi volumi di dati in modo scalabile, disponibile e con alte prestazioni. Spesso si utilizzano database relazionali e NoSQL distribuiti per gestire grandi volumi di dati in modo efficiente con scalabilità orizzontale e verticale. L’approccio tradizionale con un singolo database diventa spesso limitante; le applicazioni in cloud richiedono soluzioni più flessibili e distribuite.

Apriamo una parentesi per parlare di scalabilità, un concetto che ci accompagna in molti contesti parlando di cloud.

La scalabilità verticale consiste nell’aumentare le risorse (CPU, memoria, storage) di un’istanza esistente per gestire un carico di lavoro maggiore. Entrambi i tipi di scalabilità possono essere gestiti in una infrastruttura cloud.

La scalabilità orizzontale consiste nell’aggiunta di nuove istanze (copie) dell’applicazione o di un database per gestire un carico di lavoro maggiore. Consente di far fronte a carichi di lavoro variabili e crescenti; per esempio, i database distribuiti possono essere scalati aggiungendo o rimuovendo nodi dal cluster. La replica di dati su più nodi garantisce maggiori performance e una maggiore disponibilità del sistema, anche in caso di guasti hardware.

Quando si fa scalabilità orizzontale si parla di Sharding in caso di partizionamento orizzontale del database per distribuire i dati su più nodi, replicazione se i dati vengono copiati su più nodi per aumentare la disponibilità e le performance.

Lo storage distribuito è un sistema di archiviazione che distribuisce i dati su più nodi, spesso utilizzando un file system distribuito (come GlusterFS, Ceph) o un oggetto storage (come Amazon S3, Google Storage, Azure Storage, etc).

Uno storage distribuito offre vantaggi della stessa tipologia dei database distribuiti, ovvero scalabilità e facile espansione della capacità, alta disponibilità e riduzione del rischio di perdita dati, alte performance e flessibilità nel supporto di diversi tipi di dati. Storage e database distribuiti sono da preferire quando si hanno grandi quantità di dati che crescono rapidamente, quando è necessario scalare le risorse in modo elastico, quando la disponibilità dei dati è critica ed è necessaria una bassa latenza nelle operazioni di scrittura e lettura.

Integrazione dell’intelligenza artificiale nelle applicazioni cloud

L’integrazione dell’intelligenza artificiale nelle applicazioni cloud rappresenta una rivoluzione che sta trasformando il modo in cui le aziende operano. Grazie all’AI, le applicazioni cloud diventano sempre più intelligenti, efficienti e personalizzate. Questa sinergia permette di sfruttare la potenza computazionale del cloud per addestrare modelli di AI sempre più sofisticati e di applicarli direttamente alle applicazioni, offrendo una serie di vantaggi e nuove possibilità. Il futuro dell’AI nel cloud è molto promettente. Si prevede una crescita esponenziale dell’adozione di queste tecnologie in tutti i settori, portando a una trasformazione profonda del modo in cui lavoriamo e viviamo.

Ma perché sfruttare l’AI in cloud? Il cloud permette di addestrare modelli di AI su grandi quantità di dati e gestire picchi di richieste; si ha praticamente una scalabilità illimitata.

I cloud provider offrono strumenti e librerie preconfigurate per l’implementazione di modelli di AI, servizi rendendo questa tecnologia accessibile anche a chi non ha competenze specifiche in materia. Offrono inoltre servizi con funzionalità di AI come traduzione, analisi delle immagini, riconoscimento del linguaggio naturale. Parliamo di AI come servizio.

Machine learning as a service nelle applicazioni cloud

I fornitori cloud offrono servizi di machine learning pre-addestrati o personalizzabili, consentendo alle aziende di integrare facilmente l’intelligenza artificiale nelle loro applicazioni senza dover disporre di competenze specializzate. In particolare, parliamo di Machine Learning as a Service (MLaaS); i cloud provider offrono piattaforme e servizi gestiti per lo sviluppo e il deployment di modelli di machine learning, strumenti per la preparazione dei dati, addestramento dei modelli, valutazione delle prestazioni e passaggio in produzione.

Oltre a modelli di Machine learning disponibili come servizi sono disponibili framework di deep learning come TensorFlow, PyTorch, Keras che permettono di sviluppare modelli personalizzati e metterli in produzione sulla stessa infrastruttura cloud. Ancora più ad alto livello sono disponibili servizi di AI (basati su Machine learning o Deep learning) che tramite chiamate API eseguono traduzioni automatiche, analisi di immagini, “comprensione” del linguaggio naturale e interazione in linguaggio naturale.

Casi d’uso dell’AI per ottimizzare le applicazioni cloud

L’integrazione dell’intelligenza artificiale nelle applicazioni cloud ha aperto nuove frontiere di ottimizzazione, rendendo i sistemi più efficienti, reattivi e personalizzati. Alcuni casi d’uso specifici sono: analisi predittiva per la manutenzione preventiva, riconoscimento delle immagini per l’analisi dei dati visivi, ottimizzazione delle risorse cloud, l’applicazione forse più usata attualmente che è l’elaborazione del linguaggio naturale per i chatbot, la generazione codice sorgente in diversi linguaggi di programmazione.

In particolare, l’AI può essere utilizzata per automatizzare processi aziendali ripetitivi e per l’ottimizzazione delle risorse. Si può ricorrere all’AI per prevedere con precisione i picchi di carico e scalare automaticamente le risorse cloud in base alla domanda, evitando di sovradimensionare o sottodimensionare l’infrastruttura.

Tramite l’AI ci si può sbizzarrire e arrivare a ottimizzare le query SQL facendosi suggerire ottimizzazioni, analizzare i log delle applicazioni per identificare anomalie, errori e colli di bottiglia, permettendo una risoluzione più rapida dei problemi, prevedere quali dati saranno richiesti in futuro e popolare la cache in modo proattivo, migliorando le prestazioni delle applicazioni.

L’AI è già largamente utilizzata in ambito cyber security, per analizzare il traffico di rete e identificare comportamenti anomali che potrebbero indicare un attacco informatico, per distinguere il traffico generato da un botnet dal traffico legittimo, proteggendo le applicazioni dagli attacchi DDoS.

In molte aziende è molto utile l’AI utilizzata a scopo di manutenzione predittiva; si possono analizzare i dati di sensori, sonde e i log di sistema per prevedere guasti futuri e programmare la manutenzione in modo proattivo invece che periodico preventivo.

Scalabilità e performance delle applicazioni cloud

La scalabilità e le prestazioni sono due aspetti fondamentali delle applicazioni cloud che determinano il successo e devono essere attentamente considerati durante la progettazione e lo sviluppo di sistemi software. Grazie all’autoscaling e agli strumenti di monitoraggio, è possibile creare applicazioni cloud in grado di gestire carichi di lavoro variabili e di offrire un’esperienza utente ottimale.

La scalabilità di un’applicazione cloud si riferisce alla sua capacità di adattarsi a variazioni nel carico di lavoro, sia in aumento che in diminuzione. In altre parole, un’applicazione scalabile può gestire un numero crescente di utenti o di richieste senza comprometterne le prestazioni. Quando il carico di lavoro diminuisce le risorse dedicate all’applicazione vengono diminuite in modo adattativo così da diminuire consumi di energia e soprattutto i costi.

Le prestazioni di un’applicazione in cloud si riferiscono alla sua capacità di rispondere rapidamente alle richieste degli utenti. Una buona performance è essenziale per garantire un’esperienza utente soddisfacente; una buona scalabilità garantisce le prestazioni anche in condizioni di carico elevato. Le prestazioni si misurano anche in latenza che è il tempo che intercorre tra una richiesta e una risposta (per esempio nella chiamata di una API), throughput che è la quantità di dati o messaggi elaborati in un dato periodo di tempo.

Le prestazioni si migliorano attraverso la scrittura di un codice efficiente e ben strutturato; in questo ci si può far aiutare da strumenti di AI come copilot. Ma non è solo questo; la scelta dell’infrastruttura cloud contribuisce alle performance, la distribuzione del contenuto dell’applicazione su diversi server geograficamente distribuiti per ridurre la latenza (Content Delivery Network), l’utilizzo di strategie di autoscaling e un monitoraggio continuo che sono elementi sempre disponibili in una infrastruttura cloud.

I principali provider cloud offrono servizi di autoscaling e monitoraggio completamente integrati nell’infrastruttura e con le altre applicazioni.

Strategie di autoscaling per gestire i carichi di lavoro

Abbiamo visto che l’autoscaling è una caratteristica fondamentale delle applicazioni cloud che consente di regolare automaticamente le risorse, dinamicamente in base ai carichi di lavoro variabili aggiungendo o rimuovendo le risorse. Il funzionamento dell’autoscaling è basato sul monitoraggio continuo del carico di lavoro dell’applicazione; vengono definite delle soglie che determinano quando è necessario scalare l’applicazione e al superamento di queste il sistema aggiunge o rimuove istanze dell’applicazione o risorse.

L’autoscaling può essere basato sul monitoraggio dell’utilizzo di CPU, sull’utilizzo di memoria, ma anche su metriche personalizzate quali la lunghezza delle code in una piattaforma di data streaming o anche il numero di richieste al secondo che un’applicazione deve gestire. Queste sono le diverse strategie di autoscaling, ognuna con i suoi vantaggi e adatta a scenari specifici:

  • Autoscaling basato su CPU

Viene monitorato l’utilizzo della CPU delle istanze di un’applicazione. Quando l’utilizzo supera una soglia predefinita, vengono aggiunte nuove istanze; quando scende al di sotto, le istanze in eccesso vengono rimosse. È semplice da implementare e spesso efficace per applicazioni con carichi di lavoro legati al calcolo. Potrebbe non essere sufficiente in casi di picchi di traffico improvvisi o con pattern di utilizzo non correlati all’utilizzo della CPU.

  • Autoscaling basato sulla memoria

Simile all’autoscaling basato sulla CPU, ma viene monitorato l’utilizzo della memoria. È adatto ad applicazioni che richiedono molta memoria, come database o applicazioni di analisi dei dati. Non è consigliato per applicazioni con carichi di lavoro variabili.

  • Autoscaling basato su metriche personalizzate

Permette di definire metriche personalizzate da monitorare, numero di richieste al secondo, tempi di risposta, lunghezza delle code. Offre una maggiore flessibilità rispetto ai precedenti a discapito di una maggiore complessità di implementazione. Il vantaggio è che consente di adattare l’autoscaling alle molteplici esigenze specifiche di un’applicazione.

  • Autoscaling predittivo

Si utilizzano algoritmi di Machine learning per prevedere il carico di lavoro e scalare l’applicazione in anticipo. Questo permette di evitare picchi di carico e garantire una migliore esperienza utente; tuttavia, richiede una grande quantità di dati storici per addestrare i modelli di ML ed è più complesso da implementare.

  • Autoscaling pianificato

Si applica in casi di applicazioni prevedibili; l’applicazione viene scalata in base a un programma predefinito, per gestire picchi di traffico o di lavoro previsti durante determinate ore del giorno o giorni della settimana. Funziona molto bene per gestire carichi di lavoro prevedibili ma non è sufficiente per gestire picchi di traffico improvvisi o imprevisti.

La scelta della strategia dipende da molti fattori come abbiamo visto, senza tralasciare la valutazione dei costi; a volte una combinazione di diverse strategie può essere necessaria per gestire scenari complessi. È importante in ogni strategia la definizione delle soglie per evitare di sovradimensionare o sottodimensionare l’infrastruttura, in combinazione alla scelta del tempo di intervento delle soglie per evitare oscillazioni continue con conseguente effetto contrario al desiderato.

Monitoraggio e ottimizzazione delle prestazioni

Il monitoraggio continuo delle applicazioni cloud è fondamentale per identificare colli di bottiglia, ottimizzare le risorse e garantire un’esperienza utente ottimale. Monitoraggio e ottimizzazione delle prestazioni sono aspetti cruciali nella gestione di applicazioni cloud, soprattutto in un contesto di autoscaling dove le risorse si adattano dinamicamente al carico di lavoro.

Il monitoraggio continuo permette di avere una visione chiara dello stato di salute delle applicazioni e di identificare tempestivamente eventuali problemi. Si basa sulle metriche che possono essere utilizzo di risorse CPU, memoria, dischi, rete, tempi di risposta, numero e tipologia degli errori che si verificano, analisi dei log applicativi. Sono le stesse metriche che intervengono nelle strategie di autoscaling che è fortemente dipendente da un buon monitoraggio delle risorse.

Generalmente gli strumenti di monitoraggio offrono la possibilità di creare delle dashboard su cui visualizzare graficamente o in formato tabellare tutte le misure delle metriche utilizzate e la loro evoluzione nel tempo; una buona dashboard visualizza i dati in modo chiaro e intuitivo per un’analisi rapida. Da un buon monitoraggio è possibile proseguire per intraprendere azioni mirate e migliorare le prestazioni delle applicazioni.

In caso di applicazioni lente si può utilizzare un profiler per identificare i colli di bottiglia, effettuare azioni di cache per operazioni ripetitive e onerose, ridurre la dimensione di file statici (minificazione). Si possono ottimizzare gli accessi ai database, migliorare le query, si può ottimizzare l’utilizzo della rete distribuendo geograficamente le risorse.

Delle buone abitudini per un monitoraggio efficace sono l’analisi e l’ottimizzazione continua delle applicazioni, la configurazione di allarmi per essere avvisati in tempo in caso di anomalie, l’esecuzione di sessioni di test di carico per identificare i limiti del sistema in produzione.

Il monitoraggio e l’ottimizzazione delle prestazioni sono attività fondamentali per garantire il successo di un’applicazione cloud. Combinando strumenti di monitoraggio avanzati con strategie di scaling, best practice di sviluppo, è possibile creare applicazioni con caratteristiche di alta affidabilità, fault tolerant (resilienti), alte performance.

Articoli correlati

Articolo 1 di 4