AWS Design Evolutivo


1. Introduzione al Design Evolutivo

  • Il design evolutivo assume che i requisiti cambino nel tempo.

  • Il design iniziale dettagliato è inefficace in ambienti moderni.

  • I servizi si evolvono basandosi sul feedback degli utenti.

  • Test A/B e canary releases aiutano a migliorare il software.


2. Importanza degli Aggiornamenti Graduali

  • Gli aggiornamenti software possono essere implementati silenziosamente.

  • I test in beta identificano problemi prima del rilascio completo.

  • Se il feedback è negativo, il rilascio può essere annullato.

  • Il deployment progressivo riduce il rischio di errori critici.


3. Minimo Prodotto Funzionante (MVP)

  • I servizi vengono rilasciati con solo le funzionalità essenziali.

  • Non è necessario coprire ogni caso limite inizialmente.

  • Le funzionalità vengono iterate in base ai feedback.

  • Il refactoring avviene quando il prodotto è stabile.


4. Pattern Twelve-Factor App e Design Evolutivo

  • Codebase: Un solo codice, molteplici deployment migliorano l’iterazione.

  • Dependencies: Dichiarare esplicitamente le dipendenze aiuta la modularità.

  • Configuration: Le configurazioni devono essere esterne al codice.

  • Build, Release, Run: Separare le fasi facilita il rollback.


5. Architettura Esagonale

  • Separazione della logica di dominio dall'infrastruttura.

  • Porti: Interfacce tra logica e attori primari/secondari.

  • Adattatori: Convertono richieste in formati comprensibili.

  • Attori primari: Utenti, webhook, UI.

  • Attori secondari: Database, code di messaggi.


6. Pattern Software per Design Evolutivo

  • Sidecar: Estende e migliora un servizio principale.

  • Ambassador: Gestisce richieste in rete per un servizio.

  • Chain: Ordina l’avvio e l’arresto dei container.

  • Proxy: Agisce come intermediario tra due componenti.


7. Importanza della Cache nei Container

  • I container permettono un’evoluzione veloce del design.

  • Le immagini sono costruite in livelli indipendenti.

  • I livelli non vengono ricostruiti se non modificati.

  • La cache dei livelli riduce i tempi di deployment.


8. Deployment Progressivi con Canary Releases

  • Testare una nuova versione con un sottoinsieme di utenti.

  • Se la nuova versione ha problemi, si può annullare il rilascio.

  • Il traffico viene gradualmente spostato verso la nuova versione.

  • AWS App Mesh aiuta a gestire il traffico dinamico.


9. Canary Release con AWS App Mesh

  • App Mesh gestisce il traffico tra versioni software.

  • Flagger regola il traffico in base a metriche di performance.

  • Se le metriche peggiorano, il canary viene annullato.

  • Implementabile su Amazon EKS con Argo Rollouts.


10. Canary Release su Amazon ECS

  • AWS Step Functions aiuta nei deployment progressivi.

  • Lo stato del deployment è gestito con Lambda e CloudFormation.

  • Il traffico viene spostato progressivamente tra le versioni.

  • Il tempo di attesa tra fasi è configurabile.


11. Blue/Green Deployment con AWS CodeDeploy

  • Canary: Traffico spostato in due incrementi.

  • Linear: Traffico spostato gradualmente in intervalli regolari.

  • All-at-once: Tutto il traffico viene spostato immediatamente.

  • Aiuta a ridurre i tempi di downtime.


12. Benefici del Design Evolutivo

  • Riduce il rischio di fallimenti software.

  • Permette di implementare nuove funzionalità rapidamente.

  • Migliora la stabilità del sistema nel tempo.

  • Supporta infrastrutture altamente scalabili.


13. Monitoraggio e Feedback Continuo

  • Il monitoraggio delle performance guida il design futuro.

  • I log aiutano a identificare problemi in tempo reale.

  • AWS CloudWatch traccia le metriche delle applicazioni.

  • Le modifiche vengono guidate dai dati, non dalle ipotesi.


14. Architettura a Microservizi e Design Evolutivo

  • Ogni microservizio può essere aggiornato indipendentemente.

  • Le dipendenze tra microservizi devono essere minime.

  • Le API gestiscono la comunicazione tra i servizi.

  • I servizi vengono ridistribuiti senza impattare l’intero sistema.


15. Test Automatizzati e Design Evolutivo

  • I test continui convalidano le nuove modifiche.

  • CI/CD automatizza il deployment senza interruzioni.

  • I test di carico aiutano a prevenire problemi di scalabilità.

  • AWS CodeBuild e CodePipeline semplificano il processo.


16. Scalabilità e Evoluzione dell’Infrastruttura

  • AWS Auto Scaling adatta il numero di istanze in base al carico.

  • Lambda permette di scalare senza gestione server.

  • Le API Gateway distribuiscono il traffico in modo intelligente.

  • Le architetture senza server sono ideali per l’evoluzione.


17. Container Orchestration con Kubernetes e ECS

  • Kubernetes gestisce il ciclo di vita dei container.

  • ECS integra i container con i servizi AWS.

  • Fargate rimuove la necessità di gestire istanze EC2.

  • Gli aggiornamenti avvengono con strategie progressive.


18. DevOps e Design Evolutivo

  • DevOps accelera lo sviluppo continuo del software.

  • La cultura DevOps riduce il tempo tra sviluppo e rilascio.

  • Gli strumenti CI/CD automatizzano le fasi di deploy.

  • Terraform e CloudFormation gestiscono le infrastrutture come codice.


19. Gestione della Configurazione nei Servizi Evolutivi

  • AWS Systems Manager aiuta a gestire le configurazioni dinamiche.

  • I secret manager evitano la hardcoded credentials.

  • Le configurazioni sono separate dal codice sorgente.

  • Feature flags consentono di attivare/disattivare funzionalità.


20. Conclusione: Il Futuro del Design Evolutivo

  • Le infrastrutture cloud accelerano il miglioramento continuo.

  • I modelli serverless e containerizzati favoriscono l’agilità.

  • Il feedback degli utenti guida le nuove funzionalità.

  • Il miglioramento iterativo è il cuore del design moderno.