INGEGNERIA DEI SISTEMI DISTRIBUITI E LABORATORIOModulo INGEGNERIA DEI SISTEMI DISTRIBUITI
Anno accademico 2025/2026 - Docente: EMILIANO ALESSIO TRAMONTANARisultati di apprendimento attesi
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. Viene approfondita la comprensione dei principali design pattern (autenticazione, autorizzazione, session management, DTO, SLOB, circuit breaker) e delle tecnologie middleware (RabbitMQ) utilizzate per garantire scalabilità, affidabilità e resilienza nei sistemi software distribuiti.
2. Capacità di applicare conoscenza e comprensione (applying knowledge and understanding): lo studente avrà la capacità di progettare, integrare e implementare sistemi software distribuiti adottando i pattern studiati. Saprà utilizzare strumenti e tecnologie (framework per microservizi, sistemi di messaging come RabbitMQ) per implementare soluzioni scalabili e affidabili, gestendo efficacemente lo stato della sessione, l’interscambio di dati (DTO) e il salvataggio dei dati (SLOB).
3. Autonomia di giudizio (making judgements): Lo studente sarà in grado di valutare in modo autonomo la soluzione architetturale più appropriata per un dato contesto applicativo, analizzando vari fattori che incidono e scegliendo in modo adeguato una soluzione.
4. Abilità comunicative (communication skills): lo studente imparerà a descrivere in linguaggio tecnico le caratteristiche dei sistemi distribuiti e paralleli. Saprà documentare le architetture distribuite e le scelte progettuali adottate.
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.
Modalità di svolgimento dell'insegnamento
Lezioni frontali per concetti e soluzioni, spiegazione di esempi di codice per le tecniche esaminate.
Qualora l'insegnamento venisse impartito in modalità mista o a distanza potranno essere introdotte le necessarie variazioni rispetto a quanto dichiarato in precedenza, al fine di rispettare il programma previsto e riportato nel syllabus.
Prerequisiti richiesti
Capacità di comprendere i requisiti di un sistema software, di progettare, implementare e convalidare sistemi ad oggetti in C++ o Java.
Frequenza lezioni
La frequenza delle lezioni è fortemente consigliata.
Contenuti del corso
Il corso affronta in modo approfondito l'ingegneria dei sistemi distribuiti, con particolare attenzione alle architetture a microservizi e ai design pattern fondamentali per costruire sistemi scalabili, resilienti e manutenibili. Dopo una panoramica sui modelli di comunicazione e sulle tecnologie middleware (es. RMI, RabbitMQ, REST), si analizzano i principali design pattern per la separazione di componenti pur garantendo la loro efficace collaborazione (come Proxy, Remote Facade, Session State, DTO, Broker), e i principali design pattern di coordinamento tra servizi (come Saga, Scatter-Gather), utili per gestire transazioni distribuite e flussi asincroni. Ampio spazio è dedicato alla resilienza, attraverso la programmazione asincrona, i pattern come Retry, Circuit Breaker, Bulkhead e Timeout, nonché alla gestione della consistenza e della cache nei contesti distribuiti. Completano il corso alcuni design pattern per garantire la sicurezza a livello di servizio, come i Token, l'autenticazione, l'autorizzazione.
Testi di riferimento
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
8. A. M. Antonopoulos. Mastering Bitcoin. Programming the open blockchain. O'Reilly, 2017
9. R. Kuhn. Reactive Design Patterns. Manning, 2017
Programmazione del corso
| Argomenti | Riferimenti testi | |
|---|---|---|
| 1 | Presentazione del corso con obiettivi. Modularità per sistemi distribuiti e paralleli | [2] C. 1 |
| 2 | Design pattern Proxy e Reference Monitor | [1] C. 3.4, [3] C. 8 |
| 3 | Design pattern Remote Proxy e Forwarder-Receiver | [1] C. 3.4, 3.6 |
| 4 | Design pattern Role-based Access Control e Authenticator | [3] C. 8, 10 |
| 5 | Design pattern Remote Facade e Data Transfer Object | [2] C. 7, 15 |
| 6 | Design pattern Session State (Client, Server, Database), Serialized Large Object | [2] C. 6, 17, 12 |
| 7 | Design pattern Broker | [1] C. 2.3 |
| 8 | Progettazione con callback, Java chiamate asincrone, tipi CompletableFuture | [5] C. 11 |
| 9 | Programmazione ad aspetti: costrutti del linguaggio AspectJ. Pointcut e join point. Esempio di aspetto per la protezione degli accessi | [4] C. 2, 3 |
| 10 | Programmazione ad aspetti: pointcut per la cattura del contesto di esecuzione, passaggio di parametri agli advice | [4] C. 3, 4 |
| 11 | Refactoring ad aspetti. Crosscutting statico e dinamico. Pointcut cflow, declare warning | [4] C. 5 |
| 12 | Design pattern ad aspetti: Adapter, Participant e Sincronizzazione. Gestione eccezioni con aspetti | [4] C. 5, 12, 13 |
| 13 | Design pattern per la stabilità: Timeout, Circuit Breaker, Bulkheads | [9] C. 2, 12 |
| 14 | Middleware orientato ai messaggi: RabbitMQ | [6] C. 3, [7] C. 2 |
| 15 | Design pattern per i messaggi. Produttori e consumatori di messaggi. Code | [6] C. 10, [7] C. 4 |
| 16 | Architettura distribuita di Blockchain di bitcoin, proprietà | [8] C. 1, 2, 5, 6, 8, 9, 10 |
Verifica dell'apprendimento
Modalità di verifica dell'apprendimento
L'esame consiste di un progetto assegnato a singoli studenti o a gruppi di studenti composti al massimo da tre persone. Una volta svolto il progetto, e consegnata la documentazione si potrà svolgere una parte orale a conclusione dell’esame. Il progetto consiste nella progettazione e implementazione di un piccolo sistema software distribuito e/o concorrente che usa una parte delle tecnologie del corso.
La prova d’esame è finalizzata a valutare in modo approfondito la preparazione dello studente, la capacità di analisi e di ragionamento sugli argomenti trattati durante il corso, nonché l’adeguatezza del linguaggio tecnico utilizzato.
L'esame sarà valutato in modo ottimo (28-30 e lode) se si mostrerà di aver acquisito profonda conoscenza e precisione nell’esposizione dei concetti del corso, valutata sia tramite l’analisi del progetto realizzato che tramite colloquio orale. Un voto intermedio (24-27) sarà dato nel caso in cui l'esame mostra una comprensione parziale di alcuni argomenti del corso. Uno voto sufficiente (18-23) sarà dato quando pur conoscendo parzialmente gli argomenti del corso, questi vengono esposti in modo superficiale o poco preciso.
Gli studenti con disabilità e/o DSA dovranno contattare con sufficiente anticipo rispetto alla data dell'esame il docente, il referente CInAP del DMI (prof.ssa Daniele) e il CInAP per comunicare che intendono sostenere l'esame fruendo delle opportune misure compensative.
La verifica dell’apprendimento potrà essere effettuata anche per via telematica, qualora le condizioni lo dovessero richiedere.
Esempi di domande e/o esercizi frequenti
Implementare un aspetto software per il caching dei dati
Implementare una chiamata ad un metodo in modo asincrono
Descrivere la gestione della sessione
Descrivere il controllo degli accessi tramite design pattern Role-based access control