SlideShare a Scribd company logo
David Gómez G.
Developer Advocate .
Building monolith applications that can scale to
micro services
(only if they need to)
@AXONIQ @DGOMEZG
@DGOMEZG
https://www.infoworld.com/article/3639050/complexity-is-killing-software-developers.html
Don’t let the microservices hype
ruin your project
@AXONIQ @DGOMEZG
David Gómez G.
Developer Advocate .
An Exciting New Project Starts
@DGOMEZG
Or you may need to add
a new module/feature to
an existing project
@DGOMEZG
But this time,
you are going to get it right!
@DGOMEZG
We need to scale!
We need to go to the cloud(s)!
@DGOMEZG
How others solved
similar problems?
@DGOMEZG
@DGOMEZG
Microservices
architecture
@DGOMEZG
Microservices
architecture
@DGOMEZG
Microservices
architecture
Building Modular monliths that could scale to microservices (only if they need to) - Updated for Chicago JUG
You will probably be missing
all of these
@DGOMEZG
@DGOMEZG
Hype Driven Development
HDD
Problems seem easier to
solve when you have
enough context
@DGOMEZG
we don’t usually know enough
@DGOMEZG
@DGOMEZG
we don’t usually know enough
@DGOMEZG
@DGOMEZG
What you need
(Your steps)
• Separate your different tasks by type
• Focus on understanding the problem(s) you need to solve,
• Model each problem independently
• Be prepared to grow & scale (both in features and in
performance)
• Don’t couple to other components
@DGOMEZG
Our example:
A Conference Management Tool.
@DGOMEZG
Our example:
A Conference Management Tool.
Dates, Sponsors,
Call For Papers, Proposals, Agenda
T
alks, Tickets, Attendees…
Call For Papers,
Agenda, Questions, Forums,
Tickets,
Agenda, speakers, …
@DGOMEZG
Event Storming
@DGOMEZG
Command Query Responsibility Separation
CQRS
@DGOMEZG
COMMANDS QUERIES
CQRS
Separate Queries from Commands
@DGOMEZG
@DGOMEZG
CQRS
Separate Queries from Commands
COMMANDS
What actions do require
changes in the state of the
application?
What other changes will be
necessary to notify/propagate?
@DGOMEZG
@DGOMEZG
CQRS
Separate Queries from Commands
COMMANDS
Define Edition (Dates)
Accept/Reject Talk Proposal
Open Ticket sales
Open Call For Papers
Add/Remove Track
Define Q&A Channel
Submit Proposal
Withdraw Proposal
Confirm Proposal
Join Q&A Channel
Buy Ticket
Add Talk To My Agenda
Ask Questions in Q&A.
Rate Talk
@DGOMEZG
@DGOMEZG
CQRS
Separate Queries from Commands
QUERIES
What information do the users
require?
@DGOMEZG
@DGOMEZG
CQRS
Separate Queries from Commands
QUERIES
List Proposals
Get Talk Popularity
Get Talks Rating
Get Questions
Get Talk Feedback
My Talk Info
Conference Agenda
My Agenda
Q&A Messages
@DGOMEZG
@DGOMEZG
Queries
UI / API
Commands
@DGOMEZG
@DGOMEZG
Model with Boundaries
DDD
https://www.flickr.com/photos/xwl/4936781806/
@DGOMEZG
Which map would you prefer?
It depends!
@DGOMEZG
@DGOMEZG
COMMANDS QUERIES
Focus on modelling within the
boundaries of each element
Command model Projections
Keep only
relevant information
for the action in each model
@DGOMEZG
@DGOMEZG
JoinRoom
Send Message
JoinRoom
Command model
CreateChatRoom
NAME, DESCRIPTION
USER, ROOMID, MSG
USERID, ROOMID
@DGOMEZG
@DGOMEZG
Projections
Projections maintain the structure of information
close to how it is needed by the client/user
ListRooms
ROOM,
DESCRIPTION,
NUM_OF_MEMBERS
GetRoomMessages
DATE, USER, MSG
DATE, USER, MSG
DATE, USER, MSG
@DGOMEZG
@DGOMEZG
Aggregate
A set of objects, relationship and invariants that are
considered as one unit with regard to data changes.
Define the boundaries in which some invariants are kept.
They are a model of part of the domain.
@DGOMEZG
@DGOMEZG
Aggregate
@DGOMEZG
@DGOMEZG
Queries
UI / API
Commands
Command Model Projections
?
@DGOMEZG
@DGOMEZG
Notify that something has happened
Events
Remember our micro services
architecture?
@DGOMEZG
Remember our micro services
architecture?
@DGOMEZG
Remember our micro services
architecture?
Event
@DGOMEZG
@DGOMEZG
Queries
UI / API
Commands
Command Model
Projections
Events
@DGOMEZG
@DGOMEZG
Event Modeling
http://eventmodeling.org
@DGOMEZG
Event-Streaming
vs
Event-Sourcing
Event-Streaming
@DGOMEZG
Event-Sourcing
@DGOMEZG
@DGOMEZG
Why Event-Sourcing?
@DGOMEZG
Why Event-Sourcing?
ProposalUpdated (id: 123, title, Smith)
SpeakerChanged (id:123, jDoe)
ProposalSubmitted
ProposalAccepted
ProposalWithdrawn
ProposalDraftSent (id: 123) id: 123.
Author: John Doe
Title:
What’s new in Java 17
status: Withdrawn
What happened What we store
@DGOMEZG
Why Event-Sourcing?
Business Reasons Technical reasons
• Reliability of decisions
• Auditing / compliance /
transparency
• Data mining, analytics: value for
data
• Historic data useful for new
features
• Guaranteed completeness of event stream
• Single point of truth
• Concurrency / conflict resolution
• Facilitates debugging / forensic analysis
• Replay into new read models (scalability with
CQRS)
@DGOMEZG
Location
Transparency
(Enabled by
Commands, Queries & Events)
Location Transparency
@DGOMEZG
@DGOMEZG
Location Transparency
@DGOMEZG
@DGOMEZG
Location Transparency
A component should neither be aware of nor make any assumptions about
the location of other components
Furthermore, it should not even know which components it interacts with
@DGOMEZG
@DGOMEZG
@DGOMEZG
1. Keep the independent models
@DGOMEZG
1. Keep the independent models
@DGOMEZG
1. Keep the independent models
@DGOMEZG
1. Keep the independent models
CQRS + DDD
@DGOMEZG
Event Sourcing (sync modules)
+ Message
Bus
Event
store
@DGOMEZG
Putting it
together
using
@DGOMEZG
Command Model
data class CreateRoomCommand(

@TargetAggregateIdentifier val roomId: String, 

val name: String)
data class JoinRoomCommand(

@TargetAggregateIdentifier val roomId: String, 

val participant: String)

data class PostMessageCommand(

@TargetAggregateIdentifier val roomId: String, 

val participant: String, 

val message: String)

data class LeaveRoomCommand(

@TargetAggregateIdentifier val roomId: String, 

val participant: String)
@DGOMEZG
Event Model
data class RoomCreatedEvent(

val roomId: String, 

val name: String)
data class ParticipantJoinedRoomEvent(

val roomId: String, 

val participant: String)

data class MessagePostedEvent(

val roomId: String, 

val participant: String, 

val message: String)

data class ParticipantLeftRoomEvent(

val roomId: String, 

val participant: String)
@DGOMEZG
Aggregate
@Aggregate

public class ChatRoom {

@AggregateIdentifier

private String roomId;

private Set<String> participants;



public ChatRoom() {

}

}
@DGOMEZG
Aggregate: Handling a Command
@Aggregate

public class ChatRoom {

@AggregateIdentifier

private String roomId;

private Set<String> participants;



@CommandHandler

public ChatRoom() {



}

}
@DGOMEZG
Aggregate: Handling a Command
@Aggregate

public class ChatRoom {

@AggregateIdentifier

private String roomId;

private Set<String> participants;



@CommandHandler

public ChatRoom(CreateRoomCommand command) {



}

}
@DGOMEZG
Aggregate: Handling a Command
@Aggregate

public class ChatRoom {

@AggregateIdentifier

private String roomId;

private Set<String> participants;



@CommandHandler

public ChatRoom(CreateRoomCommand command) {

apply(new RoomCreatedEvent(command.getRoomId(), command.getName()));

}

}
@DGOMEZG
Aggregate: Handling a Command
@Aggregate

public class ChatRoom {

@AggregateIdentifier

private String roomId;

private Set<String> participants;



@CommandHandler

public ChatRoom(CreateRoomCommand command) {

apply(new RoomCreatedEvent(command.getRoomId(), command.getName()));

}

@CommandHandler

public void handle(JoinRoomCommand command) {

}

}
@DGOMEZG
Aggregate: Handling a Command
@Aggregate

public class ChatRoom {

@AggregateIdentifier

private String roomId;

private Set<String> participants;



@CommandHandler

public ChatRoom(CreateRoomCommand command) {

apply(new RoomCreatedEvent(command.getRoomId(), command.getName()));

}

@CommandHandler

public void handle(JoinRoomCommand command) {

apply(new ParticipantJoinedRoomEvent(command.getRoomId(), command.getParticipant()));

}

}
@DGOMEZG
Aggregate: Handling a Command
@Aggregate

public class ChatRoom {

@AggregateIdentifier

private String roomId;

private Set<String> participants;



@CommandHandler

public void handle(JoinRoomCommand command) {

apply(new ParticipantJoinedRoomEvent(command.getRoomId(), command.getParticipant()));

}

}
@DGOMEZG
Aggregate: Handling a Command
@Aggregate

public class ChatRoom {

@AggregateIdentifier

private String roomId;

private Set<String> participants;



@CommandHandler

public void handle(JoinRoomCommand command) {

apply(new ParticipantJoinedRoomEvent(command.getRoomId(), command.getParticipant()));

}

@EventSourcingHandler

public void on() {



}

}
@DGOMEZG
Aggregate: Handling a Command
@Aggregate

public class ChatRoom {

@AggregateIdentifier

private String roomId;

private Set<String> participants;



@CommandHandler

public void handle(JoinRoomCommand command) {

apply(new ParticipantJoinedRoomEvent(command.getRoomId(), command.getParticipant()));

}

@EventSourcingHandler

public void on(ParticipantJoinedRoomEvent event) {



}

}
@DGOMEZG
Aggregate: Handling a Command
@Aggregate

public class ChatRoom {

@AggregateIdentifier

private String roomId;

private Set<String> participants;



@CommandHandler

public void handle(JoinRoomCommand command) {

apply(new ParticipantJoinedRoomEvent(command.getRoomId(), command.getParticipant()));

}

@EventSourcingHandler

public void on(ParticipantJoinedRoomEvent event) {

this.participants.add(event.getParticipant());

}

}
@DGOMEZG
Aggregate: Command Validation
@Aggregate

public class ChatRoom {

@AggregateIdentifier

private String roomId;

private Set<String> participants;



@CommandHandler

public void handle(JoinRoomCommand command)

if (…) {

pply(new ParticipantJoinedRoomEvent(command.getRoomId(), command.getParticipant()));



}

@EventSourcingHandler

public void on(ParticipantJoinedRoomEvent event) {

this.participants.add(event.getParticipant());

}

}
@DGOMEZG
Location Transparency. Sync other components
@Component

public class RoomSummaryProjection {

private final RoomSummaryRepository roomSummaryRepository;

@EventHandler

public void on(RoomCreatedEvent event) {

roomSummaryRepository.save(new RoomSummary(event.getRoomId(), event.getName()));

}

@EventHandler

public void on(ParticipantJoinedRoomEvent event) {

roomSummaryRepository.findById(event.getRoomId())

.ifPresent(RoomSummary"#addParticipant);

}

}
@DGOMEZG
Handling Queries
@Component

public class RoomSummaryProjection {

private final RoomSummaryRepository roomSummaryRepository;

@QueryHandler

public List<String> handle(RoomParticipantsQuery query) {

return roomSumaryRepository.findRoomParticipants(query.getRoomId())

.stream()

.map(RoomParticipant"#getParticipant).sorted()

.collect(toList())event.getName()));

}

}
@DGOMEZG
In summary
@DGOMEZG
HDD
CQRS
DDD
Event-
Sourcing
@DGOMEZG
https://youtu.be/TnKzCFPtl0E
@DGOMEZG
Useful Resources
https://lp.axoniq.io/chicago-jug
The slides Code-sample &
tutorial repo
Free DDD, CQRS & ES
courses
eventmodeling.org
Domain-Driven
Design
https://lp.axoniq.io/chicago-jug
Ad

More Related Content

Similar to Building Modular monliths that could scale to microservices (only if they need to) - Updated for Chicago JUG (20)

Document Object Model
Document Object ModelDocument Object Model
Document Object Model
chomas kandar
 
Document Object Model
Document Object ModelDocument Object Model
Document Object Model
chomas kandar
 
MobiCloud: Towards Cloud Mobile Hybrid Application Generation using Semantica...
MobiCloud: Towards Cloud Mobile Hybrid Application Generation using Semantica...MobiCloud: Towards Cloud Mobile Hybrid Application Generation using Semantica...
MobiCloud: Towards Cloud Mobile Hybrid Application Generation using Semantica...
Amit Sheth
 
Grails Introduction - IJTC 2007
Grails Introduction - IJTC 2007Grails Introduction - IJTC 2007
Grails Introduction - IJTC 2007
Guillaume Laforge
 
Rob Tweed :: Ajax and the Impact on Caché and Similar Technologies
Rob Tweed :: Ajax and the Impact on Caché and Similar TechnologiesRob Tweed :: Ajax and the Impact on Caché and Similar Technologies
Rob Tweed :: Ajax and the Impact on Caché and Similar Technologies
george.james
 
Consumer driven contract testing
Consumer driven contract testingConsumer driven contract testing
Consumer driven contract testing
Mike van Vendeloo
 
Robotlegs on Top of Gaia
Robotlegs on Top of GaiaRobotlegs on Top of Gaia
Robotlegs on Top of Gaia
Jesse Warden
 
DDD Framework for Java: JdonFramework
DDD Framework for Java: JdonFrameworkDDD Framework for Java: JdonFramework
DDD Framework for Java: JdonFramework
banq jdon
 
DDS Advanced Tutorial - OMG June 2013 Berlin Meeting
DDS Advanced Tutorial - OMG June 2013 Berlin MeetingDDS Advanced Tutorial - OMG June 2013 Berlin Meeting
DDS Advanced Tutorial - OMG June 2013 Berlin Meeting
Jaime Martin Losa
 
DIとトレイとによるAndroid開発の効率化
DIとトレイとによるAndroid開発の効率化DIとトレイとによるAndroid開発の効率化
DIとトレイとによるAndroid開発の効率化
Tomoharu ASAMI
 
React native: building shared components for Android and iOS
React native: building shared components for Android and iOSReact native: building shared components for Android and iOS
React native: building shared components for Android and iOS
Calum Gathergood
 
CiklumJavaSat15112011:Andrew Mormysh-GWT features overview
CiklumJavaSat15112011:Andrew Mormysh-GWT features overviewCiklumJavaSat15112011:Andrew Mormysh-GWT features overview
CiklumJavaSat15112011:Andrew Mormysh-GWT features overview
Ciklum Ukraine
 
Designing DDD Aggregates
Designing DDD AggregatesDesigning DDD Aggregates
Designing DDD Aggregates
Andrew McCaughan
 
What's new with JavaScript in GNOME: The 2020 edition (GUADEC 2020)
What's new with JavaScript in GNOME: The 2020 edition (GUADEC 2020)What's new with JavaScript in GNOME: The 2020 edition (GUADEC 2020)
What's new with JavaScript in GNOME: The 2020 edition (GUADEC 2020)
Igalia
 
Cleaning your architecture with android architecture components
Cleaning your architecture with android architecture componentsCleaning your architecture with android architecture components
Cleaning your architecture with android architecture components
Debora Gomez Bertoli
 
A Brief MongoDB Intro
A Brief MongoDB IntroA Brief MongoDB Intro
A Brief MongoDB Intro
Scott Hernandez
 
Introduction to CQRS
Introduction to CQRSIntroduction to CQRS
Introduction to CQRS
Pieter Joost van de Sande
 
Old code doesn't stink - Detroit
Old code doesn't stink - DetroitOld code doesn't stink - Detroit
Old code doesn't stink - Detroit
Martin Gutenbrunner
 
Xamarin Under The Hood - Dan Ardelean
 Xamarin Under The Hood - Dan Ardelean Xamarin Under The Hood - Dan Ardelean
Xamarin Under The Hood - Dan Ardelean
ITCamp
 
Gab 2018 seguridad y escalado en azure service fabric
Gab 2018   seguridad y escalado en azure service fabricGab 2018   seguridad y escalado en azure service fabric
Gab 2018 seguridad y escalado en azure service fabric
Alberto Diaz Martin
 
Document Object Model
Document Object ModelDocument Object Model
Document Object Model
chomas kandar
 
Document Object Model
Document Object ModelDocument Object Model
Document Object Model
chomas kandar
 
MobiCloud: Towards Cloud Mobile Hybrid Application Generation using Semantica...
MobiCloud: Towards Cloud Mobile Hybrid Application Generation using Semantica...MobiCloud: Towards Cloud Mobile Hybrid Application Generation using Semantica...
MobiCloud: Towards Cloud Mobile Hybrid Application Generation using Semantica...
Amit Sheth
 
Grails Introduction - IJTC 2007
Grails Introduction - IJTC 2007Grails Introduction - IJTC 2007
Grails Introduction - IJTC 2007
Guillaume Laforge
 
Rob Tweed :: Ajax and the Impact on Caché and Similar Technologies
Rob Tweed :: Ajax and the Impact on Caché and Similar TechnologiesRob Tweed :: Ajax and the Impact on Caché and Similar Technologies
Rob Tweed :: Ajax and the Impact on Caché and Similar Technologies
george.james
 
Consumer driven contract testing
Consumer driven contract testingConsumer driven contract testing
Consumer driven contract testing
Mike van Vendeloo
 
Robotlegs on Top of Gaia
Robotlegs on Top of GaiaRobotlegs on Top of Gaia
Robotlegs on Top of Gaia
Jesse Warden
 
DDD Framework for Java: JdonFramework
DDD Framework for Java: JdonFrameworkDDD Framework for Java: JdonFramework
DDD Framework for Java: JdonFramework
banq jdon
 
DDS Advanced Tutorial - OMG June 2013 Berlin Meeting
DDS Advanced Tutorial - OMG June 2013 Berlin MeetingDDS Advanced Tutorial - OMG June 2013 Berlin Meeting
DDS Advanced Tutorial - OMG June 2013 Berlin Meeting
Jaime Martin Losa
 
DIとトレイとによるAndroid開発の効率化
DIとトレイとによるAndroid開発の効率化DIとトレイとによるAndroid開発の効率化
DIとトレイとによるAndroid開発の効率化
Tomoharu ASAMI
 
React native: building shared components for Android and iOS
React native: building shared components for Android and iOSReact native: building shared components for Android and iOS
React native: building shared components for Android and iOS
Calum Gathergood
 
CiklumJavaSat15112011:Andrew Mormysh-GWT features overview
CiklumJavaSat15112011:Andrew Mormysh-GWT features overviewCiklumJavaSat15112011:Andrew Mormysh-GWT features overview
CiklumJavaSat15112011:Andrew Mormysh-GWT features overview
Ciklum Ukraine
 
What's new with JavaScript in GNOME: The 2020 edition (GUADEC 2020)
What's new with JavaScript in GNOME: The 2020 edition (GUADEC 2020)What's new with JavaScript in GNOME: The 2020 edition (GUADEC 2020)
What's new with JavaScript in GNOME: The 2020 edition (GUADEC 2020)
Igalia
 
Cleaning your architecture with android architecture components
Cleaning your architecture with android architecture componentsCleaning your architecture with android architecture components
Cleaning your architecture with android architecture components
Debora Gomez Bertoli
 
Old code doesn't stink - Detroit
Old code doesn't stink - DetroitOld code doesn't stink - Detroit
Old code doesn't stink - Detroit
Martin Gutenbrunner
 
Xamarin Under The Hood - Dan Ardelean
 Xamarin Under The Hood - Dan Ardelean Xamarin Under The Hood - Dan Ardelean
Xamarin Under The Hood - Dan Ardelean
ITCamp
 
Gab 2018 seguridad y escalado en azure service fabric
Gab 2018   seguridad y escalado en azure service fabricGab 2018   seguridad y escalado en azure service fabric
Gab 2018 seguridad y escalado en azure service fabric
Alberto Diaz Martin
 

More from David Gómez García (20)

Leverage CompletableFutures to handle async queries. DevNexus 2022
Leverage CompletableFutures to handle async queries. DevNexus 2022Leverage CompletableFutures to handle async queries. DevNexus 2022
Leverage CompletableFutures to handle async queries. DevNexus 2022
David Gómez García
 
Leveraging Completable Futures to handle your query results Asynchrhonously
Leveraging Completable Futures to handle your query results AsynchrhonouslyLeveraging Completable Futures to handle your query results Asynchrhonously
Leveraging Completable Futures to handle your query results Asynchrhonously
David Gómez García
 
Cdm mil-18 - hypermedia ap is for headless platforms and data integration
Cdm mil-18 - hypermedia ap is for headless platforms and data integrationCdm mil-18 - hypermedia ap is for headless platforms and data integration
Cdm mil-18 - hypermedia ap is for headless platforms and data integration
David Gómez García
 
What's in a community like Liferay's
What's in a community like Liferay'sWhat's in a community like Liferay's
What's in a community like Liferay's
David Gómez García
 
Java9 Beyond Modularity - Java 9 más allá de la modularidad
Java9 Beyond Modularity - Java 9 más allá de la modularidadJava9 Beyond Modularity - Java 9 más allá de la modularidad
Java9 Beyond Modularity - Java 9 más allá de la modularidad
David Gómez García
 
T3chFest2016 - Uso del API JavaScript de Photoshop para obtener fotos HDTR
T3chFest2016 - Uso del API JavaScript de Photoshop para obtener fotos HDTRT3chFest2016 - Uso del API JavaScript de Photoshop para obtener fotos HDTR
T3chFest2016 - Uso del API JavaScript de Photoshop para obtener fotos HDTR
David Gómez García
 
Managing user's data with Spring Session
Managing user's data with Spring SessionManaging user's data with Spring Session
Managing user's data with Spring Session
David Gómez García
 
Parallel streams in java 8
Parallel streams in java 8Parallel streams in java 8
Parallel streams in java 8
David Gómez García
 
Construccion de proyectos con gradle
Construccion de proyectos con gradleConstruccion de proyectos con gradle
Construccion de proyectos con gradle
David Gómez García
 
Java 8 Stream API. A different way to process collections.
Java 8 Stream API. A different way to process collections.Java 8 Stream API. A different way to process collections.
Java 8 Stream API. A different way to process collections.
David Gómez García
 
Midiendo la calidad de código en WTF/Min (Revisado EUI Abril 2014)
Midiendo la calidad de código en WTF/Min (Revisado EUI Abril 2014)Midiendo la calidad de código en WTF/Min (Revisado EUI Abril 2014)
Midiendo la calidad de código en WTF/Min (Revisado EUI Abril 2014)
David Gómez García
 
Measuring Code Quality in WTF/min.
Measuring Code Quality in WTF/min. Measuring Code Quality in WTF/min.
Measuring Code Quality in WTF/min.
David Gómez García
 
Spring4 whats up doc?
Spring4 whats up doc?Spring4 whats up doc?
Spring4 whats up doc?
David Gómez García
 
Gradle como alternativa a maven
Gradle como alternativa a mavenGradle como alternativa a maven
Gradle como alternativa a maven
David Gómez García
 
El poder del creador de Software. Entre la ingeniería y la artesanía
El poder del creador de Software. Entre la ingeniería y la artesaníaEl poder del creador de Software. Entre la ingeniería y la artesanía
El poder del creador de Software. Entre la ingeniería y la artesanía
David Gómez García
 
Geo-SentimentZ
Geo-SentimentZGeo-SentimentZ
Geo-SentimentZ
David Gómez García
 
HDTR images with Photoshop Javascript Scripting
HDTR images with Photoshop Javascript ScriptingHDTR images with Photoshop Javascript Scripting
HDTR images with Photoshop Javascript Scripting
David Gómez García
 
Wtf per lineofcode
Wtf per lineofcodeWtf per lineofcode
Wtf per lineofcode
David Gómez García
 
A real systemwithjms-rest-protobuf-mongodb
A real systemwithjms-rest-protobuf-mongodbA real systemwithjms-rest-protobuf-mongodb
A real systemwithjms-rest-protobuf-mongodb
David Gómez García
 
Spring Data y Mongo DB en un proyecto Real
Spring Data y Mongo DB en un proyecto RealSpring Data y Mongo DB en un proyecto Real
Spring Data y Mongo DB en un proyecto Real
David Gómez García
 
Leverage CompletableFutures to handle async queries. DevNexus 2022
Leverage CompletableFutures to handle async queries. DevNexus 2022Leverage CompletableFutures to handle async queries. DevNexus 2022
Leverage CompletableFutures to handle async queries. DevNexus 2022
David Gómez García
 
Leveraging Completable Futures to handle your query results Asynchrhonously
Leveraging Completable Futures to handle your query results AsynchrhonouslyLeveraging Completable Futures to handle your query results Asynchrhonously
Leveraging Completable Futures to handle your query results Asynchrhonously
David Gómez García
 
Cdm mil-18 - hypermedia ap is for headless platforms and data integration
Cdm mil-18 - hypermedia ap is for headless platforms and data integrationCdm mil-18 - hypermedia ap is for headless platforms and data integration
Cdm mil-18 - hypermedia ap is for headless platforms and data integration
David Gómez García
 
What's in a community like Liferay's
What's in a community like Liferay'sWhat's in a community like Liferay's
What's in a community like Liferay's
David Gómez García
 
Java9 Beyond Modularity - Java 9 más allá de la modularidad
Java9 Beyond Modularity - Java 9 más allá de la modularidadJava9 Beyond Modularity - Java 9 más allá de la modularidad
Java9 Beyond Modularity - Java 9 más allá de la modularidad
David Gómez García
 
T3chFest2016 - Uso del API JavaScript de Photoshop para obtener fotos HDTR
T3chFest2016 - Uso del API JavaScript de Photoshop para obtener fotos HDTRT3chFest2016 - Uso del API JavaScript de Photoshop para obtener fotos HDTR
T3chFest2016 - Uso del API JavaScript de Photoshop para obtener fotos HDTR
David Gómez García
 
Managing user's data with Spring Session
Managing user's data with Spring SessionManaging user's data with Spring Session
Managing user's data with Spring Session
David Gómez García
 
Construccion de proyectos con gradle
Construccion de proyectos con gradleConstruccion de proyectos con gradle
Construccion de proyectos con gradle
David Gómez García
 
Java 8 Stream API. A different way to process collections.
Java 8 Stream API. A different way to process collections.Java 8 Stream API. A different way to process collections.
Java 8 Stream API. A different way to process collections.
David Gómez García
 
Midiendo la calidad de código en WTF/Min (Revisado EUI Abril 2014)
Midiendo la calidad de código en WTF/Min (Revisado EUI Abril 2014)Midiendo la calidad de código en WTF/Min (Revisado EUI Abril 2014)
Midiendo la calidad de código en WTF/Min (Revisado EUI Abril 2014)
David Gómez García
 
Measuring Code Quality in WTF/min.
Measuring Code Quality in WTF/min. Measuring Code Quality in WTF/min.
Measuring Code Quality in WTF/min.
David Gómez García
 
El poder del creador de Software. Entre la ingeniería y la artesanía
El poder del creador de Software. Entre la ingeniería y la artesaníaEl poder del creador de Software. Entre la ingeniería y la artesanía
El poder del creador de Software. Entre la ingeniería y la artesanía
David Gómez García
 
HDTR images with Photoshop Javascript Scripting
HDTR images with Photoshop Javascript ScriptingHDTR images with Photoshop Javascript Scripting
HDTR images with Photoshop Javascript Scripting
David Gómez García
 
A real systemwithjms-rest-protobuf-mongodb
A real systemwithjms-rest-protobuf-mongodbA real systemwithjms-rest-protobuf-mongodb
A real systemwithjms-rest-protobuf-mongodb
David Gómez García
 
Spring Data y Mongo DB en un proyecto Real
Spring Data y Mongo DB en un proyecto RealSpring Data y Mongo DB en un proyecto Real
Spring Data y Mongo DB en un proyecto Real
David Gómez García
 
Ad

Recently uploaded (20)

Enhancing ICU Intelligence: How Our Functional Testing Enabled a Healthcare I...
Enhancing ICU Intelligence: How Our Functional Testing Enabled a Healthcare I...Enhancing ICU Intelligence: How Our Functional Testing Enabled a Healthcare I...
Enhancing ICU Intelligence: How Our Functional Testing Enabled a Healthcare I...
Impelsys Inc.
 
tecnologias de las primeras civilizaciones.pdf
tecnologias de las primeras civilizaciones.pdftecnologias de las primeras civilizaciones.pdf
tecnologias de las primeras civilizaciones.pdf
fjgm517
 
Linux Professional Institute LPIC-1 Exam.pdf
Linux Professional Institute LPIC-1 Exam.pdfLinux Professional Institute LPIC-1 Exam.pdf
Linux Professional Institute LPIC-1 Exam.pdf
RHCSA Guru
 
Cyber Awareness overview for 2025 month of security
Cyber Awareness overview for 2025 month of securityCyber Awareness overview for 2025 month of security
Cyber Awareness overview for 2025 month of security
riccardosl1
 
Linux Support for SMARC: How Toradex Empowers Embedded Developers
Linux Support for SMARC: How Toradex Empowers Embedded DevelopersLinux Support for SMARC: How Toradex Empowers Embedded Developers
Linux Support for SMARC: How Toradex Empowers Embedded Developers
Toradex
 
Greenhouse_Monitoring_Presentation.pptx.
Greenhouse_Monitoring_Presentation.pptx.Greenhouse_Monitoring_Presentation.pptx.
Greenhouse_Monitoring_Presentation.pptx.
hpbmnnxrvb
 
How analogue intelligence complements AI
How analogue intelligence complements AIHow analogue intelligence complements AI
How analogue intelligence complements AI
Paul Rowe
 
Splunk Security Update | Public Sector Summit Germany 2025
Splunk Security Update | Public Sector Summit Germany 2025Splunk Security Update | Public Sector Summit Germany 2025
Splunk Security Update | Public Sector Summit Germany 2025
Splunk
 
Complete Guide to Advanced Logistics Management Software in Riyadh.pdf
Complete Guide to Advanced Logistics Management Software in Riyadh.pdfComplete Guide to Advanced Logistics Management Software in Riyadh.pdf
Complete Guide to Advanced Logistics Management Software in Riyadh.pdf
Software Company
 
SAP Modernization: Maximizing the Value of Your SAP S/4HANA Migration.pdf
SAP Modernization: Maximizing the Value of Your SAP S/4HANA Migration.pdfSAP Modernization: Maximizing the Value of Your SAP S/4HANA Migration.pdf
SAP Modernization: Maximizing the Value of Your SAP S/4HANA Migration.pdf
Precisely
 
AI Changes Everything – Talk at Cardiff Metropolitan University, 29th April 2...
AI Changes Everything – Talk at Cardiff Metropolitan University, 29th April 2...AI Changes Everything – Talk at Cardiff Metropolitan University, 29th April 2...
AI Changes Everything – Talk at Cardiff Metropolitan University, 29th April 2...
Alan Dix
 
Mobile App Development Company in Saudi Arabia
Mobile App Development Company in Saudi ArabiaMobile App Development Company in Saudi Arabia
Mobile App Development Company in Saudi Arabia
Steve Jonas
 
Designing Low-Latency Systems with Rust and ScyllaDB: An Architectural Deep Dive
Designing Low-Latency Systems with Rust and ScyllaDB: An Architectural Deep DiveDesigning Low-Latency Systems with Rust and ScyllaDB: An Architectural Deep Dive
Designing Low-Latency Systems with Rust and ScyllaDB: An Architectural Deep Dive
ScyllaDB
 
Andrew Marnell: Transforming Business Strategy Through Data-Driven Insights
Andrew Marnell: Transforming Business Strategy Through Data-Driven InsightsAndrew Marnell: Transforming Business Strategy Through Data-Driven Insights
Andrew Marnell: Transforming Business Strategy Through Data-Driven Insights
Andrew Marnell
 
Electronic_Mail_Attacks-1-35.pdf by xploit
Electronic_Mail_Attacks-1-35.pdf by xploitElectronic_Mail_Attacks-1-35.pdf by xploit
Electronic_Mail_Attacks-1-35.pdf by xploit
niftliyevhuseyn
 
Noah Loul Shares 5 Steps to Implement AI Agents for Maximum Business Efficien...
Noah Loul Shares 5 Steps to Implement AI Agents for Maximum Business Efficien...Noah Loul Shares 5 Steps to Implement AI Agents for Maximum Business Efficien...
Noah Loul Shares 5 Steps to Implement AI Agents for Maximum Business Efficien...
Noah Loul
 
TrsLabs - Fintech Product & Business Consulting
TrsLabs - Fintech Product & Business ConsultingTrsLabs - Fintech Product & Business Consulting
TrsLabs - Fintech Product & Business Consulting
Trs Labs
 
Transcript: #StandardsGoals for 2025: Standards & certification roundup - Tec...
Transcript: #StandardsGoals for 2025: Standards & certification roundup - Tec...Transcript: #StandardsGoals for 2025: Standards & certification roundup - Tec...
Transcript: #StandardsGoals for 2025: Standards & certification roundup - Tec...
BookNet Canada
 
HCL Nomad Web – Best Practices and Managing Multiuser Environments
HCL Nomad Web – Best Practices and Managing Multiuser EnvironmentsHCL Nomad Web – Best Practices and Managing Multiuser Environments
HCL Nomad Web – Best Practices and Managing Multiuser Environments
panagenda
 
How Can I use the AI Hype in my Business Context?
How Can I use the AI Hype in my Business Context?How Can I use the AI Hype in my Business Context?
How Can I use the AI Hype in my Business Context?
Daniel Lehner
 
Enhancing ICU Intelligence: How Our Functional Testing Enabled a Healthcare I...
Enhancing ICU Intelligence: How Our Functional Testing Enabled a Healthcare I...Enhancing ICU Intelligence: How Our Functional Testing Enabled a Healthcare I...
Enhancing ICU Intelligence: How Our Functional Testing Enabled a Healthcare I...
Impelsys Inc.
 
tecnologias de las primeras civilizaciones.pdf
tecnologias de las primeras civilizaciones.pdftecnologias de las primeras civilizaciones.pdf
tecnologias de las primeras civilizaciones.pdf
fjgm517
 
Linux Professional Institute LPIC-1 Exam.pdf
Linux Professional Institute LPIC-1 Exam.pdfLinux Professional Institute LPIC-1 Exam.pdf
Linux Professional Institute LPIC-1 Exam.pdf
RHCSA Guru
 
Cyber Awareness overview for 2025 month of security
Cyber Awareness overview for 2025 month of securityCyber Awareness overview for 2025 month of security
Cyber Awareness overview for 2025 month of security
riccardosl1
 
Linux Support for SMARC: How Toradex Empowers Embedded Developers
Linux Support for SMARC: How Toradex Empowers Embedded DevelopersLinux Support for SMARC: How Toradex Empowers Embedded Developers
Linux Support for SMARC: How Toradex Empowers Embedded Developers
Toradex
 
Greenhouse_Monitoring_Presentation.pptx.
Greenhouse_Monitoring_Presentation.pptx.Greenhouse_Monitoring_Presentation.pptx.
Greenhouse_Monitoring_Presentation.pptx.
hpbmnnxrvb
 
How analogue intelligence complements AI
How analogue intelligence complements AIHow analogue intelligence complements AI
How analogue intelligence complements AI
Paul Rowe
 
Splunk Security Update | Public Sector Summit Germany 2025
Splunk Security Update | Public Sector Summit Germany 2025Splunk Security Update | Public Sector Summit Germany 2025
Splunk Security Update | Public Sector Summit Germany 2025
Splunk
 
Complete Guide to Advanced Logistics Management Software in Riyadh.pdf
Complete Guide to Advanced Logistics Management Software in Riyadh.pdfComplete Guide to Advanced Logistics Management Software in Riyadh.pdf
Complete Guide to Advanced Logistics Management Software in Riyadh.pdf
Software Company
 
SAP Modernization: Maximizing the Value of Your SAP S/4HANA Migration.pdf
SAP Modernization: Maximizing the Value of Your SAP S/4HANA Migration.pdfSAP Modernization: Maximizing the Value of Your SAP S/4HANA Migration.pdf
SAP Modernization: Maximizing the Value of Your SAP S/4HANA Migration.pdf
Precisely
 
AI Changes Everything – Talk at Cardiff Metropolitan University, 29th April 2...
AI Changes Everything – Talk at Cardiff Metropolitan University, 29th April 2...AI Changes Everything – Talk at Cardiff Metropolitan University, 29th April 2...
AI Changes Everything – Talk at Cardiff Metropolitan University, 29th April 2...
Alan Dix
 
Mobile App Development Company in Saudi Arabia
Mobile App Development Company in Saudi ArabiaMobile App Development Company in Saudi Arabia
Mobile App Development Company in Saudi Arabia
Steve Jonas
 
Designing Low-Latency Systems with Rust and ScyllaDB: An Architectural Deep Dive
Designing Low-Latency Systems with Rust and ScyllaDB: An Architectural Deep DiveDesigning Low-Latency Systems with Rust and ScyllaDB: An Architectural Deep Dive
Designing Low-Latency Systems with Rust and ScyllaDB: An Architectural Deep Dive
ScyllaDB
 
Andrew Marnell: Transforming Business Strategy Through Data-Driven Insights
Andrew Marnell: Transforming Business Strategy Through Data-Driven InsightsAndrew Marnell: Transforming Business Strategy Through Data-Driven Insights
Andrew Marnell: Transforming Business Strategy Through Data-Driven Insights
Andrew Marnell
 
Electronic_Mail_Attacks-1-35.pdf by xploit
Electronic_Mail_Attacks-1-35.pdf by xploitElectronic_Mail_Attacks-1-35.pdf by xploit
Electronic_Mail_Attacks-1-35.pdf by xploit
niftliyevhuseyn
 
Noah Loul Shares 5 Steps to Implement AI Agents for Maximum Business Efficien...
Noah Loul Shares 5 Steps to Implement AI Agents for Maximum Business Efficien...Noah Loul Shares 5 Steps to Implement AI Agents for Maximum Business Efficien...
Noah Loul Shares 5 Steps to Implement AI Agents for Maximum Business Efficien...
Noah Loul
 
TrsLabs - Fintech Product & Business Consulting
TrsLabs - Fintech Product & Business ConsultingTrsLabs - Fintech Product & Business Consulting
TrsLabs - Fintech Product & Business Consulting
Trs Labs
 
Transcript: #StandardsGoals for 2025: Standards & certification roundup - Tec...
Transcript: #StandardsGoals for 2025: Standards & certification roundup - Tec...Transcript: #StandardsGoals for 2025: Standards & certification roundup - Tec...
Transcript: #StandardsGoals for 2025: Standards & certification roundup - Tec...
BookNet Canada
 
HCL Nomad Web – Best Practices and Managing Multiuser Environments
HCL Nomad Web – Best Practices and Managing Multiuser EnvironmentsHCL Nomad Web – Best Practices and Managing Multiuser Environments
HCL Nomad Web – Best Practices and Managing Multiuser Environments
panagenda
 
How Can I use the AI Hype in my Business Context?
How Can I use the AI Hype in my Business Context?How Can I use the AI Hype in my Business Context?
How Can I use the AI Hype in my Business Context?
Daniel Lehner
 
Ad

Building Modular monliths that could scale to microservices (only if they need to) - Updated for Chicago JUG