SlideShare ist ein Scribd-Unternehmen logo
1 von 37
Downloaden Sie, um offline zu lesen
@jefrajames
Microservices et cohérence des
données …
Mais on fait comment pour de vrai ?
whoami
{
"name" : "JF James",
"experience_ in_it" : 36,
"company" : "Worldline",
"domain" : "Payment & secured transactions" ,
"skills" : [ " Software architecture" , "Java", "DevRel",
"Open Source" , "MicroProfile", "Jakarta EE" ]
}
Une (vieille) histoire de SOA
• Refonte d’une plateforme de paiement en SOA
• Des services distribuée, chacun sa base de données
• 2 grands challenges :
1. Définir et borner les services
2. Garantir la cohérence d’ensemble des données
Transaction ACID locale
Module
1
BdD
Begin Commit
Module
2
Module
3
Rollback
Atomicity-Consistency-isolation-Durability
Read Uncommitted
Read Committed
Repeatable Read
Serializable
Transaction ACID locale
• Simplicité de développement
• Performant & scalable
• Eprouvé en production
• Historiquement supporté : serveur d’appli, BdD SQL, broker JMS
Transaction ACID distribuée
BdD
1
BdD
2
BdD
3
Transaction
Manager
Service
1
Service
2
Service
3
Begin Commit
Rollback
Transaction ACID distribuée
• Simplicité de développement mais …
• Fort couplage technique
• Coût élevé de l’isolation : concurrence et scalabilité réduite
• Fragilité liée à la coordination synchrone
• Non supporté par NoSQL, Kafka …
• Contexte transactionnel non propagé par REST, GraphQL, gRPC …
Un point moins ACID SVP
Service
1
BdD
1
Start Confirmation
Service
2
Service
3
BdD
2
BdD
3
LRA/SAGA
ACID locale 1 ACID locale 2 ACID locale 3
Compensation
C’est trop compliqué !
Et les erreurs de compensation ?
Trop compliqué ?
Erreur/Transaction ACID LRA/SAGA
Technique
Fonctionnelle
Et les erreurs de compensation ?
• Action de compensation simple et rapide
• Différer les opérations trop complexes et risquées
Principes de coordination
• Des transactions ACID locales (ou pas si NoSQL)
• Une coordination globale légère, faiblement couplée
• Des opérations de compensation explicites
• Perte de l’isolation globale : de ACID à ACD
Les solutions
Ne rien faire et traiter par exception
MicroProfile
GraphQL
Config
Fault
Tolerance
Fallback
Retry
Timeout
Circuit breaker
Bulkhead
OpenAPI
Rest
Client
JWT
API
Jakarta EE Foundation
Health
Metrics
Open
Tracing
Observability
Reactive
Messaging
Reactive
Streams
Context
Propagation
Long Running
Action
Core
JAX-RS CDI JSON
Standalone specs
Un peu de (bonne) lecture
/
MicroProfile LRA Eventuate SAGA
Origine
SAGA: H. Garcia-Molina & K. Salem
1987 Association for Computing
Eventuate: 2017
Nature
Version
En cours
Implémentations
Modèle de
programmation
Echange
Messaging
Asynchrone
Infrastructure r
En action !
Dispo sur GitHub !
https://github.com/jefrajames/lra-demo
https://github.com/jefrajames/saga-demo
Démo
20
Holiday
Service
Hotel
Service
Trip
Service
Car
Service
PENDING
REJECTED
ACCEPTED
CANCELED
PENDING
REJECTED
ACCEPTED
CANCELED
MicroProfile LRA démo
Architecture MicroProfile LRA
Holiday
Service
Trip
Service
// Holiday Service Code
@LRA(value = LRA.Type.REQUIRED, end = true, timeLimit = 2, timeUnit = ChronoUnit.SECONDS,
cancelOn = {Response.Status.INTERNAL_SERVER_ERROR},
cancelOnFamily = {Response.Status.Family.CLIENT_ERROR})
@POST @Path("/book")
public Response book(@HeaderParam(LRA_HTTP_CONTEXT_HEADER) String lraId …) { … }
@Compensate
@PUT @Path("/compensate")
public Response compensate(@HeaderParam(LRA_HTTP_CONTEXT_HEADER) String lraId) { … }
@Complete
@PUT @Path("/complete")
public Response complete(@HeaderParam(LRA_HTTP_CONTEXT_HEADER) String lraId) { … }
// Trip Service code
@LRA(value = LRA.Type.SUPPORTS, end = false)
@POST @Path("/book")
public Response book(@HeaderParam(LRA_HTTP_CONTEXT_HEADER) String lraId …) { … }
@Compensate
@PUT @Path("/compensate")
public Response compensate(@HeaderParam(LRA_HTTP_CONTEXT_HEADER) String lraId) { … }
@Complete
@PUT @Path("/complete")
public Response complete(@HeaderParam(LRA_HTTP_CONTEXT_HEADER) String lraId) { … }
Un modèle simple mais …
Eventuate démo
Architecture Eventuate
Holiday
Service
Trip
Service
CDC CDC
Change Data Capture
message
table
CDC CDC
received
messages
// Holiday Service code DSL-based SAGA definition
private SagaDefinition<HolidayBookSagaData> sagaDefinition =
step()
.invokeLocal(this::create)
.withCompensation(this::reject)
.step()
.invokeLocal(this::checkCustomer)
.step()
.invokeParticipant(this::bookTrip)
.onReply(TripBooked.class, this::handleTripBooked)
.onReply(BookTripFailed.class, this::handleBookTripFailed)
.withCompensation(this::cancelTrip)
.step()
.invokeLocal(this::checkPricing)
.step()
.invokeParticipant(this::confirmTrip)
.step()
.invokeLocal(this::approve)
.build();
// Trip Service-Command Handlers
@Transactional
public Message bookTrip(CommandMessage<BookTripCommand> cm) {
BookTripCommand cmd = cm.getCommand();
Trip trip = new Trip(cmd);
tripService.book(trip);
if (trip.businessError != null)
return withFailure(new BookTripFailed(trip.id, trip.businessError));
TripBooked tripBooked = trip.toReply();
return withSuccess(tripBooked);
}
@Transactional
public Message confirmTrip(CommandMessage<ConfirmTripCommand> cm) { … }
@Transactional
public Message cancelTrip(CommandMessage<CancelTripCommand> cm) { … }
Base de données Eventuate
Holiday Trip
cdc_monitoring X
entities
events
message X X
offset_store
received_messages X X
Infrastructure
saga_instance
saga_instance_partition
saga_lock_table
snapshots
Conclusion
MicroProfile LRA Eventuate SAGA
Composants clés
SPOF potentiels
Courbe
d’apprentissage **** ***
Simplicité de
configuration ***** **
Couplage
fonctionnel **** ***
Couplage
technique ** ****
Observabilité
Monitoring ** ****
Généricité **** *****
Testabilité *** **
Performance **** ***
Merci
Pour terminer
• Si trop de transaction distribuée : revoir le découpage en service
• Solution minimaliste : tracer les erreurs et compenser en arrière plan
• Des solutions plus avancées existent
• Ne pas négliger les performances et le monitoring
• Actions de compensation simples, rapides et idempotent
Pour aller plus loin
• Mes 2 démos sur GitHub :
• https://github.com/jefrajames/lra-demo
• https://github.com/jefrajames/saga-demo
• Eventuate : le site microservices.io, le site Eventuate et les exemples
• LRA: le blog Narayana, les exemples Quarkus, Open Liberty, Helidon
Pour aller encore plus loin
• Un exemple LRA avec SpringBoot (Jersey) et Axon
• Le module LRA Camel
• Configurer le CDC en transaction log tailing sur PostgreSQL

Weitere ähnliche Inhalte

Ähnlich wie ParisJUG-2022-v0.4.pdf

Mesurer la performance dans le milieu hostile du développement Java
Mesurer la performance dans le milieu hostile du développement JavaMesurer la performance dans le milieu hostile du développement Java
Mesurer la performance dans le milieu hostile du développement JavaAntonio Gomes Rodrigues
 
SSL 2011 : Présentation de 2 bases noSQL
SSL 2011 : Présentation de 2 bases noSQLSSL 2011 : Présentation de 2 bases noSQL
SSL 2011 : Présentation de 2 bases noSQLHervé Leclerc
 
JSS2013 : Haute disponibilité
JSS2013 : Haute disponibilitéJSS2013 : Haute disponibilité
JSS2013 : Haute disponibilitéChristophe Laporte
 
ToulouseJUG - REX Flex, Spring & Agilité
ToulouseJUG - REX Flex, Spring & AgilitéToulouseJUG - REX Flex, Spring & Agilité
ToulouseJUG - REX Flex, Spring & AgilitéNicolas Deverge
 
MariaDB Paris Workshop 2023 - DARVA presentation
MariaDB Paris Workshop 2023 - DARVA presentationMariaDB Paris Workshop 2023 - DARVA presentation
MariaDB Paris Workshop 2023 - DARVA presentationMariaDB plc
 
Bbl microservices avec vert.x cdi elastic search
Bbl microservices avec vert.x cdi elastic searchBbl microservices avec vert.x cdi elastic search
Bbl microservices avec vert.x cdi elastic searchIdriss Neumann
 
Open source et microsoft azure reve ou realite ?
Open source et microsoft azure reve ou realite ?Open source et microsoft azure reve ou realite ?
Open source et microsoft azure reve ou realite ?Christophe Villeneuve
 
Perfug Guide de survie du développeur dans une application Java qui rame
Perfug Guide de survie du développeur dans une application Java qui ramePerfug Guide de survie du développeur dans une application Java qui rame
Perfug Guide de survie du développeur dans une application Java qui ramebleporini
 
Retours Devoxx France 2016
Retours Devoxx France 2016Retours Devoxx France 2016
Retours Devoxx France 2016Antoine Rey
 
Panel de solutions javascript
Panel de solutions javascriptPanel de solutions javascript
Panel de solutions javascriptjp_mouton
 
Volcamp 2023 - Compter les moutons à grande échelle
Volcamp 2023 - Compter les moutons à grande échelleVolcamp 2023 - Compter les moutons à grande échelle
Volcamp 2023 - Compter les moutons à grande échelleKarim Bogtob
 
Ou sont mes beans, contrats et workflows ? WOA et REST: Un changement de ment...
Ou sont mes beans, contrats et workflows ? WOA et REST: Un changement de ment...Ou sont mes beans, contrats et workflows ? WOA et REST: Un changement de ment...
Ou sont mes beans, contrats et workflows ? WOA et REST: Un changement de ment...Jean-Laurent de Morlhon
 
Qualité logicielle
Qualité logicielleQualité logicielle
Qualité logiciellecyrilgandon
 
Cartographie - cas concrets et bonnes pratiques de développement
Cartographie - cas concrets et bonnes pratiques de développementCartographie - cas concrets et bonnes pratiques de développement
Cartographie - cas concrets et bonnes pratiques de développementNicolas Boonaert
 
Migration vers Active Directory 2012 et 2012 R2 : les meilleures pratiques
Migration vers Active Directory 2012 et 2012 R2 : les meilleures pratiques Migration vers Active Directory 2012 et 2012 R2 : les meilleures pratiques
Migration vers Active Directory 2012 et 2012 R2 : les meilleures pratiques Microsoft Technet France
 
JA-SIG CAS - RMLL 2008
JA-SIG CAS - RMLL 2008JA-SIG CAS - RMLL 2008
JA-SIG CAS - RMLL 2008Arnaud Lesueur
 
Quoi de neuf à Devoxx France 2017 ?
Quoi de neuf à Devoxx France 2017 ?Quoi de neuf à Devoxx France 2017 ?
Quoi de neuf à Devoxx France 2017 ?Antoine Rey
 

Ähnlich wie ParisJUG-2022-v0.4.pdf (20)

Mesurer la performance dans le milieu hostile du développement Java
Mesurer la performance dans le milieu hostile du développement JavaMesurer la performance dans le milieu hostile du développement Java
Mesurer la performance dans le milieu hostile du développement Java
 
SSL 2011 : Présentation de 2 bases noSQL
SSL 2011 : Présentation de 2 bases noSQLSSL 2011 : Présentation de 2 bases noSQL
SSL 2011 : Présentation de 2 bases noSQL
 
JSS2013 : Haute disponibilité
JSS2013 : Haute disponibilitéJSS2013 : Haute disponibilité
JSS2013 : Haute disponibilité
 
ToulouseJUG - REX Flex, Spring & Agilité
ToulouseJUG - REX Flex, Spring & AgilitéToulouseJUG - REX Flex, Spring & Agilité
ToulouseJUG - REX Flex, Spring & Agilité
 
Vert.x
Vert.xVert.x
Vert.x
 
MariaDB Paris Workshop 2023 - DARVA presentation
MariaDB Paris Workshop 2023 - DARVA presentationMariaDB Paris Workshop 2023 - DARVA presentation
MariaDB Paris Workshop 2023 - DARVA presentation
 
Bbl microservices avec vert.x cdi elastic search
Bbl microservices avec vert.x cdi elastic searchBbl microservices avec vert.x cdi elastic search
Bbl microservices avec vert.x cdi elastic search
 
Vert.x 3
Vert.x 3Vert.x 3
Vert.x 3
 
Open source et microsoft azure reve ou realite ?
Open source et microsoft azure reve ou realite ?Open source et microsoft azure reve ou realite ?
Open source et microsoft azure reve ou realite ?
 
Perfug Guide de survie du développeur dans une application Java qui rame
Perfug Guide de survie du développeur dans une application Java qui ramePerfug Guide de survie du développeur dans une application Java qui rame
Perfug Guide de survie du développeur dans une application Java qui rame
 
Cassandra Lyon JUG
Cassandra Lyon JUGCassandra Lyon JUG
Cassandra Lyon JUG
 
Retours Devoxx France 2016
Retours Devoxx France 2016Retours Devoxx France 2016
Retours Devoxx France 2016
 
Panel de solutions javascript
Panel de solutions javascriptPanel de solutions javascript
Panel de solutions javascript
 
Volcamp 2023 - Compter les moutons à grande échelle
Volcamp 2023 - Compter les moutons à grande échelleVolcamp 2023 - Compter les moutons à grande échelle
Volcamp 2023 - Compter les moutons à grande échelle
 
Ou sont mes beans, contrats et workflows ? WOA et REST: Un changement de ment...
Ou sont mes beans, contrats et workflows ? WOA et REST: Un changement de ment...Ou sont mes beans, contrats et workflows ? WOA et REST: Un changement de ment...
Ou sont mes beans, contrats et workflows ? WOA et REST: Un changement de ment...
 
Qualité logicielle
Qualité logicielleQualité logicielle
Qualité logicielle
 
Cartographie - cas concrets et bonnes pratiques de développement
Cartographie - cas concrets et bonnes pratiques de développementCartographie - cas concrets et bonnes pratiques de développement
Cartographie - cas concrets et bonnes pratiques de développement
 
Migration vers Active Directory 2012 et 2012 R2 : les meilleures pratiques
Migration vers Active Directory 2012 et 2012 R2 : les meilleures pratiques Migration vers Active Directory 2012 et 2012 R2 : les meilleures pratiques
Migration vers Active Directory 2012 et 2012 R2 : les meilleures pratiques
 
JA-SIG CAS - RMLL 2008
JA-SIG CAS - RMLL 2008JA-SIG CAS - RMLL 2008
JA-SIG CAS - RMLL 2008
 
Quoi de neuf à Devoxx France 2017 ?
Quoi de neuf à Devoxx France 2017 ?Quoi de neuf à Devoxx France 2017 ?
Quoi de neuf à Devoxx France 2017 ?
 

Mehr von Jean-Francois James

Mehr von Jean-Francois James (6)

When GenAI meets with Java with Quarkus and langchain4j
When GenAI meets with Java with Quarkus and langchain4jWhen GenAI meets with Java with Quarkus and langchain4j
When GenAI meets with Java with Quarkus and langchain4j
 
Loom promises: be there!
Loom promises: be there!Loom promises: be there!
Loom promises: be there!
 
Boost your APIs with GraphQL
Boost your APIs with GraphQLBoost your APIs with GraphQL
Boost your APIs with GraphQL
 
Tnt 2020-jf-james
Tnt 2020-jf-jamesTnt 2020-jf-james
Tnt 2020-jf-james
 
Talk Oracle Code One 2019
Talk Oracle Code One 2019Talk Oracle Code One 2019
Talk Oracle Code One 2019
 
Boost your API with GraphQL
Boost your API with GraphQLBoost your API with GraphQL
Boost your API with GraphQL
 

ParisJUG-2022-v0.4.pdf

  • 1. @jefrajames Microservices et cohérence des données … Mais on fait comment pour de vrai ?
  • 2. whoami { "name" : "JF James", "experience_ in_it" : 36, "company" : "Worldline", "domain" : "Payment & secured transactions" , "skills" : [ " Software architecture" , "Java", "DevRel", "Open Source" , "MicroProfile", "Jakarta EE" ] }
  • 3. Une (vieille) histoire de SOA • Refonte d’une plateforme de paiement en SOA • Des services distribuée, chacun sa base de données • 2 grands challenges : 1. Définir et borner les services 2. Garantir la cohérence d’ensemble des données
  • 4. Transaction ACID locale Module 1 BdD Begin Commit Module 2 Module 3 Rollback
  • 6. Transaction ACID locale • Simplicité de développement • Performant & scalable • Eprouvé en production • Historiquement supporté : serveur d’appli, BdD SQL, broker JMS
  • 8. Transaction ACID distribuée • Simplicité de développement mais … • Fort couplage technique • Coût élevé de l’isolation : concurrence et scalabilité réduite • Fragilité liée à la coordination synchrone • Non supporté par NoSQL, Kafka … • Contexte transactionnel non propagé par REST, GraphQL, gRPC …
  • 9. Un point moins ACID SVP Service 1 BdD 1 Start Confirmation Service 2 Service 3 BdD 2 BdD 3 LRA/SAGA ACID locale 1 ACID locale 2 ACID locale 3 Compensation
  • 10. C’est trop compliqué ! Et les erreurs de compensation ?
  • 11. Trop compliqué ? Erreur/Transaction ACID LRA/SAGA Technique Fonctionnelle
  • 12. Et les erreurs de compensation ? • Action de compensation simple et rapide • Différer les opérations trop complexes et risquées
  • 13. Principes de coordination • Des transactions ACID locales (ou pas si NoSQL) • Une coordination globale légère, faiblement couplée • Des opérations de compensation explicites • Perte de l’isolation globale : de ACID à ACD
  • 14. Les solutions Ne rien faire et traiter par exception
  • 15. MicroProfile GraphQL Config Fault Tolerance Fallback Retry Timeout Circuit breaker Bulkhead OpenAPI Rest Client JWT API Jakarta EE Foundation Health Metrics Open Tracing Observability Reactive Messaging Reactive Streams Context Propagation Long Running Action Core JAX-RS CDI JSON Standalone specs
  • 16. Un peu de (bonne) lecture /
  • 17. MicroProfile LRA Eventuate SAGA Origine SAGA: H. Garcia-Molina & K. Salem 1987 Association for Computing Eventuate: 2017 Nature Version En cours Implémentations Modèle de programmation Echange Messaging Asynchrone Infrastructure r
  • 19. Dispo sur GitHub ! https://github.com/jefrajames/lra-demo https://github.com/jefrajames/saga-demo
  • 23. // Holiday Service Code @LRA(value = LRA.Type.REQUIRED, end = true, timeLimit = 2, timeUnit = ChronoUnit.SECONDS, cancelOn = {Response.Status.INTERNAL_SERVER_ERROR}, cancelOnFamily = {Response.Status.Family.CLIENT_ERROR}) @POST @Path("/book") public Response book(@HeaderParam(LRA_HTTP_CONTEXT_HEADER) String lraId …) { … } @Compensate @PUT @Path("/compensate") public Response compensate(@HeaderParam(LRA_HTTP_CONTEXT_HEADER) String lraId) { … } @Complete @PUT @Path("/complete") public Response complete(@HeaderParam(LRA_HTTP_CONTEXT_HEADER) String lraId) { … }
  • 24. // Trip Service code @LRA(value = LRA.Type.SUPPORTS, end = false) @POST @Path("/book") public Response book(@HeaderParam(LRA_HTTP_CONTEXT_HEADER) String lraId …) { … } @Compensate @PUT @Path("/compensate") public Response compensate(@HeaderParam(LRA_HTTP_CONTEXT_HEADER) String lraId) { … } @Complete @PUT @Path("/complete") public Response complete(@HeaderParam(LRA_HTTP_CONTEXT_HEADER) String lraId) { … }
  • 25. Un modèle simple mais …
  • 28. Change Data Capture message table CDC CDC received messages
  • 29. // Holiday Service code DSL-based SAGA definition private SagaDefinition<HolidayBookSagaData> sagaDefinition = step() .invokeLocal(this::create) .withCompensation(this::reject) .step() .invokeLocal(this::checkCustomer) .step() .invokeParticipant(this::bookTrip) .onReply(TripBooked.class, this::handleTripBooked) .onReply(BookTripFailed.class, this::handleBookTripFailed) .withCompensation(this::cancelTrip) .step() .invokeLocal(this::checkPricing) .step() .invokeParticipant(this::confirmTrip) .step() .invokeLocal(this::approve) .build();
  • 30. // Trip Service-Command Handlers @Transactional public Message bookTrip(CommandMessage<BookTripCommand> cm) { BookTripCommand cmd = cm.getCommand(); Trip trip = new Trip(cmd); tripService.book(trip); if (trip.businessError != null) return withFailure(new BookTripFailed(trip.id, trip.businessError)); TripBooked tripBooked = trip.toReply(); return withSuccess(tripBooked); } @Transactional public Message confirmTrip(CommandMessage<ConfirmTripCommand> cm) { … } @Transactional public Message cancelTrip(CommandMessage<CancelTripCommand> cm) { … }
  • 31. Base de données Eventuate Holiday Trip cdc_monitoring X entities events message X X offset_store received_messages X X Infrastructure saga_instance saga_instance_partition saga_lock_table snapshots
  • 33. MicroProfile LRA Eventuate SAGA Composants clés SPOF potentiels Courbe d’apprentissage **** *** Simplicité de configuration ***** ** Couplage fonctionnel **** *** Couplage technique ** **** Observabilité Monitoring ** **** Généricité **** ***** Testabilité *** ** Performance **** ***
  • 34. Merci
  • 35. Pour terminer • Si trop de transaction distribuée : revoir le découpage en service • Solution minimaliste : tracer les erreurs et compenser en arrière plan • Des solutions plus avancées existent • Ne pas négliger les performances et le monitoring • Actions de compensation simples, rapides et idempotent
  • 36. Pour aller plus loin • Mes 2 démos sur GitHub : • https://github.com/jefrajames/lra-demo • https://github.com/jefrajames/saga-demo • Eventuate : le site microservices.io, le site Eventuate et les exemples • LRA: le blog Narayana, les exemples Quarkus, Open Liberty, Helidon
  • 37. Pour aller encore plus loin • Un exemple LRA avec SpringBoot (Jersey) et Axon • Le module LRA Camel • Configurer le CDC en transaction log tailing sur PostgreSQL