SlideShare a Scribd company logo
Axon Framework
Dal monolite ai microservizi con un approccio evolutivo
Sara Pellegrini
Software Engineer AxonIQ
Chi sono
sara@axoniq.io
@_sara_p_
sarapellegrini
https://www.linkedin.com/in/
sara-pellegrini-55a37913/
Di cosa parleremo
• Monolite vs Big Ball of Mud
• Monolite vs Microservizi
• CQRS
• Command Model
• Projections
• Axon Framework
• Event Sourcing
• AxonDB
• Location Transparency
• AxonHub
Monolite
St Breock Downs Monolith -
www.cornwalls.co.uk
Architecture a layer
Interfaccia grafica
Layer dei servizi
Layer di accesso ai dati
Modellodeldominio
Modellodel
dominio
Le applicazioni monolitiche, crescendo nel tempo,
spesso degenerano nella big ball of mud
Source: http://www.sabisabi.com/images/DungBeetle-on-dung.JPG
“
”
[…] the microservice architectural style is
an approach to developing a single
application as a suite of small services, each
running in its own process and
communicating with lightweight
mechanisms […]
I microservizi
Martin Fowler
Il percorso verso i microservizi
Microservices system
Almost all the cases where I've heard of a
system that was built as a microservice system
from scratch, it has ended up in serious trouble.
Monoliths
Almost all the successful microservice stories
have started with a monolith that got too big
and was broken up
Martin Fowler
Source: http://martinfowler.com/bliki/MonolithFirst.html
Source: http://martinfowler.com/bliki/MonolithFirst.html
I monoliti non sono tutti uguali
St Breock Downs Monolith -
www.cornwalls.co.uk
Source: http://www.sabisabi.com/images/DungBeetle-on-dung.JPG
Agilità Scalabilità
Complessità
addizionale
€€€€€€
Command Query Responsibility Segregation
Command
model
Projections
Client
Eventi
Comandi Queries
Servizio
Servizio
Servizio
“Normale” QUERY SQL
22 JOINS 6 SUBQUERIES
Architecture a layer
Interfaccia grafica
Layer dei servizi
Layer di accesso ai dati
Modellodeldominio
Method invocation
Cache Worker
pools
Web
Cache
Session
replication
Distributed 2nd level
cache
Query
Cache
Gli aggregati rappresentano i
limiti della consistenza.
Se necessario, possono esistere
dei riferimenti tramite ID tra gli
aggreati, ma senza alcuna
garanzia di integrità
referenziale.
I clients non possono agire
arbitrariamente su tutti gli
oggetti. Possono farlo solo
attraverso l’aggregate root.
Il modello di scrittura
Il modello di lettura
Projections
E’ un modello ottimizzato per le
specifiche esigenze progettuali di
lettura dei dati.
Tipicamente vengono create molte
projections separate invece di un
unico grande modello.
Read models
Projections
Command
model
Projections
Client
Eventi
Comandi Queries
Questa struttura rende
naturale la suddivisione dei
vari componenti in diversi
microservizi
Location transparency
A Component should not be aware, nor make any
assumptions, of the location of Components it
interacts with
Un componente non deve né essere a conoscenza né fare alcuna
assunzione rispetto a dove si trovano i componenti coi quali interagisce.
La location transparency parte da un corretto design delle API
Axon Framework
Libreria che semplifica l’implementazione di applicazioni Java
basate su DDD, CQRS e ES
Comandi
public class ConfermaOrdine {
@TargetAggregateIdentifier
private UUID ordineId;
public ConfermaOrdine(UUID ordineId) {
this.ordineId = ordineId;
}
public UUID ordineId() {
return this.ordineId;
}
}
Un comando è la richiesta di
effettuare un’operazione.
Inviare comandi
@RestController
public class OrdineController {
@Autowired
private CommandGateway commandGateway;
@PostMapping("ordine/{id}/conferma")
public void confermaOrdine(@PathVariable("id")UUID id) {
commandGateway.send(new ConfermaOrdine(id));
}
}
Command handler
@Aggregate
public class Ordine {
@AggregateIdentifier private UUID ordineId;
@CommandHandler
void handle(ConfermaOrdine cmd) {
...
}
....
Evento
Un evento è la notifica di qualcosa
di rilevante accaduto nel dominio.
public class OrdineConfermato {
private UUID ordineId;
public ConfermaOrdine(UUID ordineId) {
this.ordineId = ordineId;
}
public UUID ordineId() {
return this.ordineId;
}
}
Event handler
@Component
public class OrdiniOverviewProjection {
@Autowired
private EntityManager entityManager;
@EventHandler
void handle(OrdineConfermato evento) {
/* Recupera l’entità JPA e aggiorna lo stato. */
}
}
Query handler@Component
public class OrdiniQueries {
@Autowired
EntityManager entityManager;
@QueryHandler
public List<Ordine> find(OrdiniConfermati query) {
Query jpaQuery =
entityManager.createQuery("select e from Ordine e where e.confermato = true",
Ordine.class);
jpaQuery.setFirstResult(query.getOffset());
jpaQuery.setMaxResults(query.getLimit());
return jpaQuery.getResultList();
}
}
Event-Driven
Architecture
Event
Sourcing
Event Sourcing
Gli eventi sono l’elemento
base della persistenza del
dominio
Persistenza tradizionale (Non event sourced)
Esempio di implementazione di un sistema di e-commerce
Cosa accade nel databaseCosa accade nell’applicazione
L’utente inizia un nuovo
ordine
Ordine 93771261272
L’utente aggiunge un paio di
occhiali da sole all’ordine
Ordine 93771261272
1 occhiali da sole
Persistenza tradizionale (Non event sourced)
Esempio di implementazione di un sistema di e-commerce
Cosa accade nel databaseCosa accade nell’applicazione
L’utente aggiunge un paio di
scarpe da ginnastica all’ordine
Ordine 93771261272
1 scarpe da ginnastica
1 occhiali da sole
Persistenza tradizionale (Non event sourced)
Esempio di implementazione di un sistema di e-commerce
Cosa accade nel databaseCosa accade nell’applicazione
L’utente aggiunge una T-shirt
all’ordine
Ordine 93771261272
1 scarpe da ginnastica
1 occhiali da sole
1 T-shirt
Persistenza tradizionale (Non event sourced)
Esempio di implementazione di un sistema di e-commerce
Cosa accade nel databaseCosa accade nell’applicazione
L’utente decide che non vuole
comprare le scarpe da
ginnastica e le rimuove
dall’ordine
Ordine 93771261272
1 scarpe da ginnastica
1 occhiali da sole
Persistenza tradizionale (Non event sourced)
Esempio di implementazione di un sistema di e-commerce
Cosa accade nel databaseCosa accade nell’applicazione
1 T-shirt
L’utente inserisce l’indirizzo e
le informazioni per il
pagamento e conferma
l’ordine Ordine 93771261272
1 T-shirt
1 occhiali da sole
Cliente: Jane
Persistenza tradizionale (Non event sourced)
Esempio di implementazione di un sistema di e-commerce
Cosa accade nel databaseCosa accade nell’applicazione
Stato: confermato
Persistenza event sourced
Esempio di implementazione di un sistema di e-commerce
L’utente inizia un nuovo
ordine
OrdineCreato (93771261272)
Persistenza event sourced
Esempio di implementazione di un sistema di e-commerce
Cosa accade nel databaseCosa accade nell’applicazione
OrdineCreato (93771261272)
ProdottoAggiunto(occhiali da sole)
Persistenza event sourced
Esempio di implementazione di un sistema di e-commerce
Cosa accade nel databaseCosa accade nell’applicazione
L’utente aggiunge un paio di
occhiali da sole all’ordine
1 sunglasses
OrdineCreato (93771261272)
ProdottoAggiunto(occhiali da sole)
ProdottoAggiunto(scarpe da ginnastica)
Persistenza event sourced
Esempio di implementazione di un sistema di e-commerce
Cosa accade nel databaseCosa accade nell’applicazione
L’utente aggiunge un paio di
scarpe da ginnastica all’ordine
1 sunglasses
OrdineCreato (93771261272)
ProdottoAggiunto(occhiali da sole)
ProdottoAggiunto(scarpe da ginnastica)
ProdottoAggiunto(T-shirt)
Persistenza event sourced
Esempio di implementazione di un sistema di e-commerce
Cosa accade nel databaseCosa accade nell’applicazione
L’utente aggiunge una T-shirt
all’ordine
1 sunglasses
OrdineCreato (93771261272)
ProdottoAggiunto(occhiali da sole)
ProdottoAggiunto(scarpe da ginnastica)
ProdottoAggiunto(T-shirt)
ProdottoRimosso(scarpe da ginnastica)
Persistenza event sourced
Esempio di implementazione di un sistema di e-commerce
Cosa accade nel databaseCosa accade nell’applicazione
L’utente decide che non vuole
comprare le scarpe da
ginnastica e le rimuove
dall’ordine
1 sunglasses
OrdineCreato (93771261272)
ProdottoAggiunto(occhiali da sole)
ProdottoAggiunto(scarpe da ginnastica)
ProdottoAggiunto(T-shirt)
ProdottoRimosso(scarpe da ginnastica)
OrdineConfermato (Jane)
Persistenza event sourced
Esempio di implementazione di un sistema di e-commerce
Cosa accade nel databaseCosa accade nell’applicazione
L’utente inserisce l’indirizzo e
le informazioni per il
pagamento e conferma
l’ordine
• Auditing
• Data mining, analytics
Ragioni tecniche
Ragioni di business
Svantaggi
Perchè usare l’event sourcing
• E’ necessario mantenere il supporto
di tutti gli eventi del passato
• l’Event Store cresce sempre
• Gli eventi rappresentato un’unica fonte di verità
• Semplifica la riproduzione di un
malfunzionamento
• Replay degli eventi per la creazione di nuove
projection o la rigenerazione di quelle esistenti
• Rende esplicito l’intento dell’utente
@Aggregate
public class Ordine {
@AggregateIdentifier UUID ordineId;
private Boolean confermato;
@CommandHandler
void handle(ConfermaOrdine comando) {
if(confermato) {
throw new IllegalStateException("L’ordine è già stato confermato.");
}
apply(new OrdineConfermato(comando.ordineId()));
}
@EventSourcingHandler
void handle(OrdineConfermato evento) {
confermato = true;
}
}
Leggere Eventi Scrivere Eventi
Tutti gli eventi di un determinato
aggregato (event sourced repository)
Tutti gli eventi da un determinato
momento (replay per i read models)
Lettura degli eventi in ordine temporale
Aggiungere nuovi eventi
Inserire eventi in un punto random
Aggiornare gli eventi
Cancellare gli eventi
Queries ad-hoc (per ragioni di
debug, monitoring, supporto)
Event store
AxonDB
• Event Store prodotto da AxonIQ
• Scritto in Java da zero
• Pensato appositamente per l’event sourcing
• Gestisce i file direttamente - non si appoggia a un database
• Fornisce interfaccie aperte basate su HTTP+JSON e gRPC
• Nativamente integrato con Axon Framework
time
Append-only
by design
time
Event-stream
suddiviso in
segmenti
Data Index
Bloom-
filter
In ogni segmento è
possibile ricercare per
aggregate id + seq no
search
La ricerca di eventi va
a ritroso nel tempo
Iniziare a utilizzare AxonDB
• Pagina di prodotto: https://axoniq.io/products/axondb.html
• La Developer Edition è gratuita, può essere scaricata insieme
al manuale di utilizzo.
Vantaggi
• Sistemi in tempo reale
• Polling -> Push
• System integration
• Test funzionali Given-When-Then
• Supporta lo sviluppo di un
monolite strutturato
che possa essere all’occorrenza
facilmente suddiviso in microservizi.
DDD
CQRS
ES
Axon Framework
Suddividere il monolite non è
sempre semplice
Source: http://www.sabisabi.com/images/DungBeetle-on-dung.JPG
Agilità
Complessità addizionale
nella gestione del
"Monolite distribuito"
Scalabilità
Complessità addizionale per la
distribuzione in microservizi di
un sistema ben progettato
Agilità Scalabilità
Location transparency in Axon
@CommandHandler
Componente applicativo
<<interface>>
CommandBus
Si registra a
<<class>>
SimpleCommandBus
implementa
CommandBus – QueryBus e EventBus si comportano analogamente
<<class>>
AsyncCommandBus
implementa
<<class>>
DistributedCommandBus
Client
Invia a
Invia a
implementa
Solo l’intelligenza che serve
dumb smart
Message Broker
Invia Messaggi. L’unico
vantaggio che offre è
l’affidabilità
Enterprise Service Bus
Comprende il contenuto dei
messaggi. È difficile da
configurare e da manutenere
AxonHub
Capisce la differenza fra Eventi, Comandi e
Queries e determina il corretto paradigma di
routing. Non si interessa del contenuto dei
messaggi.
Come iniziare con AxonHub
• Pagina di prodotto: https://axoniq.io/product-
overview/axonhub
• La Developer Edition è gratuita, può essere scaricata insieme
al manuale di utilizzo.
Domande?
Conferenza: 21 settembre - Amsterdam - promo code: Axon.Friend
Event-Driven Microservices Conference by AxonIQ
axoniq.io/conference
Training: 19-20 settembre - Amsterdam
Introduction and advanced features of Axon Framework
axoniq.io/events
Webinar: 7 giugno - online
Microservices with Axon platform - live coding webinar
axoniq.io/webinars

More Related Content

Similar to Axon Framework - Dal monolite ai microservizi con un approccio evolutivo

CCI2017 - Protect and manage your digital transformation - Giuseppe D'Osualdo...
CCI2017 - Protect and manage your digital transformation - Giuseppe D'Osualdo...CCI2017 - Protect and manage your digital transformation - Giuseppe D'Osualdo...
CCI2017 - Protect and manage your digital transformation - Giuseppe D'Osualdo...
walk2talk srl
 
Power BI Streaming Data Flow e Azure IoT Central
Power BI Streaming Data Flow e Azure IoT CentralPower BI Streaming Data Flow e Azure IoT Central
Power BI Streaming Data Flow e Azure IoT Central
Marco Parenzan
 
Application insights-gabrome18
Application insights-gabrome18Application insights-gabrome18
Application insights-gabrome18
Roberto Albano
 
Manuel Toniato e Simone Caretta: Migliorare le performance di ricerca con Ela...
Manuel Toniato e Simone Caretta: Migliorare le performance di ricerca con Ela...Manuel Toniato e Simone Caretta: Migliorare le performance di ricerca con Ela...
Manuel Toniato e Simone Caretta: Migliorare le performance di ricerca con Ela...
Meet Magento Italy
 
PASS Virtual Chapter - SQL Server Continuous Integration
PASS Virtual Chapter - SQL Server Continuous IntegrationPASS Virtual Chapter - SQL Server Continuous Integration
PASS Virtual Chapter - SQL Server Continuous Integration
Alessandro Alpi
 
Application insights - Power is nothing without control
Application insights - Power is nothing without controlApplication insights - Power is nothing without control
Application insights - Power is nothing without control
Roberto Albano
 
Rendere flessibili e trasformare architetture IT di vecchio tipo: passaggio d...
Rendere flessibili e trasformare architetture IT di vecchio tipo:passaggio d...Rendere flessibili e trasformare architetture IT di vecchio tipo:passaggio d...
Rendere flessibili e trasformare architetture IT di vecchio tipo: passaggio d...Emanuele Della Valle
 
SWE-ET: la soluzione Italiana alla Semantic Web Service Challenge 2006
SWE-ET: la soluzione Italiana alla Semantic Web Service Challenge 2006SWE-ET: la soluzione Italiana alla Semantic Web Service Challenge 2006
SWE-ET: la soluzione Italiana alla Semantic Web Service Challenge 2006Emanuele Della Valle
 
DevOpsHeroes 2016 - Realizzare Continouous Integration con SQL Server e Visua...
DevOpsHeroes 2016 - Realizzare Continouous Integration con SQL Server e Visua...DevOpsHeroes 2016 - Realizzare Continouous Integration con SQL Server e Visua...
DevOpsHeroes 2016 - Realizzare Continouous Integration con SQL Server e Visua...
Alessandro Alpi
 
Introduzione al Domain Driven Design (DDD)
Introduzione al Domain Driven Design (DDD)Introduzione al Domain Driven Design (DDD)
Introduzione al Domain Driven Design (DDD)
DotNetMarche
 
Android (Un)Security Guidelines - VoidSec
Android (Un)Security Guidelines - VoidSecAndroid (Un)Security Guidelines - VoidSec
Android (Un)Security Guidelines - VoidSecPaolo Stagno
 
Win05 accesso ai dati in win 8
Win05   accesso ai dati in win 8Win05   accesso ai dati in win 8
Win05 accesso ai dati in win 8DotNetCampus
 
Virtual Agency
Virtual AgencyVirtual Agency
Virtual Agency
Enrico Micco
 
Data Virtualization per una Multi-Cloud Data Integration senza barriere né co...
Data Virtualization per una Multi-Cloud Data Integration senza barriere né co...Data Virtualization per una Multi-Cloud Data Integration senza barriere né co...
Data Virtualization per una Multi-Cloud Data Integration senza barriere né co...
Denodo
 
SQL Server & GDPR
SQL Server & GDPRSQL Server & GDPR
SQL Server & GDPR
Gianluca Hotz
 
Power BI data flow and Azure IoT Central
Power BI data flow and Azure IoT CentralPower BI data flow and Azure IoT Central
Power BI data flow and Azure IoT Central
Marco Parenzan
 
Web Usability + Data
Web Usability + DataWeb Usability + Data
Web Usability + Data
Chiara Danese
 
Architetture a Microservizi (con Kubernetes)
Architetture a Microservizi (con Kubernetes)Architetture a Microservizi (con Kubernetes)
Architetture a Microservizi (con Kubernetes)
Steve Maraspin
 
Integrazione continua con TFS Build
Integrazione continua con TFS BuildIntegrazione continua con TFS Build
Integrazione continua con TFS Build
Gian Maria Ricci
 
Layered Expression Trees feat. CQRS
Layered Expression Trees feat. CQRSLayered Expression Trees feat. CQRS
Layered Expression Trees feat. CQRS
Andrea Saltarello
 

Similar to Axon Framework - Dal monolite ai microservizi con un approccio evolutivo (20)

CCI2017 - Protect and manage your digital transformation - Giuseppe D'Osualdo...
CCI2017 - Protect and manage your digital transformation - Giuseppe D'Osualdo...CCI2017 - Protect and manage your digital transformation - Giuseppe D'Osualdo...
CCI2017 - Protect and manage your digital transformation - Giuseppe D'Osualdo...
 
Power BI Streaming Data Flow e Azure IoT Central
Power BI Streaming Data Flow e Azure IoT CentralPower BI Streaming Data Flow e Azure IoT Central
Power BI Streaming Data Flow e Azure IoT Central
 
Application insights-gabrome18
Application insights-gabrome18Application insights-gabrome18
Application insights-gabrome18
 
Manuel Toniato e Simone Caretta: Migliorare le performance di ricerca con Ela...
Manuel Toniato e Simone Caretta: Migliorare le performance di ricerca con Ela...Manuel Toniato e Simone Caretta: Migliorare le performance di ricerca con Ela...
Manuel Toniato e Simone Caretta: Migliorare le performance di ricerca con Ela...
 
PASS Virtual Chapter - SQL Server Continuous Integration
PASS Virtual Chapter - SQL Server Continuous IntegrationPASS Virtual Chapter - SQL Server Continuous Integration
PASS Virtual Chapter - SQL Server Continuous Integration
 
Application insights - Power is nothing without control
Application insights - Power is nothing without controlApplication insights - Power is nothing without control
Application insights - Power is nothing without control
 
Rendere flessibili e trasformare architetture IT di vecchio tipo: passaggio d...
Rendere flessibili e trasformare architetture IT di vecchio tipo:passaggio d...Rendere flessibili e trasformare architetture IT di vecchio tipo:passaggio d...
Rendere flessibili e trasformare architetture IT di vecchio tipo: passaggio d...
 
SWE-ET: la soluzione Italiana alla Semantic Web Service Challenge 2006
SWE-ET: la soluzione Italiana alla Semantic Web Service Challenge 2006SWE-ET: la soluzione Italiana alla Semantic Web Service Challenge 2006
SWE-ET: la soluzione Italiana alla Semantic Web Service Challenge 2006
 
DevOpsHeroes 2016 - Realizzare Continouous Integration con SQL Server e Visua...
DevOpsHeroes 2016 - Realizzare Continouous Integration con SQL Server e Visua...DevOpsHeroes 2016 - Realizzare Continouous Integration con SQL Server e Visua...
DevOpsHeroes 2016 - Realizzare Continouous Integration con SQL Server e Visua...
 
Introduzione al Domain Driven Design (DDD)
Introduzione al Domain Driven Design (DDD)Introduzione al Domain Driven Design (DDD)
Introduzione al Domain Driven Design (DDD)
 
Android (Un)Security Guidelines - VoidSec
Android (Un)Security Guidelines - VoidSecAndroid (Un)Security Guidelines - VoidSec
Android (Un)Security Guidelines - VoidSec
 
Win05 accesso ai dati in win 8
Win05   accesso ai dati in win 8Win05   accesso ai dati in win 8
Win05 accesso ai dati in win 8
 
Virtual Agency
Virtual AgencyVirtual Agency
Virtual Agency
 
Data Virtualization per una Multi-Cloud Data Integration senza barriere né co...
Data Virtualization per una Multi-Cloud Data Integration senza barriere né co...Data Virtualization per una Multi-Cloud Data Integration senza barriere né co...
Data Virtualization per una Multi-Cloud Data Integration senza barriere né co...
 
SQL Server & GDPR
SQL Server & GDPRSQL Server & GDPR
SQL Server & GDPR
 
Power BI data flow and Azure IoT Central
Power BI data flow and Azure IoT CentralPower BI data flow and Azure IoT Central
Power BI data flow and Azure IoT Central
 
Web Usability + Data
Web Usability + DataWeb Usability + Data
Web Usability + Data
 
Architetture a Microservizi (con Kubernetes)
Architetture a Microservizi (con Kubernetes)Architetture a Microservizi (con Kubernetes)
Architetture a Microservizi (con Kubernetes)
 
Integrazione continua con TFS Build
Integrazione continua con TFS BuildIntegrazione continua con TFS Build
Integrazione continua con TFS Build
 
Layered Expression Trees feat. CQRS
Layered Expression Trees feat. CQRSLayered Expression Trees feat. CQRS
Layered Expression Trees feat. CQRS
 

Axon Framework - Dal monolite ai microservizi con un approccio evolutivo

  • 1. Axon Framework Dal monolite ai microservizi con un approccio evolutivo
  • 2. Sara Pellegrini Software Engineer AxonIQ Chi sono sara@axoniq.io @_sara_p_ sarapellegrini https://www.linkedin.com/in/ sara-pellegrini-55a37913/
  • 3. Di cosa parleremo • Monolite vs Big Ball of Mud • Monolite vs Microservizi • CQRS • Command Model • Projections • Axon Framework • Event Sourcing • AxonDB • Location Transparency • AxonHub
  • 4. Monolite St Breock Downs Monolith - www.cornwalls.co.uk
  • 5. Architecture a layer Interfaccia grafica Layer dei servizi Layer di accesso ai dati Modellodeldominio
  • 6. Modellodel dominio Le applicazioni monolitiche, crescendo nel tempo, spesso degenerano nella big ball of mud
  • 8. “ ” […] the microservice architectural style is an approach to developing a single application as a suite of small services, each running in its own process and communicating with lightweight mechanisms […] I microservizi Martin Fowler
  • 9. Il percorso verso i microservizi Microservices system Almost all the cases where I've heard of a system that was built as a microservice system from scratch, it has ended up in serious trouble. Monoliths Almost all the successful microservice stories have started with a monolith that got too big and was broken up Martin Fowler Source: http://martinfowler.com/bliki/MonolithFirst.html
  • 11. I monoliti non sono tutti uguali St Breock Downs Monolith - www.cornwalls.co.uk Source: http://www.sabisabi.com/images/DungBeetle-on-dung.JPG
  • 14. Command Query Responsibility Segregation Command model Projections Client Eventi Comandi Queries
  • 16. “Normale” QUERY SQL 22 JOINS 6 SUBQUERIES
  • 17. Architecture a layer Interfaccia grafica Layer dei servizi Layer di accesso ai dati Modellodeldominio Method invocation Cache Worker pools Web Cache Session replication Distributed 2nd level cache Query Cache
  • 18.
  • 19.
  • 20. Gli aggregati rappresentano i limiti della consistenza. Se necessario, possono esistere dei riferimenti tramite ID tra gli aggreati, ma senza alcuna garanzia di integrità referenziale. I clients non possono agire arbitrariamente su tutti gli oggetti. Possono farlo solo attraverso l’aggregate root. Il modello di scrittura
  • 21. Il modello di lettura Projections E’ un modello ottimizzato per le specifiche esigenze progettuali di lettura dei dati. Tipicamente vengono create molte projections separate invece di un unico grande modello.
  • 23. Command model Projections Client Eventi Comandi Queries Questa struttura rende naturale la suddivisione dei vari componenti in diversi microservizi
  • 24. Location transparency A Component should not be aware, nor make any assumptions, of the location of Components it interacts with Un componente non deve né essere a conoscenza né fare alcuna assunzione rispetto a dove si trovano i componenti coi quali interagisce. La location transparency parte da un corretto design delle API
  • 25. Axon Framework Libreria che semplifica l’implementazione di applicazioni Java basate su DDD, CQRS e ES
  • 26.
  • 27. Comandi public class ConfermaOrdine { @TargetAggregateIdentifier private UUID ordineId; public ConfermaOrdine(UUID ordineId) { this.ordineId = ordineId; } public UUID ordineId() { return this.ordineId; } } Un comando è la richiesta di effettuare un’operazione.
  • 28. Inviare comandi @RestController public class OrdineController { @Autowired private CommandGateway commandGateway; @PostMapping("ordine/{id}/conferma") public void confermaOrdine(@PathVariable("id")UUID id) { commandGateway.send(new ConfermaOrdine(id)); } }
  • 29.
  • 30. Command handler @Aggregate public class Ordine { @AggregateIdentifier private UUID ordineId; @CommandHandler void handle(ConfermaOrdine cmd) { ... } ....
  • 31. Evento Un evento è la notifica di qualcosa di rilevante accaduto nel dominio. public class OrdineConfermato { private UUID ordineId; public ConfermaOrdine(UUID ordineId) { this.ordineId = ordineId; } public UUID ordineId() { return this.ordineId; } }
  • 32.
  • 33. Event handler @Component public class OrdiniOverviewProjection { @Autowired private EntityManager entityManager; @EventHandler void handle(OrdineConfermato evento) { /* Recupera l’entità JPA e aggiorna lo stato. */ } }
  • 34.
  • 35. Query handler@Component public class OrdiniQueries { @Autowired EntityManager entityManager; @QueryHandler public List<Ordine> find(OrdiniConfermati query) { Query jpaQuery = entityManager.createQuery("select e from Ordine e where e.confermato = true", Ordine.class); jpaQuery.setFirstResult(query.getOffset()); jpaQuery.setMaxResults(query.getLimit()); return jpaQuery.getResultList(); } }
  • 36.
  • 37. Event-Driven Architecture Event Sourcing Event Sourcing Gli eventi sono l’elemento base della persistenza del dominio
  • 38. Persistenza tradizionale (Non event sourced) Esempio di implementazione di un sistema di e-commerce Cosa accade nel databaseCosa accade nell’applicazione L’utente inizia un nuovo ordine Ordine 93771261272
  • 39. L’utente aggiunge un paio di occhiali da sole all’ordine Ordine 93771261272 1 occhiali da sole Persistenza tradizionale (Non event sourced) Esempio di implementazione di un sistema di e-commerce Cosa accade nel databaseCosa accade nell’applicazione
  • 40. L’utente aggiunge un paio di scarpe da ginnastica all’ordine Ordine 93771261272 1 scarpe da ginnastica 1 occhiali da sole Persistenza tradizionale (Non event sourced) Esempio di implementazione di un sistema di e-commerce Cosa accade nel databaseCosa accade nell’applicazione
  • 41. L’utente aggiunge una T-shirt all’ordine Ordine 93771261272 1 scarpe da ginnastica 1 occhiali da sole 1 T-shirt Persistenza tradizionale (Non event sourced) Esempio di implementazione di un sistema di e-commerce Cosa accade nel databaseCosa accade nell’applicazione
  • 42. L’utente decide che non vuole comprare le scarpe da ginnastica e le rimuove dall’ordine Ordine 93771261272 1 scarpe da ginnastica 1 occhiali da sole Persistenza tradizionale (Non event sourced) Esempio di implementazione di un sistema di e-commerce Cosa accade nel databaseCosa accade nell’applicazione 1 T-shirt
  • 43. L’utente inserisce l’indirizzo e le informazioni per il pagamento e conferma l’ordine Ordine 93771261272 1 T-shirt 1 occhiali da sole Cliente: Jane Persistenza tradizionale (Non event sourced) Esempio di implementazione di un sistema di e-commerce Cosa accade nel databaseCosa accade nell’applicazione Stato: confermato
  • 44. Persistenza event sourced Esempio di implementazione di un sistema di e-commerce
  • 45. L’utente inizia un nuovo ordine OrdineCreato (93771261272) Persistenza event sourced Esempio di implementazione di un sistema di e-commerce Cosa accade nel databaseCosa accade nell’applicazione
  • 46. OrdineCreato (93771261272) ProdottoAggiunto(occhiali da sole) Persistenza event sourced Esempio di implementazione di un sistema di e-commerce Cosa accade nel databaseCosa accade nell’applicazione L’utente aggiunge un paio di occhiali da sole all’ordine
  • 47. 1 sunglasses OrdineCreato (93771261272) ProdottoAggiunto(occhiali da sole) ProdottoAggiunto(scarpe da ginnastica) Persistenza event sourced Esempio di implementazione di un sistema di e-commerce Cosa accade nel databaseCosa accade nell’applicazione L’utente aggiunge un paio di scarpe da ginnastica all’ordine
  • 48. 1 sunglasses OrdineCreato (93771261272) ProdottoAggiunto(occhiali da sole) ProdottoAggiunto(scarpe da ginnastica) ProdottoAggiunto(T-shirt) Persistenza event sourced Esempio di implementazione di un sistema di e-commerce Cosa accade nel databaseCosa accade nell’applicazione L’utente aggiunge una T-shirt all’ordine
  • 49. 1 sunglasses OrdineCreato (93771261272) ProdottoAggiunto(occhiali da sole) ProdottoAggiunto(scarpe da ginnastica) ProdottoAggiunto(T-shirt) ProdottoRimosso(scarpe da ginnastica) Persistenza event sourced Esempio di implementazione di un sistema di e-commerce Cosa accade nel databaseCosa accade nell’applicazione L’utente decide che non vuole comprare le scarpe da ginnastica e le rimuove dall’ordine
  • 50. 1 sunglasses OrdineCreato (93771261272) ProdottoAggiunto(occhiali da sole) ProdottoAggiunto(scarpe da ginnastica) ProdottoAggiunto(T-shirt) ProdottoRimosso(scarpe da ginnastica) OrdineConfermato (Jane) Persistenza event sourced Esempio di implementazione di un sistema di e-commerce Cosa accade nel databaseCosa accade nell’applicazione L’utente inserisce l’indirizzo e le informazioni per il pagamento e conferma l’ordine
  • 51. • Auditing • Data mining, analytics Ragioni tecniche Ragioni di business Svantaggi Perchè usare l’event sourcing • E’ necessario mantenere il supporto di tutti gli eventi del passato • l’Event Store cresce sempre • Gli eventi rappresentato un’unica fonte di verità • Semplifica la riproduzione di un malfunzionamento • Replay degli eventi per la creazione di nuove projection o la rigenerazione di quelle esistenti • Rende esplicito l’intento dell’utente
  • 52. @Aggregate public class Ordine { @AggregateIdentifier UUID ordineId; private Boolean confermato; @CommandHandler void handle(ConfermaOrdine comando) { if(confermato) { throw new IllegalStateException("L’ordine è già stato confermato."); } apply(new OrdineConfermato(comando.ordineId())); } @EventSourcingHandler void handle(OrdineConfermato evento) { confermato = true; } }
  • 53. Leggere Eventi Scrivere Eventi Tutti gli eventi di un determinato aggregato (event sourced repository) Tutti gli eventi da un determinato momento (replay per i read models) Lettura degli eventi in ordine temporale Aggiungere nuovi eventi Inserire eventi in un punto random Aggiornare gli eventi Cancellare gli eventi Queries ad-hoc (per ragioni di debug, monitoring, supporto) Event store
  • 54. AxonDB • Event Store prodotto da AxonIQ • Scritto in Java da zero • Pensato appositamente per l’event sourcing • Gestisce i file direttamente - non si appoggia a un database • Fornisce interfaccie aperte basate su HTTP+JSON e gRPC • Nativamente integrato con Axon Framework
  • 55. time Append-only by design time Event-stream suddiviso in segmenti Data Index Bloom- filter In ogni segmento è possibile ricercare per aggregate id + seq no search La ricerca di eventi va a ritroso nel tempo
  • 56.
  • 57. Iniziare a utilizzare AxonDB • Pagina di prodotto: https://axoniq.io/products/axondb.html • La Developer Edition è gratuita, può essere scaricata insieme al manuale di utilizzo.
  • 58. Vantaggi • Sistemi in tempo reale • Polling -> Push • System integration • Test funzionali Given-When-Then • Supporta lo sviluppo di un monolite strutturato che possa essere all’occorrenza facilmente suddiviso in microservizi. DDD CQRS ES Axon Framework
  • 59. Suddividere il monolite non è sempre semplice
  • 61. Agilità Complessità addizionale nella gestione del "Monolite distribuito" Scalabilità
  • 62.
  • 63. Complessità addizionale per la distribuzione in microservizi di un sistema ben progettato Agilità Scalabilità
  • 64. Location transparency in Axon @CommandHandler Componente applicativo <<interface>> CommandBus Si registra a <<class>> SimpleCommandBus implementa CommandBus – QueryBus e EventBus si comportano analogamente <<class>> AsyncCommandBus implementa <<class>> DistributedCommandBus Client Invia a Invia a implementa
  • 65.
  • 66. Solo l’intelligenza che serve dumb smart Message Broker Invia Messaggi. L’unico vantaggio che offre è l’affidabilità Enterprise Service Bus Comprende il contenuto dei messaggi. È difficile da configurare e da manutenere AxonHub Capisce la differenza fra Eventi, Comandi e Queries e determina il corretto paradigma di routing. Non si interessa del contenuto dei messaggi.
  • 67.
  • 68. Come iniziare con AxonHub • Pagina di prodotto: https://axoniq.io/product- overview/axonhub • La Developer Edition è gratuita, può essere scaricata insieme al manuale di utilizzo.
  • 69. Domande? Conferenza: 21 settembre - Amsterdam - promo code: Axon.Friend Event-Driven Microservices Conference by AxonIQ axoniq.io/conference Training: 19-20 settembre - Amsterdam Introduction and advanced features of Axon Framework axoniq.io/events Webinar: 7 giugno - online Microservices with Axon platform - live coding webinar axoniq.io/webinars