INGEGNERIA DEI SISTEMI DISTRIBUITI E LABORATORIO
Anno accademico 2018/2019 - 1° anno - Curriculum Sistemi di Rete e Sicurezza- INGEGNERIA DEI SISTEMI DISTRIBUITI: Emiliano Alessio TRAMONTANA
- LABORATORIO: Andrea Francesco FORNAIA
Organizzazione didattica: 225 ore d'impegno totale, 153 di studio individuale, 36 di lezione frontale, 24 di esercitazione, 12 di laboratorio
Semestre: 1°
Obiettivi formativi
- INGEGNERIA DEI SISTEMI DISTRIBUITI
Obiettivi formativi generali in termini di risultati di apprendimento attesi.
1. Conoscenza e capacità di comprensione (knowledge and understanding): lo studente conoscerà meccanismi di programmazione avanzata, inclusi programmazione ad aspetti, parallela, asincrona, distribuita.
2. Capacità di applicare conoscenza e comprensione (applying knowledge and understanding): lo studente avrà la capacità di progettare sistemi software distribuiti e complessi.
3. Autonomia di giudizio (making judgements): lo studente acquisirà la capacità di analizzare sistemi distribuiti e complessi.
4. Abilità comunicative (communication skills): lo studente imparerà a descrivere in linguaggio tecnico le caratteristiche fondamentali dei sistemi distribuiti e paralleli.
5. Capacità di apprendimento (learning skills): lo studente potrà affrontare e risolvere problemi di progettazione e implementazione in ambiti realistici, studiando, valutando e utilizzando, nuove tecnologie per i sistemi distribuiti.
- LABORATORIO
Obiettivi formativi generali in termini di risultati di apprendimento attesi.
- Conoscenza e capacità di comprensione (knowledge and understanding): lo studente conoscerà meccanismi di sviluppo avanzati, inclusi sviluppo collaborativo e distribuito, analisi dei dati relativi al processo di sviluppo, validazione di sistemi concorrenti, automatizzazione del processo di rilascio, progettazione e implementazione di sistemi distribuiti a microservizi.
- Capacità di applicare conoscenza e comprensione (applying knowledge and understanding): lo studente avrà la capacità di adoperare strumenti avanzati di sviluppo, validazione e rilascio per applicazioni distribuite.
- Autonomia di giudizio (making judgements): lo studente acquisirà la capacità di analizzare sistemi di sviluppo, validazione e rilascio per applicazioni distribuite.
- Abilità comunicative (communication skills): lo studente imparerà a descrivere in linguaggio tecnico le caratteristiche fondamentali dei sistemi sistemi di sviluppo, validazione e rilascio per applicazioni distribuite.
- Capacità di apprendimento (learning skills): lo studente potrà affrontare e risolvere problemi di utilizzo e implementazione in ambiti realistici, studiando, valutando e utilizzando, nuove tecnologie per lo sviluppo, la validazione e il rilascio di applicazioni distribuite.
Modalità di svolgimento dell'insegnamento
- INGEGNERIA DEI SISTEMI DISTRIBUITI
Lezioni frontali per concetti e soluzioni, spiegazione di esempi di codice per le tecniche esaminate.
- LABORATORIO
Lezioni frontali per concetti e soluzioni, prove pratiche con esempi di codice per le problematiche esaminate.
Prerequisiti richiesti
- INGEGNERIA DEI SISTEMI DISTRIBUITI
Capacità di progettare ed implementare sistemi ad oggetti in C++ o Java.
- LABORATORIO
Capacità di progettare ed implementare sistemi ad oggetti in C++ o Java.
Frequenza lezioni
- INGEGNERIA DEI SISTEMI DISTRIBUITI
La frequenza delle lezioni è fortemente consigliata.
- LABORATORIO
La frequenza delle lezioni è fortemente consigliata.
Contenuti del corso
- INGEGNERIA DEI SISTEMI DISTRIBUITI
Design pattern per sistemi distribuiti: Proxy, Broker, Forward-Receiver, Remote Facade, Data Transfer Object, Session State, Serialized Large Object. Progettazione ed implementazione del software orientato agli aspetti. Design pattern ad aspetti e Refactoring ad aspetti. Java 8 e Map Reduce. Reactive programming con design pattern Circuit Breaker, Bulkheads. Design pattern per la sicurezza e i sistemi distribuiti. Middleware orientato ai messaggi RabbitMQ.
- LABORATORIO
Introduzione ai DevOps. Git Workflow e sviluppo distribuito. Mining Software Repository. Testing Combinatoriale. Model Checking per sistemi concorrenti. Infrastructure Automation con OpenStack. Microservizi. Microservizi con Spring Boot.
Testi di riferimento
- INGEGNERIA DEI SISTEMI DISTRIBUITI
1. F. Buschmann, R. Meunier, H. Rohnert, P. Sommerlad, M. Stal. Pattern-Oriented Software Architecture A System of Patterns. John Wiley and Sons, 1996
2. M. Fowler. Patterns of Enterprise Application Architecture. Addison-Wesley, 2003
3. M. Schumacher, E. Fernandez-Buglioni, D. Hybertson, F. Buschmann, P. Sommerlad. Security Patterns: Integrating Security and Systems Engineering. John Wiley and Sons, 2006
4. R. Laddad. AspectJ in Action: Enterpriese AOP with Spring Applications. Manning Publications. 2010.
5. R.-G. Urma, M. Fusco, A. Mycroft. Java 8 in Action: Lambdas, streams, and functional-style programming. Manning, 2015
6. G. Hohpe, B. Woolf. Enterprise Integration Patterns. Addison-Wesley, 2003
7. A. Videla, J.J.W. Williams. RabbitMQ in Action. Manning, 2012
- LABORATORIO
- G. Kim et al.: The DevOps Handbook
- S. Chacon and B. Straub: Pro Git
- A. Tornhill: Your Code As a Crime Scene
- D. R. Kuhn et al.: Practical Combinatorial Testing
- M. Young and M. Pezze: Software Testing and Analysis: Process, Principles and Technique
- V.C. Bumgardner: OpenStack in action
- S. Newman: Building Microservices
- M. Macero: Learn Microservices with Spring Boot
Programmazione del corso
INGEGNERIA DEI SISTEMI DISTRIBUITI | |||
Argomenti | Riferimenti testi | ||
---|---|---|---|
1 | Presentazione del corso con obiettivi. Modularità per sistemi distribuiti e paralleli | [1, 2] | |
2 | Design pattern Proxy e Reference Monitor | [1, 3] | |
3 | Design pattern Remote Proxy e Forward-Receiver | [1] | |
4 | Design pattern Remote Facade e Data Transfer Object | [2] | |
5 | Design pattern Session State (Client, Server, Database), Serialized Large Object | [2] | |
6 | Design pattern Broker | [1] | |
7 | Progettazione con Map Reduce in Java, Stream, espressioni lambda. Design pattern Builder. Test con JUnit | [5] | |
8 | Tipi Java 8: Predicate, Function, IntStream, Supplier | [5] | |
9 | Progettazione con callback, Java chiamate asincrone, tipi CompletableFuture | [5] | |
10 | Programmazione ad aspetti: costrutti del linguaggio AspectJ. Pointcut e join point. Esempio di aspetto per la protezione degli accessi | [4] | |
11 | Programmazione ad aspetti: pointcut per la cattura del contesto di esecuzione, passaggio di parametri agli advice | [4] | |
12 | Refactoring ad aspetti. Crosscutting statico e dinamico. Pointcut cflow, declare warning | [4] | |
13 | Design pattern ad aspetti: Adapter, Participant e Sincronizzazione. Gestione eccezioni con aspetti | [4] | |
14 | Design pattern per la stabilità: Timeout, Circuit Breaker, Bulkheads | ||
15 | Middleware orientato ai messaggi: RabbitMQ | [6, 7] | |
16 | Design pattern per i messaggi. Produttori e consumatori di messaggi. Code | [6, 7] | |
LABORATORIO | |||
Argomenti | Riferimenti testi | ||
1 | Introduzione ai DevOps: DevOps lifecycle, Continuous Integration, Continuous Delivery, SCM e Pipeline | [1] | |
2 | Git Workflow e sviluppo distribuito: commit graph, comandi base, git workflow, concetti avanzati, GitHub, GitLab, Travis, Code Coverage | [2] | |
3 | Mining Software Repository: Hot Spot Analysis, Change Coupling, RepoDriller, PyDriller | [3] | |
4 | Testing Combinatoriale: Test Suite & Scaffolding, Interaction Failures, 2-way interaction, Covering Array, ATGT, esempio su Java Card Verifier | [4, 5] | |
5 | Model Checking per sistemi concorrenti: Logica Temporale (LTL, CTL), algoritmo di Model Checking, NuSMV, Oracolo, generazione automatica Test Suite, esempio Java Card Verifier | [5] | |
6 | Infrastructure Automation con OpenStack: scalabilità, tassonomia cloud, middleware cloud, architettura OpenStack, servizi principali, DevStack, VM lifecycle, Floating Ip, Role Based Access Control, OpenStack APIs | [6] | |
7 | Microservizi: Monolite vs Microservizi, Legge di Conway, Monolith First, Bounded Context, Coordinamento, Service Discovery, Load Balancing, API Gateway, Circuit Breaker, ELK, Stateless Microservices, Affinità di Sessione, VM e Container | [7] | |
8 | Microservizi con Spring Boot: Spring Boot Initializr e Starters, Maven, Dependency Injection, Architettura Applicazione Web Spring, Vagrant e Provisioning, RESTful APIs, CRUD, Zuul | [8] |
Verifica dell'apprendimento
Modalità di verifica dell'apprendimento
- INGEGNERIA DEI SISTEMI DISTRIBUITI
L'esame consiste di un elaborato ed una prova orale.
- LABORATORIO
L'esame consiste di un elaborato ed una prova orale.
Esempi di domande e/o esercizi frequenti
- INGEGNERIA DEI SISTEMI DISTRIBUITI
Implementare un aspetto software per il caching dei dati
Implementare in modo parallelo la selezione e la somma di importi da un insieme di dati riguardanti prodotti venduti.
Implementare in modo asincrono una chiamata ad un metodo.
Descrivere la gestione della sessione.
- LABORATORIO
Caratteristiche principali di un approccio DevOps
Descrivere le operazioni di fetch, pull e push tramite trasformazioni sul Commit Graph
Proporre alcuni esempi di problemi risolvibili con il Mining di repository Git
Descrivere il concetto di Covering Array
Mostrare un esempio di macchina a stati finiti per NuSMV
Spiegare come il pattern Role Based Access Control viene implementato in OpenStack
Descrivere il concetto di Affinità di Sessione e come evitarlo in un contesto a Microservizi
Mostrare la struttura tipica di un'applicazione a Microservizi implementata tramite Spring Boot