SlideShare uma empresa Scribd logo
1 de 53
Baixar para ler offline
Designing a Serverless Application
with Domain Driven Design
Susanne Kaiser
Independent Tech Consultant
@suksr
$2,840,000,000,000
TWOTRILLIONEIGHTHUNDREDFOURTYBILLION USD
Costs of Poor Software Quality in the US in 2018 (by CISQ report )
Source: https://www.it-cisq.org/the-cost-of-poor-quality-software-in-the-us-a-2018-report @suksr
Areas of Cost Relating To Poor Software Quality
Source: https://www.it-cisq.org/the-cost-of-poor-quality-software-in-the-us-a-2018-report @suksr
Some Indicators for Poor Software Quality (extracted from CISQ report )
t
Defects
0%
Increasing defect trend
Low test coverage
Cyclomatic complexity
Large inheritance depth
High amount of effort to
understand piece of code
Badly engineered
software
Lack of domain
knowledge
Based on: https://www.it-cisq.org/the-cost-of-poor-quality-software-in-the-us-a-2018-report
Communication and
coordination breakdowns
in (large) teams
High degree of class
coupling
@suksr
Domain Driven Design (DDD)
Business Domain Needs Strategy
Software Design
@suksr
Domain Driven Design (DDD) – Terminology
Strategic Design
Tactical Design
Bounded Context
Ubiquitous Language
Core Subdomain
Supporting Subdomain
Generic Subdomain
Problem Space
Solution Space
Context Maps
Anti-Corruption Layer
Shared Kernel
Open Host Service
Separate Ways
Partnership
Customer-Supplier
Conformist
Domain Model
Entity
Value Object
Aggregate
Repository
Factory
Application Service
Domain Service
Domain Event
@suksr
DDD & Wardley Maps
ValueChainInvisibleVisible
Evolution
Genesis Custom-Built Product (+rental) Commodity
(+utility)
Position
Movement
Uncharted Industrialised
@suksr
ValueChain
InvisibleVisible
Evolution
Visualisation of a
value chain’s
evolution
Genesis Custom-Built Product (+rental) Commodity (+utility)
Position
Movement
Wardley Maps BY SIMON WARDLEY
Uncharted Industrialised
@suksr
Wardley Maps – VALUE CHAIN
Who are your users?
ValueChain
InvisibleVisible
@suksr
Wardley Maps – VALUE CHAIN
Who are your users?
What are your users’ needs?
ValueChain
InvisibleVisible
@suksr
Wardley Maps – VALUE CHAIN
Who are your users?
What are your users’ needs?
What are the components/activities to fulfill
your users’ needs incl. dependencies?
ValueChain
InvisibleVisible
Position
@suksr
Wardley Maps – LANDSCAPE
ValueChain
InvisibleVisible
Evolution
Components along
evolution axes
Genesis Custom-Built Product (+rental) Commodity (+utility)
Position
Movement
@suksr
ValueChain
InvisibleVisible
Genesis Custom-Built Product (+rental) Commodity (+utility)
Evolution
Everything evolves
Past Current Future
Supply CompetitionDemand Competition
Uncharted Industrialised
Wardley Maps – PATTERNS
Movement
@suksr
ValueChain
InvisibleVisible
Genesis Custom-Built Product (+rental) Commodity (+utility)
Evolution
Past Current Future
Characteristics changeUncharted
Undefined market
Uncertain
Unpredictable
Rare
Poorly understood
Forming market
Learning on use
Increasing understanding
Slowly increasing
consumption
Rapid increases in
learning
Growing market
Learning on operation
Increasing education
Rapidly increasing
consumption
Rapid increase in use
Mature market
Known / accepted
Stable
Widespread and stabilising
Commonly understood
(in term of use)
Industrialised
Wardley Maps – PATTERNS
Movement
@suksr
ValueChain
InvisibleVisible
Genesis Custom-Built Product (+rental) Commodity (+utility)
Evolution
Wardley Maps – PRINCIPLES
Use appropriate methods
per evolution stage
Build in-house
Use/buy off-the-shelf product
Outsource to utility suppliers
@suksr
ValueChain
InvisibleVisible
Genesis Custom-Built Product (+rental) Commodity (+utility)
Evolution
Use appropriate methods
per evolution stage
Wardley Maps – PRINCIPLES
Build in-house
Use/buy off-the-shelf product
Outsource to utility suppliers
@suksr
ValueChain
InvisibleVisible
Genesis Custom-Built Product (+rental) Commodity (+utility)
Evolution
Use appropriate methods
per evolution stage
Wardley Maps – PRINCIPLES
Build in-house
Use/buy off-the-shelf product
Outsource to utility suppliers
@suksr
ValueChain
InvisibleVisible
Genesis Custom-Built Product (+rental) Commodity (+utility)
Evolution
Know your users &
focus on user needs
Wardley Maps – PRINCIPLES
Build in-house / Agile
Use/buy off-the-shelf product / Lean
Outsource to utility suppliers / Six Sigma
@suksr
ValueChain
InvisibleVisible
Genesis Custom-Built Product (+rental) Commodity (+utility)
Evolution
DDD & Wardley Maps
Ubiquitous Language
Domain Knowledge
Understanding the problem domain first
Problem Domain
Domain
Experts
Development
Teams
Collaboration
@suksr
ValueChain
InvisibleVisible
Genesis Custom-Built Product (+rental) Commodity (+utility)
Evolution
DDD & Wardley Maps Problem Domain
Strategic Design
DDD Patterns &
Practices
Tactical Design
@suksr
ValueChain
InvisibleVisible
Genesis Custom-Built Product (+rental) Commodity (+utility)
Evolution
DDD & Wardley Maps Problem Domain
Strategic Design
DDD Patterns &
Practices
Tactical Design
Analysing the
business
domain
Discovering
Subdomains
Problem Space
Decomposing
into modular
components
(Bounded
Contexts)
Mapping
interaction
patterns
between BC
(Context Maps)
Solution Space
@suksr
ValueChain
InvisibleVisible
Genesis Custom-Built Product (+rental) Commodity (+utility)
Evolution
DDD & Wardley Maps Problem Domain
Strategic Design
DDD Patterns &
Practices
Tactical Design
Architecting a solution
fitting the problem
domain as closely as
possible
Provides
building blocks
to implement
domain model
Analysing the
business
domain
Discovering
Subdomains
Problem Space
Decomposing
into modular
components
(Bounded
Contexts (BC)
Mapping
interaction
patterns
between BC
(Context Maps)
Solution Space
@suksr
Solution Space
ValueChain
InvisibleVisible
Genesis Custom-Built Product (+rental) Commodity (+utility)
Evolution
Distilling the problem
domain & discovering the
core subdomain
DDD & Wardley Maps
Core
Subdomain
Problem Domain
STRATEGIC DESIGN (PROBLEM SPACE)
Supporting
Subdomain
Generic
Subdomain
ProblemSpace
@suksr
ValueChain
InvisibleVisible
Genesis Custom-Built Product (+rental) Commodity (+utility)
Evolution
Distilling the problem
domain & discovering the
core subdomain
DDD & Wardley Maps
Core
Subdomain
Problem Domain
Competitive advantage
Complex
Changes often
Build in-house
STRATEGIC DESIGN (PROBLEM SPACE)
Supporting
Subdomain
Generic
Subdomain
ProblemSpace
@suksr
ValueChain
InvisibleVisible
Genesis Custom-Built Product (+rental) Commodity (+utility)
Evolution
Distilling the problem
domain & discovering the
core subdomain
DDD & Wardley Maps
Core
Subdomain
Problem Domain
Competitive advantage
Complex
Changes often
Build in-house
No competitive advantage
Quite simple
Does not change often
Prefer to buy/use off-the-shelf
STRATEGIC DESIGN (PROBLEM SPACE)
Supporting
Subdomain
Generic
Subdomain
ProblemSpace
@suksr
ValueChain
InvisibleVisible
Genesis Custom-Built Product (+rental) Commodity (+utility)
Evolution
Distilling the problem
domain & discovering the
core subdomain
DDD & Wardley Maps
Core
Subdomain
Problem Domain
Competitive advantage
Complex
Changes often
Build in-house
No competitive advantage
Quite simple
Does not change often
Prefer to buy/use off-the-shelf
No competitive advantage
Generally complex
Does not change often
Buy/use off-the-shelf / outsource
STRATEGIC DESIGN (PROBLEM SPACE)
Supporting
Subdomain
Generic
Subdomain
ProblemSpace
@suksr
ValueChain
InvisibleVisible
Genesis Custom-Built Product (+rental) Commodity (+utility)
Evolution
Model Driven Design
DDD & Wardley Maps
STRATEGIC DESIGN (SOLUTION SPACE)
Development
Teams
Domain
Experts
Ubiquitous
Language
Analysis
Model
Code
Model
Domain Model
Core
Subdomain
Supporting
Subdomain
Generic
Subdomain
Problem Domain
ProblemSpaceSolutionSpace
abstracted by
@suksr
ValueChain
InvisibleVisible
Genesis Custom-Built Product (+rental) Commodity (+utility)
Evolution
Bounded Contexts
DDD & Wardley Maps
STRATEGIC DESIGN (SOLUTION SPACE)
Core
Subdomain
Supporting
Subdomain
Generic
Subdomain
Problem Domain
ProblemSpaceSolutionSpace
Linguistic/semantic
boundary
Ownership boundary
Model boundary
Physical boundary
Different architectural
patterns per context
possible
@suksr
ValueChain
InvisibleVisible
Genesis Custom-Built Product (+rental) Commodity (+utility)
Evolution
ProblemSpace
Evaluate
Submissions
Manage
Event
Organiser
Build & Publish
Schedule
Communicate
w/ Speakers
Signup/Signin
Know your users &
focus on user needs
Submit
Session
DDD & Wardley Maps
STRATEGIC DESIGN (PROBLEM SPACE)
Speaker
@suksr
ValueChain
InvisibleVisible
Genesis Custom-Built Product (+rental) Commodity (+utility)
Evolution
ProblemSpace
Evaluate
Submissions
Manage
Event
Organiser
Build & Publish
Schedule
Communicate
w/ Speakers
Signup/Signin
Speaker
Submit
Session
DDD & Wardley Maps
STRATEGIC DESIGN (PROBLEM SPACE) Discovering
subdomains
Supporting GenericCore
@suksr
ValueChain
InvisibleVisible
Genesis Custom-Built Product (+rental) Commodity (+utility)
Evolution
ProblemSpace
Evaluate
Submissions
Manage
Event
Organiser
Build & Publish
Schedule
Communicate
w/ Speakers
Signup/Signin
Speaker
Submit
Session
DDD & Wardley Maps
STRATEGIC DESIGN (SOLUTION SPACE)
Supporting GenericCore
Event Evaluation AccountSchedule MessageSession
Domain Models
SolutionSpace
@suksr
ValueChain
InvisibleVisible
Genesis Custom-Built Product (+rental) Commodity (+utility)
Evolution
ProblemSpace
Evaluate
Submissions
Manage
Event
Organiser
Build & Publish
Schedule
Communicate
w/ Speakers
Signup/Signin
Speaker
Submit
Session
DDD & Wardley Maps
Supporting GenericCore
Event Evaluation AccountSchedule Message
Speaker
Session
CfP
SolutionSpace
STRATEGIC DESIGN (SOLUTION SPACE)
Domain Models
@suksr
ValueChain
InvisibleVisible
Genesis Custom-Built Product (+rental) Commodity (+utility)
Evolution
ProblemSpace
Evaluate
Submissions
Manage
Event
Organiser
Build & Publish
Schedule
Communicate
w/ Speakers
Signup/Signin
Speaker
Submit
Session
DDD & Wardley Maps
Supporting GenericCore
Event Evaluation AccountSchedule Message
Speaker Profile
Submitted
Session
CfP
Settings
Recipient
Open CfP Evaluated
Session
Scheduled
Session
SolutionSpace
STRATEGIC DESIGN (SOLUTION SPACE)
Domain Models
@suksr
ValueChain
InvisibleVisible
Genesis Custom-Built Product (+rental) Commodity (+utility)
Evolution
ProblemSpace
Evaluate
Submissions
Manage
Event
Organiser
Build & Publish
Schedule
Communicate
w/ Speakers
Signup/Signin
Speaker
Submit
Session
DDD & Wardley Maps
Supporting GenericCore
SolutionSpace
STRATEGIC DESIGN (SOLUTION SPACE)
Bounded Contexts
Linguistic/semantic
boundary
Model integrity boundary
Event Evaluation AccountSchedule MessageSubmitted
Session
CfP
Settings
Recipient
Open CfP Evaluated
Session
Scheduled
Session
Speaker Profile Session
Evaluation
Submission
Handling
Event
Mngmnt.
Schedule
Mngmnt.
Messaging
Account
Handling
@suksr
ValueChain
InvisibleVisible
Genesis Custom-Built Product (+rental) Commodity (+utility)
Evolution
ProblemSpace
Evaluate
Submissions
Manage
Event
Organiser
Build & Publish
Schedule
Communicate
w/ Speakers
Signup/Signin
Speaker
Submit
Session
DDD & Wardley Maps
Supporting GenericCore
SolutionSpace
STRATEGIC DESIGN (SOLUTION SPACE)
Submission
Handling
Event
Mngmnt.
Session
Evaluation
Messaging Account
Handling
Schedule
Mngmnt.
Bounded Contexts
Ownership boundary
Linguistic/semantic
boundary
Model integrity boundary
@suksr
ValueChain
InvisibleVisible
Genesis Custom-Built Product (+rental) Commodity (+utility)
Evolution
ProblemSpace
Evaluate
Submissions
Manage
Event
Organiser
Build & Publish
Schedule
Communicate
w/ Speakers
Signup/Signin
Speaker
Submit
Session
DDD & Wardley Maps
Supporting GenericCore
SolutionSpace
STRATEGIC DESIGN (SOLUTION SPACE)
Submission
Handling
Event
Mngmnt.
Session
Evaluation
Messaging Account
Handling
Schedule
Mngmnt.
Bounded Contexts
Ownership boundary
Linguistic/semantic
boundary
Model integrity boundary
Physical boundary
SCM
Data store
CI/CD
Artefact
@suksr
ValueChain
InvisibleVisible
Genesis Custom-Built Product (+rental) Commodity (+utility)
Evolution
ProblemSpace Evaluate
Submissions
Manage
Event
Organiser
Build & Publish
Schedule
Communicate
w/ Speakers
Signup/Signin
Speaker
Submit
Session
DDD & Wardley Maps
Supporting GenericCore
SolutionSpace
TACTICAL DESIGN
Submission
Handling
Event
Mngmnt.
Session
Evaluation
Messaging Account
Handling
Schedule
Mngmnt.
Architectural
Patterns
Architectural patterns can
differ per Bounded Context,
e.g.
StrategicDesignTacticalDesign
Layered
Architecture
Hexagonal
Architecture
CQRS
@suksr
Hexagonal Architecture
Business
Logic
Application
REST-API
Port
Port
Message Broker
Adapter
Adapter
Adapter
Port
Inner
Outer
Outside
@suksr
Hexagonal Architecture
Business
Logic
Application
Port
Adapter
BOUNDED CONTEXT: EVENT MANAGEMENT
EventController
AWS API Gateway
Port
REST-API with
AWS API-Gateway and
AWS Lambda
EventController
AWS API Gateway
newEvent deleteEvent activateEvent
POST
/events
DELETE
/events/{id}
POST
/events/{id}/activate
Inner
Outer
Outside
@suksr
export class EventsController {
private readonly eventsService: EventApplicationService;
public constructor(eventsService: EventApplicationService) {
this.eventsService = eventsService;
}
public activateEvent: Handler = async (event: APIGatewayEvent, context: Context, callback: Callback) => {
if (!event.pathParameters) {
return callback(undefined, failure({ status: "error", error: "no event id specified" }));
}
if (!event.requestContext.authorizer) {
return callback(undefined, failure({ status: "error", error: "no authorized user specified" }));
}
try {
const eventId = new EventId(event.pathParameters.id);
const userId = new UserId(event.requestContext.authorizer.claims['cognito:username']);
await this.eventsService.activateEvent(eventId, userId);
callback(undefined, success({status: "ok"}));
} catch(e) {
return callback(undefined, failure({ status: "error", error: e }));
}
};
public newEvent: Handler = async (event: APIGatewayEvent, context: Context, callback: Callback) => {
// ... //
}
REST-API
AdapterPort
Lambda
Function
Lambda
Function
Hexagonal Architecture
BOUNDED CONTEXT: EVENT MANAGEMENT
@suksr
Hexagonal Architecture
Business
Logic
Application
Port
BOUNDED CONTEXT: EVENT MANAGEMENT
EventController
AWS API Gateway
Port
Data Storage with
AWS DynamoDB
DynamoDBEventRepository
Inner
Outer
Outside
@suksr
export default class DynamoDBEventRepository implements EventRepository {
private static TABLE_NAME: string = "events";
private readonly dynamoDbClient: AWS.DynamoDB.DocumentClient;
constructor() {
this.dynamoDbClient = new AWS.DynamoDB.DocumentClient();
}
public async eventOfId(id: EventId): Promise<Event|null> {
const params : DocumentClient.GetItemInput = {
TableName: DynamoDBEventRepository.TABLE_NAME,
Key: {
eventId: id
}
};
const result: DocumentClient.GetItemOutput = await this.dynamoDbClient.get(params).promise();
const item: AttributeMap|undefined = result.Item;
if (item) {
const id = new EventId(item.eventId);
const name = Name.create(item.name);
const description = Description.create(item.description);
const period = Period.create(item.period.startDate, item.period.endDate);
return Event.create(id, name, item.eventStatus, period, description);
}
return null;
}
public saveEvent(event: Event) {
const params : DocumentClient.PutItemInput = {
// ... //
};
return this.dynamoDbClient.put(params).promise();
}
}
Hexagonal Architecture
Database
AdapterPort
DynamoDB
Client
BOUNDED CONTEXT: EVENT MANAGEMENT
@suksr
Hexagonal Architecture
Business
Logic
Application
Port
BOUNDED CONTEXT: EVENT MANAGEMENT
EventController
AWS API Gateway
Port
DynamoDBEventRepository
Business Logic
Implementation
Inner
Outer
Outside
@suksr
ValueChain
InvisibleVisible
Genesis Custom-Built Product (+rental) Commodity (+utility)
Evolution
Evaluate
Submissions
Manage
Event
Organiser
Build & Publish
Schedule
Communicate
w/ Speakers
Signup/Signin
Speaker
Submit
Session
DDD & Wardley Maps
Supporting GenericCore
TACTICAL DESIGN
Submission
Handling
Event
Mngmnt.
Session
Evaluation
Messaging Account
Handling
Schedule
Mngmnt.
Business Logic
Implementation Patterns
Business logic implementation
patterns can differ per
Bounded Context, e.g.
Domain
Model
Active
Record
Transaction
Script
@suksr
ProblemSpaceSolutionSpace
StrategicDesignTacticalDesign
ValueChain
InvisibleVisible
Genesis Custom-Built Product (+rental) Commodity (+utility)
Evolution
Evaluate
Submissions
Manage
Event
Organiser
Build & Publish
Schedule
Communicate
w/ Speakers
Signup/Signin
Speaker
Submit
Session
DDD & Wardley Maps
Supporting GenericCore
TACTICAL DESIGN
Submission
Handling
Event
Mngmnt.
Session
Evaluation
Messaging Account
Handling
Schedule
Mngmnt.
Building Blocks of
Domain Models
● Value Object
● Entity
● Aggregate
● Repository
● ApplicationService
● Domain Event
● ...
@suksr
ProblemSpaceSolutionSpace
StrategicDesignTacticalDesign
Domain Model
BC: EVENT MANAGEMENT
Event
create: Event
activate
reschedule
rename
EventId
id: string
Name
create: Name
name: string
EventStatus
CREATED
ACTIVATED
DEACTIVATED
deactivate
Description
create:
Description
desc: string
Period
create: Period
start: Date
end: Date
Value
Object
Entity
Aggregate
Root
Aggregate
Application
Port
EventController
AWS API Gateway
Port
DynamoDBEventRepository
Event
@suksr
export default class Event {
readonly id: EventId;
name: Name;
description?: Description;
status: EventStatus;
period: Period;
private constructor(id: EventId, name: Name, status: EventStatus, period: Period, description?: Description) {
this.id = id;
this.name = name;
this.description = description;
this.status = status;
this.period = period;
}
public activate() {
if (this.status === EventStatus.CLOSED) {
throw new Error("You cannot activate a closed event");
}
if (this.status === EventStatus.ACTIVATED) {
throw new Error("This event has already been activated");
}
this.status = EventStatus.ACTIVATED;
}
public rename(name: Name) {
if (!name) {
throw new Error("You cannot rename the event to an empty name");
}
this.name = name;
}
// ... //
}
Aggregate
@suksr
Domain Model
BC: EVENT MANAGEMENT
Application
EventController
AWS API Gateway
DynamoDBEventRepository
Event
EventApplicationService
EventRepository
@suksr
export default class EventApplicationService {
private readonly eventRepository: EventRepository;
constructor(eventRepository: EventRepository) {
this.eventRepository = eventRepository;
}
public async activateEvent(id: EventId) {
const event = await this.eventRepository.eventOfId(id);
if (!event) {
throw new Error("Could not deactivate event with id " + id + ", since event does not exist.");
}
event.activate();
await this.eventRepository.saveEvent(event);
}
// ... //
}
ApplicationService
Domain Model
EVENT MANAGEMENT
@suksr
Domain Model
EVENT MANAGEMENT
Application
EventController
AWS API Gateway
DynamoDBEventRepository
Event
EventApplicationService
EventRepository
export default interface EventRepository {
saveEvent(event: Event): void;
eventOfId(id: EventId): Promise<Event|null>;
// ... //
}
@suksr
ValueChain
InvisibleVisible
Genesis Custom-Built Product (+rental) Commodity (+utility)
Evolution
Evaluate
Submissions
Manage
Event
Organiser
Build & Publish
Schedule
Communicate
w/ Speakers
Signup/Signin
Speaker
Submit
Session
DDD & Wardley Maps
Supporting GenericCore
TACTICAL DESIGN
Submission
Handling
Event
Mngmnt.
Session
Evaluation
Messaging Account
Handling
Schedule
Mngmnt.
DDD suits best for the
core subdomain
Movement
Build in-house
Use/buy off-the-shelf product
Outsource to utility suppliers
- or -
- or -
@suksr
ProblemSpaceSolutionSpace
StrategicDesignTacticalDesign
Business
Domain
Needs Strategy
Better Software Design
Ubiquitous Language
Domain Knowledge
Domain
Experts
Development
Teams
Collaboration
Gaining Domain Knowledge
Aligning Software Design
to Business Domain
Core
Subdomain
Discovering the
Core Subdomain
Do not apply DDD
everywhere!
Focus on your core!
Core
Subdomain
DDD helps with ...
@suksr
But ...
Some References
https://learnwardleymapping.com/
https://medium.com/wardleymaps
https://miro.com/blog/wardley-maps-whiteboard-canvas/
https://community.wardleymaps.com/

Mais conteúdo relacionado

Mais procurados

The Migration to Event-Driven Microservices (Adam Bellemare, Flipp) Kafka Sum...
The Migration to Event-Driven Microservices (Adam Bellemare, Flipp) Kafka Sum...The Migration to Event-Driven Microservices (Adam Bellemare, Flipp) Kafka Sum...
The Migration to Event-Driven Microservices (Adam Bellemare, Flipp) Kafka Sum...
confluent
 
Common MongoDB Use Cases
Common MongoDB Use Cases Common MongoDB Use Cases
Common MongoDB Use Cases
MongoDB
 

Mais procurados (20)

Big Data Fabric 2.0 Drives Data Democratization
Big Data Fabric 2.0 Drives Data DemocratizationBig Data Fabric 2.0 Drives Data Democratization
Big Data Fabric 2.0 Drives Data Democratization
 
Introduction to Cassandra
Introduction to CassandraIntroduction to Cassandra
Introduction to Cassandra
 
WhereScape, the pioneer in data warehouse automation software
WhereScape, the pioneer in data warehouse automation software WhereScape, the pioneer in data warehouse automation software
WhereScape, the pioneer in data warehouse automation software
 
9. Document Oriented Databases
9. Document Oriented Databases9. Document Oriented Databases
9. Document Oriented Databases
 
Consolidating MLOps at One of Europe’s Biggest Airports
Consolidating MLOps at One of Europe’s Biggest AirportsConsolidating MLOps at One of Europe’s Biggest Airports
Consolidating MLOps at One of Europe’s Biggest Airports
 
Databricks for Dummies
Databricks for DummiesDatabricks for Dummies
Databricks for Dummies
 
From Data Warehouse to Lakehouse
From Data Warehouse to LakehouseFrom Data Warehouse to Lakehouse
From Data Warehouse to Lakehouse
 
Modern real-time streaming architectures
Modern real-time streaming architecturesModern real-time streaming architectures
Modern real-time streaming architectures
 
Databricks Fundamentals
Databricks FundamentalsDatabricks Fundamentals
Databricks Fundamentals
 
Snowflake Company Presentation
Snowflake Company PresentationSnowflake Company Presentation
Snowflake Company Presentation
 
Spark graphx
Spark graphxSpark graphx
Spark graphx
 
The Hidden Value of Hadoop Migration
The Hidden Value of Hadoop MigrationThe Hidden Value of Hadoop Migration
The Hidden Value of Hadoop Migration
 
GCP Data Engineer cheatsheet
GCP Data Engineer cheatsheetGCP Data Engineer cheatsheet
GCP Data Engineer cheatsheet
 
Big query
Big queryBig query
Big query
 
Migrating your traditional Data Warehouse to a Modern Data Lake
Migrating your traditional Data Warehouse to a Modern Data LakeMigrating your traditional Data Warehouse to a Modern Data Lake
Migrating your traditional Data Warehouse to a Modern Data Lake
 
How to Choose the Right Database for Your Workloads
How to Choose the Right Database for Your WorkloadsHow to Choose the Right Database for Your Workloads
How to Choose the Right Database for Your Workloads
 
The Migration to Event-Driven Microservices (Adam Bellemare, Flipp) Kafka Sum...
The Migration to Event-Driven Microservices (Adam Bellemare, Flipp) Kafka Sum...The Migration to Event-Driven Microservices (Adam Bellemare, Flipp) Kafka Sum...
The Migration to Event-Driven Microservices (Adam Bellemare, Flipp) Kafka Sum...
 
Common MongoDB Use Cases
Common MongoDB Use Cases Common MongoDB Use Cases
Common MongoDB Use Cases
 
Apache Flink 101 - the rise of stream processing and beyond
Apache Flink 101 - the rise of stream processing and beyondApache Flink 101 - the rise of stream processing and beyond
Apache Flink 101 - the rise of stream processing and beyond
 
Zero to Snowflake Presentation
Zero to Snowflake Presentation Zero to Snowflake Presentation
Zero to Snowflake Presentation
 

Semelhante a Designing a Serverless Application with Domain Driven Design

BusinessIntelligenze - On Cloud BI (English)
BusinessIntelligenze - On Cloud BI (English)BusinessIntelligenze - On Cloud BI (English)
BusinessIntelligenze - On Cloud BI (English)
BusinessIntelligenze
 
Optimizing Spark Deployments for Containers: Isolation, Safety, and Performan...
Optimizing Spark Deployments for Containers: Isolation, Safety, and Performan...Optimizing Spark Deployments for Containers: Isolation, Safety, and Performan...
Optimizing Spark Deployments for Containers: Isolation, Safety, and Performan...
Spark Summit
 

Semelhante a Designing a Serverless Application with Domain Driven Design (20)

Preparing for a future Microservices journey using DDD & Wardley Maps
Preparing for a future Microservices journey using DDD & Wardley MapsPreparing for a future Microservices journey using DDD & Wardley Maps
Preparing for a future Microservices journey using DDD & Wardley Maps
 
Cloud Native Cost Optimization UCC
Cloud Native Cost Optimization UCCCloud Native Cost Optimization UCC
Cloud Native Cost Optimization UCC
 
Preparing for a future Microservices journey - Susanne Kaiser
Preparing for a future Microservices journey - Susanne Kaiser Preparing for a future Microservices journey - Susanne Kaiser
Preparing for a future Microservices journey - Susanne Kaiser
 
Best Practices for Building a Warehouse Quickly
Best Practices for Building a Warehouse QuicklyBest Practices for Building a Warehouse Quickly
Best Practices for Building a Warehouse Quickly
 
Summer "Tuning" in Jira and DevSecOps
Summer "Tuning" in Jira and DevSecOpsSummer "Tuning" in Jira and DevSecOps
Summer "Tuning" in Jira and DevSecOps
 
VMworld 2014: Art of IT Infrastructure Design
VMworld 2014: Art of IT Infrastructure DesignVMworld 2014: Art of IT Infrastructure Design
VMworld 2014: Art of IT Infrastructure Design
 
Microservices the Good Bad and the Ugly
Microservices the Good Bad and the UglyMicroservices the Good Bad and the Ugly
Microservices the Good Bad and the Ugly
 
BusinessIntelligenze - On Cloud BI (English)
BusinessIntelligenze - On Cloud BI (English)BusinessIntelligenze - On Cloud BI (English)
BusinessIntelligenze - On Cloud BI (English)
 
Introduction to Wardley Maps
Introduction to Wardley MapsIntroduction to Wardley Maps
Introduction to Wardley Maps
 
Preparing for a future microservices journey (with Wardley Maps)
Preparing for a future microservices journey (with Wardley Maps)Preparing for a future microservices journey (with Wardley Maps)
Preparing for a future microservices journey (with Wardley Maps)
 
Technology and Digital Platform | 2019 partner summit
Technology and Digital Platform | 2019 partner summitTechnology and Digital Platform | 2019 partner summit
Technology and Digital Platform | 2019 partner summit
 
Introducing domain driven design - dogfood con 2018
Introducing domain driven design - dogfood con 2018Introducing domain driven design - dogfood con 2018
Introducing domain driven design - dogfood con 2018
 
SFI 2017 Plantacje Programistów (Developers Plantations) - Colonialism in XXI...
SFI 2017 Plantacje Programistów (Developers Plantations) - Colonialism in XXI...SFI 2017 Plantacje Programistów (Developers Plantations) - Colonialism in XXI...
SFI 2017 Plantacje Programistów (Developers Plantations) - Colonialism in XXI...
 
Optimizing Spark Deployments for Containers: Isolation, Safety, and Performan...
Optimizing Spark Deployments for Containers: Isolation, Safety, and Performan...Optimizing Spark Deployments for Containers: Isolation, Safety, and Performan...
Optimizing Spark Deployments for Containers: Isolation, Safety, and Performan...
 
Higher. Faster. Stronger. Your Applications with Habitat
Higher. Faster. Stronger. Your Applications with HabitatHigher. Faster. Stronger. Your Applications with Habitat
Higher. Faster. Stronger. Your Applications with Habitat
 
06Class_Presentation_AS463561.pdf
06Class_Presentation_AS463561.pdf06Class_Presentation_AS463561.pdf
06Class_Presentation_AS463561.pdf
 
Containers and the Docker EE Difference and usecases
Containers and the Docker EE Difference and usecasesContainers and the Docker EE Difference and usecases
Containers and the Docker EE Difference and usecases
 
Improving Your Company’s Health with Middleware Takeout
Improving Your Company’s Health with Middleware TakeoutImproving Your Company’s Health with Middleware Takeout
Improving Your Company’s Health with Middleware Takeout
 
Dockercon State of the Art in Microservices
Dockercon State of the Art in MicroservicesDockercon State of the Art in Microservices
Dockercon State of the Art in Microservices
 
Introducing Domain Driven Design - codemash
Introducing Domain Driven Design - codemashIntroducing Domain Driven Design - codemash
Introducing Domain Driven Design - codemash
 

Último

Último (20)

Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
 
Advantages of Hiring UIUX Design Service Providers for Your Business
Advantages of Hiring UIUX Design Service Providers for Your BusinessAdvantages of Hiring UIUX Design Service Providers for Your Business
Advantages of Hiring UIUX Design Service Providers for Your Business
 
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
 
Handwritten Text Recognition for manuscripts and early printed texts
Handwritten Text Recognition for manuscripts and early printed textsHandwritten Text Recognition for manuscripts and early printed texts
Handwritten Text Recognition for manuscripts and early printed texts
 
Apidays New York 2024 - The value of a flexible API Management solution for O...
Apidays New York 2024 - The value of a flexible API Management solution for O...Apidays New York 2024 - The value of a flexible API Management solution for O...
Apidays New York 2024 - The value of a flexible API Management solution for O...
 
Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024
 
A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)
 
How to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerHow to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected Worker
 
What Are The Drone Anti-jamming Systems Technology?
What Are The Drone Anti-jamming Systems Technology?What Are The Drone Anti-jamming Systems Technology?
What Are The Drone Anti-jamming Systems Technology?
 
Driving Behavioral Change for Information Management through Data-Driven Gree...
Driving Behavioral Change for Information Management through Data-Driven Gree...Driving Behavioral Change for Information Management through Data-Driven Gree...
Driving Behavioral Change for Information Management through Data-Driven Gree...
 
2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...
 
Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobe
Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, AdobeApidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobe
Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobe
 
The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024
 
Partners Life - Insurer Innovation Award 2024
Partners Life - Insurer Innovation Award 2024Partners Life - Insurer Innovation Award 2024
Partners Life - Insurer Innovation Award 2024
 
AWS Community Day CPH - Three problems of Terraform
AWS Community Day CPH - Three problems of TerraformAWS Community Day CPH - Three problems of Terraform
AWS Community Day CPH - Three problems of Terraform
 
Scaling API-first – The story of a global engineering organization
Scaling API-first – The story of a global engineering organizationScaling API-first – The story of a global engineering organization
Scaling API-first – The story of a global engineering organization
 
presentation ICT roal in 21st century education
presentation ICT roal in 21st century educationpresentation ICT roal in 21st century education
presentation ICT roal in 21st century education
 
Strategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
Strategize a Smooth Tenant-to-tenant Migration and Copilot TakeoffStrategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
Strategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
 
Powerful Google developer tools for immediate impact! (2023-24 C)
Powerful Google developer tools for immediate impact! (2023-24 C)Powerful Google developer tools for immediate impact! (2023-24 C)
Powerful Google developer tools for immediate impact! (2023-24 C)
 
TrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
TrustArc Webinar - Stay Ahead of US State Data Privacy Law DevelopmentsTrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
TrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
 

Designing a Serverless Application with Domain Driven Design

  • 1. Designing a Serverless Application with Domain Driven Design Susanne Kaiser Independent Tech Consultant @suksr
  • 2. $2,840,000,000,000 TWOTRILLIONEIGHTHUNDREDFOURTYBILLION USD Costs of Poor Software Quality in the US in 2018 (by CISQ report ) Source: https://www.it-cisq.org/the-cost-of-poor-quality-software-in-the-us-a-2018-report @suksr
  • 3. Areas of Cost Relating To Poor Software Quality Source: https://www.it-cisq.org/the-cost-of-poor-quality-software-in-the-us-a-2018-report @suksr
  • 4. Some Indicators for Poor Software Quality (extracted from CISQ report ) t Defects 0% Increasing defect trend Low test coverage Cyclomatic complexity Large inheritance depth High amount of effort to understand piece of code Badly engineered software Lack of domain knowledge Based on: https://www.it-cisq.org/the-cost-of-poor-quality-software-in-the-us-a-2018-report Communication and coordination breakdowns in (large) teams High degree of class coupling @suksr
  • 5. Domain Driven Design (DDD) Business Domain Needs Strategy Software Design @suksr
  • 6. Domain Driven Design (DDD) – Terminology Strategic Design Tactical Design Bounded Context Ubiquitous Language Core Subdomain Supporting Subdomain Generic Subdomain Problem Space Solution Space Context Maps Anti-Corruption Layer Shared Kernel Open Host Service Separate Ways Partnership Customer-Supplier Conformist Domain Model Entity Value Object Aggregate Repository Factory Application Service Domain Service Domain Event @suksr
  • 7. DDD & Wardley Maps ValueChainInvisibleVisible Evolution Genesis Custom-Built Product (+rental) Commodity (+utility) Position Movement Uncharted Industrialised @suksr
  • 8. ValueChain InvisibleVisible Evolution Visualisation of a value chain’s evolution Genesis Custom-Built Product (+rental) Commodity (+utility) Position Movement Wardley Maps BY SIMON WARDLEY Uncharted Industrialised @suksr
  • 9. Wardley Maps – VALUE CHAIN Who are your users? ValueChain InvisibleVisible @suksr
  • 10. Wardley Maps – VALUE CHAIN Who are your users? What are your users’ needs? ValueChain InvisibleVisible @suksr
  • 11. Wardley Maps – VALUE CHAIN Who are your users? What are your users’ needs? What are the components/activities to fulfill your users’ needs incl. dependencies? ValueChain InvisibleVisible Position @suksr
  • 12. Wardley Maps – LANDSCAPE ValueChain InvisibleVisible Evolution Components along evolution axes Genesis Custom-Built Product (+rental) Commodity (+utility) Position Movement @suksr
  • 13. ValueChain InvisibleVisible Genesis Custom-Built Product (+rental) Commodity (+utility) Evolution Everything evolves Past Current Future Supply CompetitionDemand Competition Uncharted Industrialised Wardley Maps – PATTERNS Movement @suksr
  • 14. ValueChain InvisibleVisible Genesis Custom-Built Product (+rental) Commodity (+utility) Evolution Past Current Future Characteristics changeUncharted Undefined market Uncertain Unpredictable Rare Poorly understood Forming market Learning on use Increasing understanding Slowly increasing consumption Rapid increases in learning Growing market Learning on operation Increasing education Rapidly increasing consumption Rapid increase in use Mature market Known / accepted Stable Widespread and stabilising Commonly understood (in term of use) Industrialised Wardley Maps – PATTERNS Movement @suksr
  • 15. ValueChain InvisibleVisible Genesis Custom-Built Product (+rental) Commodity (+utility) Evolution Wardley Maps – PRINCIPLES Use appropriate methods per evolution stage Build in-house Use/buy off-the-shelf product Outsource to utility suppliers @suksr
  • 16. ValueChain InvisibleVisible Genesis Custom-Built Product (+rental) Commodity (+utility) Evolution Use appropriate methods per evolution stage Wardley Maps – PRINCIPLES Build in-house Use/buy off-the-shelf product Outsource to utility suppliers @suksr
  • 17. ValueChain InvisibleVisible Genesis Custom-Built Product (+rental) Commodity (+utility) Evolution Use appropriate methods per evolution stage Wardley Maps – PRINCIPLES Build in-house Use/buy off-the-shelf product Outsource to utility suppliers @suksr
  • 18. ValueChain InvisibleVisible Genesis Custom-Built Product (+rental) Commodity (+utility) Evolution Know your users & focus on user needs Wardley Maps – PRINCIPLES Build in-house / Agile Use/buy off-the-shelf product / Lean Outsource to utility suppliers / Six Sigma @suksr
  • 19. ValueChain InvisibleVisible Genesis Custom-Built Product (+rental) Commodity (+utility) Evolution DDD & Wardley Maps Ubiquitous Language Domain Knowledge Understanding the problem domain first Problem Domain Domain Experts Development Teams Collaboration @suksr
  • 20. ValueChain InvisibleVisible Genesis Custom-Built Product (+rental) Commodity (+utility) Evolution DDD & Wardley Maps Problem Domain Strategic Design DDD Patterns & Practices Tactical Design @suksr
  • 21. ValueChain InvisibleVisible Genesis Custom-Built Product (+rental) Commodity (+utility) Evolution DDD & Wardley Maps Problem Domain Strategic Design DDD Patterns & Practices Tactical Design Analysing the business domain Discovering Subdomains Problem Space Decomposing into modular components (Bounded Contexts) Mapping interaction patterns between BC (Context Maps) Solution Space @suksr
  • 22. ValueChain InvisibleVisible Genesis Custom-Built Product (+rental) Commodity (+utility) Evolution DDD & Wardley Maps Problem Domain Strategic Design DDD Patterns & Practices Tactical Design Architecting a solution fitting the problem domain as closely as possible Provides building blocks to implement domain model Analysing the business domain Discovering Subdomains Problem Space Decomposing into modular components (Bounded Contexts (BC) Mapping interaction patterns between BC (Context Maps) Solution Space @suksr Solution Space
  • 23. ValueChain InvisibleVisible Genesis Custom-Built Product (+rental) Commodity (+utility) Evolution Distilling the problem domain & discovering the core subdomain DDD & Wardley Maps Core Subdomain Problem Domain STRATEGIC DESIGN (PROBLEM SPACE) Supporting Subdomain Generic Subdomain ProblemSpace @suksr
  • 24. ValueChain InvisibleVisible Genesis Custom-Built Product (+rental) Commodity (+utility) Evolution Distilling the problem domain & discovering the core subdomain DDD & Wardley Maps Core Subdomain Problem Domain Competitive advantage Complex Changes often Build in-house STRATEGIC DESIGN (PROBLEM SPACE) Supporting Subdomain Generic Subdomain ProblemSpace @suksr
  • 25. ValueChain InvisibleVisible Genesis Custom-Built Product (+rental) Commodity (+utility) Evolution Distilling the problem domain & discovering the core subdomain DDD & Wardley Maps Core Subdomain Problem Domain Competitive advantage Complex Changes often Build in-house No competitive advantage Quite simple Does not change often Prefer to buy/use off-the-shelf STRATEGIC DESIGN (PROBLEM SPACE) Supporting Subdomain Generic Subdomain ProblemSpace @suksr
  • 26. ValueChain InvisibleVisible Genesis Custom-Built Product (+rental) Commodity (+utility) Evolution Distilling the problem domain & discovering the core subdomain DDD & Wardley Maps Core Subdomain Problem Domain Competitive advantage Complex Changes often Build in-house No competitive advantage Quite simple Does not change often Prefer to buy/use off-the-shelf No competitive advantage Generally complex Does not change often Buy/use off-the-shelf / outsource STRATEGIC DESIGN (PROBLEM SPACE) Supporting Subdomain Generic Subdomain ProblemSpace @suksr
  • 27. ValueChain InvisibleVisible Genesis Custom-Built Product (+rental) Commodity (+utility) Evolution Model Driven Design DDD & Wardley Maps STRATEGIC DESIGN (SOLUTION SPACE) Development Teams Domain Experts Ubiquitous Language Analysis Model Code Model Domain Model Core Subdomain Supporting Subdomain Generic Subdomain Problem Domain ProblemSpaceSolutionSpace abstracted by @suksr
  • 28. ValueChain InvisibleVisible Genesis Custom-Built Product (+rental) Commodity (+utility) Evolution Bounded Contexts DDD & Wardley Maps STRATEGIC DESIGN (SOLUTION SPACE) Core Subdomain Supporting Subdomain Generic Subdomain Problem Domain ProblemSpaceSolutionSpace Linguistic/semantic boundary Ownership boundary Model boundary Physical boundary Different architectural patterns per context possible @suksr
  • 29. ValueChain InvisibleVisible Genesis Custom-Built Product (+rental) Commodity (+utility) Evolution ProblemSpace Evaluate Submissions Manage Event Organiser Build & Publish Schedule Communicate w/ Speakers Signup/Signin Know your users & focus on user needs Submit Session DDD & Wardley Maps STRATEGIC DESIGN (PROBLEM SPACE) Speaker @suksr
  • 30. ValueChain InvisibleVisible Genesis Custom-Built Product (+rental) Commodity (+utility) Evolution ProblemSpace Evaluate Submissions Manage Event Organiser Build & Publish Schedule Communicate w/ Speakers Signup/Signin Speaker Submit Session DDD & Wardley Maps STRATEGIC DESIGN (PROBLEM SPACE) Discovering subdomains Supporting GenericCore @suksr
  • 31. ValueChain InvisibleVisible Genesis Custom-Built Product (+rental) Commodity (+utility) Evolution ProblemSpace Evaluate Submissions Manage Event Organiser Build & Publish Schedule Communicate w/ Speakers Signup/Signin Speaker Submit Session DDD & Wardley Maps STRATEGIC DESIGN (SOLUTION SPACE) Supporting GenericCore Event Evaluation AccountSchedule MessageSession Domain Models SolutionSpace @suksr
  • 32. ValueChain InvisibleVisible Genesis Custom-Built Product (+rental) Commodity (+utility) Evolution ProblemSpace Evaluate Submissions Manage Event Organiser Build & Publish Schedule Communicate w/ Speakers Signup/Signin Speaker Submit Session DDD & Wardley Maps Supporting GenericCore Event Evaluation AccountSchedule Message Speaker Session CfP SolutionSpace STRATEGIC DESIGN (SOLUTION SPACE) Domain Models @suksr
  • 33. ValueChain InvisibleVisible Genesis Custom-Built Product (+rental) Commodity (+utility) Evolution ProblemSpace Evaluate Submissions Manage Event Organiser Build & Publish Schedule Communicate w/ Speakers Signup/Signin Speaker Submit Session DDD & Wardley Maps Supporting GenericCore Event Evaluation AccountSchedule Message Speaker Profile Submitted Session CfP Settings Recipient Open CfP Evaluated Session Scheduled Session SolutionSpace STRATEGIC DESIGN (SOLUTION SPACE) Domain Models @suksr
  • 34. ValueChain InvisibleVisible Genesis Custom-Built Product (+rental) Commodity (+utility) Evolution ProblemSpace Evaluate Submissions Manage Event Organiser Build & Publish Schedule Communicate w/ Speakers Signup/Signin Speaker Submit Session DDD & Wardley Maps Supporting GenericCore SolutionSpace STRATEGIC DESIGN (SOLUTION SPACE) Bounded Contexts Linguistic/semantic boundary Model integrity boundary Event Evaluation AccountSchedule MessageSubmitted Session CfP Settings Recipient Open CfP Evaluated Session Scheduled Session Speaker Profile Session Evaluation Submission Handling Event Mngmnt. Schedule Mngmnt. Messaging Account Handling @suksr
  • 35. ValueChain InvisibleVisible Genesis Custom-Built Product (+rental) Commodity (+utility) Evolution ProblemSpace Evaluate Submissions Manage Event Organiser Build & Publish Schedule Communicate w/ Speakers Signup/Signin Speaker Submit Session DDD & Wardley Maps Supporting GenericCore SolutionSpace STRATEGIC DESIGN (SOLUTION SPACE) Submission Handling Event Mngmnt. Session Evaluation Messaging Account Handling Schedule Mngmnt. Bounded Contexts Ownership boundary Linguistic/semantic boundary Model integrity boundary @suksr
  • 36. ValueChain InvisibleVisible Genesis Custom-Built Product (+rental) Commodity (+utility) Evolution ProblemSpace Evaluate Submissions Manage Event Organiser Build & Publish Schedule Communicate w/ Speakers Signup/Signin Speaker Submit Session DDD & Wardley Maps Supporting GenericCore SolutionSpace STRATEGIC DESIGN (SOLUTION SPACE) Submission Handling Event Mngmnt. Session Evaluation Messaging Account Handling Schedule Mngmnt. Bounded Contexts Ownership boundary Linguistic/semantic boundary Model integrity boundary Physical boundary SCM Data store CI/CD Artefact @suksr
  • 37. ValueChain InvisibleVisible Genesis Custom-Built Product (+rental) Commodity (+utility) Evolution ProblemSpace Evaluate Submissions Manage Event Organiser Build & Publish Schedule Communicate w/ Speakers Signup/Signin Speaker Submit Session DDD & Wardley Maps Supporting GenericCore SolutionSpace TACTICAL DESIGN Submission Handling Event Mngmnt. Session Evaluation Messaging Account Handling Schedule Mngmnt. Architectural Patterns Architectural patterns can differ per Bounded Context, e.g. StrategicDesignTacticalDesign Layered Architecture Hexagonal Architecture CQRS @suksr
  • 39. Hexagonal Architecture Business Logic Application Port Adapter BOUNDED CONTEXT: EVENT MANAGEMENT EventController AWS API Gateway Port REST-API with AWS API-Gateway and AWS Lambda EventController AWS API Gateway newEvent deleteEvent activateEvent POST /events DELETE /events/{id} POST /events/{id}/activate Inner Outer Outside @suksr
  • 40. export class EventsController { private readonly eventsService: EventApplicationService; public constructor(eventsService: EventApplicationService) { this.eventsService = eventsService; } public activateEvent: Handler = async (event: APIGatewayEvent, context: Context, callback: Callback) => { if (!event.pathParameters) { return callback(undefined, failure({ status: "error", error: "no event id specified" })); } if (!event.requestContext.authorizer) { return callback(undefined, failure({ status: "error", error: "no authorized user specified" })); } try { const eventId = new EventId(event.pathParameters.id); const userId = new UserId(event.requestContext.authorizer.claims['cognito:username']); await this.eventsService.activateEvent(eventId, userId); callback(undefined, success({status: "ok"})); } catch(e) { return callback(undefined, failure({ status: "error", error: e })); } }; public newEvent: Handler = async (event: APIGatewayEvent, context: Context, callback: Callback) => { // ... // } REST-API AdapterPort Lambda Function Lambda Function Hexagonal Architecture BOUNDED CONTEXT: EVENT MANAGEMENT @suksr
  • 41. Hexagonal Architecture Business Logic Application Port BOUNDED CONTEXT: EVENT MANAGEMENT EventController AWS API Gateway Port Data Storage with AWS DynamoDB DynamoDBEventRepository Inner Outer Outside @suksr
  • 42. export default class DynamoDBEventRepository implements EventRepository { private static TABLE_NAME: string = "events"; private readonly dynamoDbClient: AWS.DynamoDB.DocumentClient; constructor() { this.dynamoDbClient = new AWS.DynamoDB.DocumentClient(); } public async eventOfId(id: EventId): Promise<Event|null> { const params : DocumentClient.GetItemInput = { TableName: DynamoDBEventRepository.TABLE_NAME, Key: { eventId: id } }; const result: DocumentClient.GetItemOutput = await this.dynamoDbClient.get(params).promise(); const item: AttributeMap|undefined = result.Item; if (item) { const id = new EventId(item.eventId); const name = Name.create(item.name); const description = Description.create(item.description); const period = Period.create(item.period.startDate, item.period.endDate); return Event.create(id, name, item.eventStatus, period, description); } return null; } public saveEvent(event: Event) { const params : DocumentClient.PutItemInput = { // ... // }; return this.dynamoDbClient.put(params).promise(); } } Hexagonal Architecture Database AdapterPort DynamoDB Client BOUNDED CONTEXT: EVENT MANAGEMENT @suksr
  • 43. Hexagonal Architecture Business Logic Application Port BOUNDED CONTEXT: EVENT MANAGEMENT EventController AWS API Gateway Port DynamoDBEventRepository Business Logic Implementation Inner Outer Outside @suksr
  • 44. ValueChain InvisibleVisible Genesis Custom-Built Product (+rental) Commodity (+utility) Evolution Evaluate Submissions Manage Event Organiser Build & Publish Schedule Communicate w/ Speakers Signup/Signin Speaker Submit Session DDD & Wardley Maps Supporting GenericCore TACTICAL DESIGN Submission Handling Event Mngmnt. Session Evaluation Messaging Account Handling Schedule Mngmnt. Business Logic Implementation Patterns Business logic implementation patterns can differ per Bounded Context, e.g. Domain Model Active Record Transaction Script @suksr ProblemSpaceSolutionSpace StrategicDesignTacticalDesign
  • 45. ValueChain InvisibleVisible Genesis Custom-Built Product (+rental) Commodity (+utility) Evolution Evaluate Submissions Manage Event Organiser Build & Publish Schedule Communicate w/ Speakers Signup/Signin Speaker Submit Session DDD & Wardley Maps Supporting GenericCore TACTICAL DESIGN Submission Handling Event Mngmnt. Session Evaluation Messaging Account Handling Schedule Mngmnt. Building Blocks of Domain Models ● Value Object ● Entity ● Aggregate ● Repository ● ApplicationService ● Domain Event ● ... @suksr ProblemSpaceSolutionSpace StrategicDesignTacticalDesign
  • 46. Domain Model BC: EVENT MANAGEMENT Event create: Event activate reschedule rename EventId id: string Name create: Name name: string EventStatus CREATED ACTIVATED DEACTIVATED deactivate Description create: Description desc: string Period create: Period start: Date end: Date Value Object Entity Aggregate Root Aggregate Application Port EventController AWS API Gateway Port DynamoDBEventRepository Event @suksr
  • 47. export default class Event { readonly id: EventId; name: Name; description?: Description; status: EventStatus; period: Period; private constructor(id: EventId, name: Name, status: EventStatus, period: Period, description?: Description) { this.id = id; this.name = name; this.description = description; this.status = status; this.period = period; } public activate() { if (this.status === EventStatus.CLOSED) { throw new Error("You cannot activate a closed event"); } if (this.status === EventStatus.ACTIVATED) { throw new Error("This event has already been activated"); } this.status = EventStatus.ACTIVATED; } public rename(name: Name) { if (!name) { throw new Error("You cannot rename the event to an empty name"); } this.name = name; } // ... // } Aggregate @suksr
  • 48. Domain Model BC: EVENT MANAGEMENT Application EventController AWS API Gateway DynamoDBEventRepository Event EventApplicationService EventRepository @suksr
  • 49. export default class EventApplicationService { private readonly eventRepository: EventRepository; constructor(eventRepository: EventRepository) { this.eventRepository = eventRepository; } public async activateEvent(id: EventId) { const event = await this.eventRepository.eventOfId(id); if (!event) { throw new Error("Could not deactivate event with id " + id + ", since event does not exist."); } event.activate(); await this.eventRepository.saveEvent(event); } // ... // } ApplicationService Domain Model EVENT MANAGEMENT @suksr
  • 50. Domain Model EVENT MANAGEMENT Application EventController AWS API Gateway DynamoDBEventRepository Event EventApplicationService EventRepository export default interface EventRepository { saveEvent(event: Event): void; eventOfId(id: EventId): Promise<Event|null>; // ... // } @suksr
  • 51. ValueChain InvisibleVisible Genesis Custom-Built Product (+rental) Commodity (+utility) Evolution Evaluate Submissions Manage Event Organiser Build & Publish Schedule Communicate w/ Speakers Signup/Signin Speaker Submit Session DDD & Wardley Maps Supporting GenericCore TACTICAL DESIGN Submission Handling Event Mngmnt. Session Evaluation Messaging Account Handling Schedule Mngmnt. DDD suits best for the core subdomain Movement Build in-house Use/buy off-the-shelf product Outsource to utility suppliers - or - - or - @suksr ProblemSpaceSolutionSpace StrategicDesignTacticalDesign
  • 52. Business Domain Needs Strategy Better Software Design Ubiquitous Language Domain Knowledge Domain Experts Development Teams Collaboration Gaining Domain Knowledge Aligning Software Design to Business Domain Core Subdomain Discovering the Core Subdomain Do not apply DDD everywhere! Focus on your core! Core Subdomain DDD helps with ... @suksr But ...