Raimondas tijunaitis tackle_big_ball_of_mud_super_mario_style
-
Upload
dotnetcrowd -
Category
Technology
-
view
205 -
download
5
Transcript of Raimondas tijunaitis tackle_big_ball_of_mud_super_mario_style
ABOUT ME
Developer Adform ndash wwwadformcomhttpsltlinkedincominraimondastijunaitis
WHAT THIS TALK IS NOT ABOUT
bdquoBest Practicesldquo
Deep dive into DDD CQRS Event Sourcing
Refactoring
WHAT IT IS ABOUT
Common (for some of us) software complexity issues
Techniques that might help and were tried in production
ContinuousIterative decoupling
THE DUNGEON
ISSUES
Platform coupling
Model ambiguity
Growing learning curve
SCREW MUSHROOMS GIVE ME GUNS
LEVEL 1 ndash DE-NORMALIZED MODELS
Specifically designed for quering
Built asynchronously
Messages dispatched from legacy code
SALVATION WITH EVENTS
Send Message
DE-NORMALIZED MODEL
Project
Ad Deactivated
Ad Updated
Ad Created
OTHER POSSIBLE WAYS
SQL Server replicationsDepends on consumer count and your system load
Replicates the same relational structure
SQL Server Message BrokerQueue based message publishing
Custom data messages
Re-use write-model + cachingBe careful with excessive indexing ndash this might harm your writes
Cache rebuild and invalidation issues
READ MODELSNEW WEAPON UNLOCKED
MEET NEW ENEMIES (FRIENDS)
Eventual consistencyConsistency is a myth
Talk with your business people
Tradeoffs
Idempotency and orderingEvent versions
Read-model versions
What about 1 thread
DesynchronizationCreate sync tools
LEVEL 2 ndash SYNERGY BETWEEN SYSTEMS
Avoid adding new features into monolith
Avoid big-bang reworks
Use strategic design to handle complexity
REWORK = REFACTORING
Two systems side-by-side works together
Iterative functionality migration
In-syncOld System
New System
Sync
TIP Sometimes it is better to start over
TIP Having backup strategy keeps your blood pressure low
TIP Go live ASAP
SEPARATE INFRASTRUCTURE FROM BUSINESS LOGIC
TIP Identify infrastructure code and separate it
TIP Use different models for different tasks
STRATEGIC DESIGNNEW WEAPON UNLOCKED
LEVEL 3 WRITE MODEL DESIGN
Accepts commands only
Does not provide reading operations
Commands results into sequence of events
Events are immutable and persisted into EventStore
Commands RabbitMQ
Banner Management
Service
Event Store
Events
OR ANY OTHER ORM FRAMEWORK
Aggregates emit events
Aggregates are de-hydrated by replaying historical events
No settersgetters
Respect encapsulation
NO HIBERNATE
TIP Events and commands can be very natural constructs
TIP Excluding query operations can simplify code a lot
COMMANDS AND EVENTSNEW WEAPON UNLOCKED
LEVEL 4 EVENT STORE
Stores series of immutable events
There is no delete
Acts as ldquoEvent Logrdquo
Has built in projection engine
Is not designed for querying
BannerCreated BannerClickUrlsAdded BannerRenamed BannerRenamed
EVENT SOURCINGNEW WEAPON UNLOCKED
Performs left-folding of historical events
Produces projectionsviews into streams
Event selection
LEVEL 5 PROJECTIONS
Banner Projection
Click Urlschanged
Image Renamed
Image Created
Publishing UI Tags
PROJECTIONSNEW WEAPON UNLOCKED
Two way synchronization
Anti-corruption layer patters
LEVEL 6 STAYING IN SYNC
SYNC NEW TO OLD
Banner Event
Event Store Dispatcher
ACL Service
RabbitMQ
AdministrationDB
Reacts to domain events
Makes changes into AdsministrationDBwithin small transactions
Uses Dapper to simplify persistence
SYNC OLD TO NEW
Legacy event
ACL Service
RabbitMQReacts to legacy events (AdCreatedAdUpdated)
ACL transforms events into commands
Aggregates are updated
Banner Management
Service
Commands From old system
Events
TIP Make legacy integration interactions explicit
ANTI-CORRUPTION LAYERSNEW WEAPON UNLOCKED
LEVEL 7 API
This is the only way to interact with your system
Build UI on top of the API
Versioning is difficult ndash think if you really need it
EXPOSE COMMANDS AS RESOURCES
PUT httpImageBaneruuidName
Command RenameBanner
PUT httpImageBaneruuidFile
Command ReuploadFile
HYPERMEDIA ndash HELP YOUR CLIENT
GET httpImageBanneruuid
HTTP APINEW WEAPON UNLOCKED
LEVEL 8 UI amp UX
Excel is already invented itrsquos pretty damn good
UI must be built on top of your API
Guide user through business process
BEFORE
AFTER
TIP Build UI to solve business cases but not to edit data
TIP Exposing tasks can reduce overhead for users and for developers
TIP Build UI on top of the API
TASK BASED UINEW WEAPON UNLOCKED
LEVEL 9 TROUBLESHOOTING AND DEBUGGING
There is no F5 in distributed systems
Correlate all your requests and messages
Use centralized logging services
INSIDE THE RABBIT HOLE
REST API
Domain Service
ACL Service
ES Dispatcher
Service
Creative Upload
API
Creative Upload Service
Ad Analyzer Service
File Checker Service
File Generation
Service
Publishing Service
Preview Service
TRACK OPERATIONS
TIP Track every operation performance ndashthis helps to identify bottlenecks
TIP Automate load tests and run them often
CORRELATION IDSNEW ITEM UNLOCKED NIGHT VISION
YOU DONrsquoT NEED THEM ALL - CHOOSE WISELY
De-normalized read models
Strategic design
CQRS
Event sourcing
Projections
ACLs
REST API
Task based UI
Centralized logs
LOTS OF GUNS
BUT WHAT IFhellip
No guns for You
ADAPT TO BUSINESS THINKING
Avoid ndash technical arguments
Code quality is poor
We need to refactor
Technology is old
Everyone is using Angular nowhellip
Missing ldquobest practicesrdquo
We want to try NoSQLhellip
Prefer ndash economical arguments
Releases every day
Faster feature development
New products
Involve more developers
MS licenses are expensivehellip
DONrsquoT GET LOST IN A DUNGEON
Have a VISION
COMMIT
Define Your STRATEGY
Create TACTICS
FIGHT
ADOPT new tactics
Fight HARDER
WIN
WHAT THIS TALK IS NOT ABOUT
bdquoBest Practicesldquo
Deep dive into DDD CQRS Event Sourcing
Refactoring
WHAT IT IS ABOUT
Common (for some of us) software complexity issues
Techniques that might help and were tried in production
ContinuousIterative decoupling
THE DUNGEON
ISSUES
Platform coupling
Model ambiguity
Growing learning curve
SCREW MUSHROOMS GIVE ME GUNS
LEVEL 1 ndash DE-NORMALIZED MODELS
Specifically designed for quering
Built asynchronously
Messages dispatched from legacy code
SALVATION WITH EVENTS
Send Message
DE-NORMALIZED MODEL
Project
Ad Deactivated
Ad Updated
Ad Created
OTHER POSSIBLE WAYS
SQL Server replicationsDepends on consumer count and your system load
Replicates the same relational structure
SQL Server Message BrokerQueue based message publishing
Custom data messages
Re-use write-model + cachingBe careful with excessive indexing ndash this might harm your writes
Cache rebuild and invalidation issues
READ MODELSNEW WEAPON UNLOCKED
MEET NEW ENEMIES (FRIENDS)
Eventual consistencyConsistency is a myth
Talk with your business people
Tradeoffs
Idempotency and orderingEvent versions
Read-model versions
What about 1 thread
DesynchronizationCreate sync tools
LEVEL 2 ndash SYNERGY BETWEEN SYSTEMS
Avoid adding new features into monolith
Avoid big-bang reworks
Use strategic design to handle complexity
REWORK = REFACTORING
Two systems side-by-side works together
Iterative functionality migration
In-syncOld System
New System
Sync
TIP Sometimes it is better to start over
TIP Having backup strategy keeps your blood pressure low
TIP Go live ASAP
SEPARATE INFRASTRUCTURE FROM BUSINESS LOGIC
TIP Identify infrastructure code and separate it
TIP Use different models for different tasks
STRATEGIC DESIGNNEW WEAPON UNLOCKED
LEVEL 3 WRITE MODEL DESIGN
Accepts commands only
Does not provide reading operations
Commands results into sequence of events
Events are immutable and persisted into EventStore
Commands RabbitMQ
Banner Management
Service
Event Store
Events
OR ANY OTHER ORM FRAMEWORK
Aggregates emit events
Aggregates are de-hydrated by replaying historical events
No settersgetters
Respect encapsulation
NO HIBERNATE
TIP Events and commands can be very natural constructs
TIP Excluding query operations can simplify code a lot
COMMANDS AND EVENTSNEW WEAPON UNLOCKED
LEVEL 4 EVENT STORE
Stores series of immutable events
There is no delete
Acts as ldquoEvent Logrdquo
Has built in projection engine
Is not designed for querying
BannerCreated BannerClickUrlsAdded BannerRenamed BannerRenamed
EVENT SOURCINGNEW WEAPON UNLOCKED
Performs left-folding of historical events
Produces projectionsviews into streams
Event selection
LEVEL 5 PROJECTIONS
Banner Projection
Click Urlschanged
Image Renamed
Image Created
Publishing UI Tags
PROJECTIONSNEW WEAPON UNLOCKED
Two way synchronization
Anti-corruption layer patters
LEVEL 6 STAYING IN SYNC
SYNC NEW TO OLD
Banner Event
Event Store Dispatcher
ACL Service
RabbitMQ
AdministrationDB
Reacts to domain events
Makes changes into AdsministrationDBwithin small transactions
Uses Dapper to simplify persistence
SYNC OLD TO NEW
Legacy event
ACL Service
RabbitMQReacts to legacy events (AdCreatedAdUpdated)
ACL transforms events into commands
Aggregates are updated
Banner Management
Service
Commands From old system
Events
TIP Make legacy integration interactions explicit
ANTI-CORRUPTION LAYERSNEW WEAPON UNLOCKED
LEVEL 7 API
This is the only way to interact with your system
Build UI on top of the API
Versioning is difficult ndash think if you really need it
EXPOSE COMMANDS AS RESOURCES
PUT httpImageBaneruuidName
Command RenameBanner
PUT httpImageBaneruuidFile
Command ReuploadFile
HYPERMEDIA ndash HELP YOUR CLIENT
GET httpImageBanneruuid
HTTP APINEW WEAPON UNLOCKED
LEVEL 8 UI amp UX
Excel is already invented itrsquos pretty damn good
UI must be built on top of your API
Guide user through business process
BEFORE
AFTER
TIP Build UI to solve business cases but not to edit data
TIP Exposing tasks can reduce overhead for users and for developers
TIP Build UI on top of the API
TASK BASED UINEW WEAPON UNLOCKED
LEVEL 9 TROUBLESHOOTING AND DEBUGGING
There is no F5 in distributed systems
Correlate all your requests and messages
Use centralized logging services
INSIDE THE RABBIT HOLE
REST API
Domain Service
ACL Service
ES Dispatcher
Service
Creative Upload
API
Creative Upload Service
Ad Analyzer Service
File Checker Service
File Generation
Service
Publishing Service
Preview Service
TRACK OPERATIONS
TIP Track every operation performance ndashthis helps to identify bottlenecks
TIP Automate load tests and run them often
CORRELATION IDSNEW ITEM UNLOCKED NIGHT VISION
YOU DONrsquoT NEED THEM ALL - CHOOSE WISELY
De-normalized read models
Strategic design
CQRS
Event sourcing
Projections
ACLs
REST API
Task based UI
Centralized logs
LOTS OF GUNS
BUT WHAT IFhellip
No guns for You
ADAPT TO BUSINESS THINKING
Avoid ndash technical arguments
Code quality is poor
We need to refactor
Technology is old
Everyone is using Angular nowhellip
Missing ldquobest practicesrdquo
We want to try NoSQLhellip
Prefer ndash economical arguments
Releases every day
Faster feature development
New products
Involve more developers
MS licenses are expensivehellip
DONrsquoT GET LOST IN A DUNGEON
Have a VISION
COMMIT
Define Your STRATEGY
Create TACTICS
FIGHT
ADOPT new tactics
Fight HARDER
WIN
WHAT IT IS ABOUT
Common (for some of us) software complexity issues
Techniques that might help and were tried in production
ContinuousIterative decoupling
THE DUNGEON
ISSUES
Platform coupling
Model ambiguity
Growing learning curve
SCREW MUSHROOMS GIVE ME GUNS
LEVEL 1 ndash DE-NORMALIZED MODELS
Specifically designed for quering
Built asynchronously
Messages dispatched from legacy code
SALVATION WITH EVENTS
Send Message
DE-NORMALIZED MODEL
Project
Ad Deactivated
Ad Updated
Ad Created
OTHER POSSIBLE WAYS
SQL Server replicationsDepends on consumer count and your system load
Replicates the same relational structure
SQL Server Message BrokerQueue based message publishing
Custom data messages
Re-use write-model + cachingBe careful with excessive indexing ndash this might harm your writes
Cache rebuild and invalidation issues
READ MODELSNEW WEAPON UNLOCKED
MEET NEW ENEMIES (FRIENDS)
Eventual consistencyConsistency is a myth
Talk with your business people
Tradeoffs
Idempotency and orderingEvent versions
Read-model versions
What about 1 thread
DesynchronizationCreate sync tools
LEVEL 2 ndash SYNERGY BETWEEN SYSTEMS
Avoid adding new features into monolith
Avoid big-bang reworks
Use strategic design to handle complexity
REWORK = REFACTORING
Two systems side-by-side works together
Iterative functionality migration
In-syncOld System
New System
Sync
TIP Sometimes it is better to start over
TIP Having backup strategy keeps your blood pressure low
TIP Go live ASAP
SEPARATE INFRASTRUCTURE FROM BUSINESS LOGIC
TIP Identify infrastructure code and separate it
TIP Use different models for different tasks
STRATEGIC DESIGNNEW WEAPON UNLOCKED
LEVEL 3 WRITE MODEL DESIGN
Accepts commands only
Does not provide reading operations
Commands results into sequence of events
Events are immutable and persisted into EventStore
Commands RabbitMQ
Banner Management
Service
Event Store
Events
OR ANY OTHER ORM FRAMEWORK
Aggregates emit events
Aggregates are de-hydrated by replaying historical events
No settersgetters
Respect encapsulation
NO HIBERNATE
TIP Events and commands can be very natural constructs
TIP Excluding query operations can simplify code a lot
COMMANDS AND EVENTSNEW WEAPON UNLOCKED
LEVEL 4 EVENT STORE
Stores series of immutable events
There is no delete
Acts as ldquoEvent Logrdquo
Has built in projection engine
Is not designed for querying
BannerCreated BannerClickUrlsAdded BannerRenamed BannerRenamed
EVENT SOURCINGNEW WEAPON UNLOCKED
Performs left-folding of historical events
Produces projectionsviews into streams
Event selection
LEVEL 5 PROJECTIONS
Banner Projection
Click Urlschanged
Image Renamed
Image Created
Publishing UI Tags
PROJECTIONSNEW WEAPON UNLOCKED
Two way synchronization
Anti-corruption layer patters
LEVEL 6 STAYING IN SYNC
SYNC NEW TO OLD
Banner Event
Event Store Dispatcher
ACL Service
RabbitMQ
AdministrationDB
Reacts to domain events
Makes changes into AdsministrationDBwithin small transactions
Uses Dapper to simplify persistence
SYNC OLD TO NEW
Legacy event
ACL Service
RabbitMQReacts to legacy events (AdCreatedAdUpdated)
ACL transforms events into commands
Aggregates are updated
Banner Management
Service
Commands From old system
Events
TIP Make legacy integration interactions explicit
ANTI-CORRUPTION LAYERSNEW WEAPON UNLOCKED
LEVEL 7 API
This is the only way to interact with your system
Build UI on top of the API
Versioning is difficult ndash think if you really need it
EXPOSE COMMANDS AS RESOURCES
PUT httpImageBaneruuidName
Command RenameBanner
PUT httpImageBaneruuidFile
Command ReuploadFile
HYPERMEDIA ndash HELP YOUR CLIENT
GET httpImageBanneruuid
HTTP APINEW WEAPON UNLOCKED
LEVEL 8 UI amp UX
Excel is already invented itrsquos pretty damn good
UI must be built on top of your API
Guide user through business process
BEFORE
AFTER
TIP Build UI to solve business cases but not to edit data
TIP Exposing tasks can reduce overhead for users and for developers
TIP Build UI on top of the API
TASK BASED UINEW WEAPON UNLOCKED
LEVEL 9 TROUBLESHOOTING AND DEBUGGING
There is no F5 in distributed systems
Correlate all your requests and messages
Use centralized logging services
INSIDE THE RABBIT HOLE
REST API
Domain Service
ACL Service
ES Dispatcher
Service
Creative Upload
API
Creative Upload Service
Ad Analyzer Service
File Checker Service
File Generation
Service
Publishing Service
Preview Service
TRACK OPERATIONS
TIP Track every operation performance ndashthis helps to identify bottlenecks
TIP Automate load tests and run them often
CORRELATION IDSNEW ITEM UNLOCKED NIGHT VISION
YOU DONrsquoT NEED THEM ALL - CHOOSE WISELY
De-normalized read models
Strategic design
CQRS
Event sourcing
Projections
ACLs
REST API
Task based UI
Centralized logs
LOTS OF GUNS
BUT WHAT IFhellip
No guns for You
ADAPT TO BUSINESS THINKING
Avoid ndash technical arguments
Code quality is poor
We need to refactor
Technology is old
Everyone is using Angular nowhellip
Missing ldquobest practicesrdquo
We want to try NoSQLhellip
Prefer ndash economical arguments
Releases every day
Faster feature development
New products
Involve more developers
MS licenses are expensivehellip
DONrsquoT GET LOST IN A DUNGEON
Have a VISION
COMMIT
Define Your STRATEGY
Create TACTICS
FIGHT
ADOPT new tactics
Fight HARDER
WIN
THE DUNGEON
ISSUES
Platform coupling
Model ambiguity
Growing learning curve
SCREW MUSHROOMS GIVE ME GUNS
LEVEL 1 ndash DE-NORMALIZED MODELS
Specifically designed for quering
Built asynchronously
Messages dispatched from legacy code
SALVATION WITH EVENTS
Send Message
DE-NORMALIZED MODEL
Project
Ad Deactivated
Ad Updated
Ad Created
OTHER POSSIBLE WAYS
SQL Server replicationsDepends on consumer count and your system load
Replicates the same relational structure
SQL Server Message BrokerQueue based message publishing
Custom data messages
Re-use write-model + cachingBe careful with excessive indexing ndash this might harm your writes
Cache rebuild and invalidation issues
READ MODELSNEW WEAPON UNLOCKED
MEET NEW ENEMIES (FRIENDS)
Eventual consistencyConsistency is a myth
Talk with your business people
Tradeoffs
Idempotency and orderingEvent versions
Read-model versions
What about 1 thread
DesynchronizationCreate sync tools
LEVEL 2 ndash SYNERGY BETWEEN SYSTEMS
Avoid adding new features into monolith
Avoid big-bang reworks
Use strategic design to handle complexity
REWORK = REFACTORING
Two systems side-by-side works together
Iterative functionality migration
In-syncOld System
New System
Sync
TIP Sometimes it is better to start over
TIP Having backup strategy keeps your blood pressure low
TIP Go live ASAP
SEPARATE INFRASTRUCTURE FROM BUSINESS LOGIC
TIP Identify infrastructure code and separate it
TIP Use different models for different tasks
STRATEGIC DESIGNNEW WEAPON UNLOCKED
LEVEL 3 WRITE MODEL DESIGN
Accepts commands only
Does not provide reading operations
Commands results into sequence of events
Events are immutable and persisted into EventStore
Commands RabbitMQ
Banner Management
Service
Event Store
Events
OR ANY OTHER ORM FRAMEWORK
Aggregates emit events
Aggregates are de-hydrated by replaying historical events
No settersgetters
Respect encapsulation
NO HIBERNATE
TIP Events and commands can be very natural constructs
TIP Excluding query operations can simplify code a lot
COMMANDS AND EVENTSNEW WEAPON UNLOCKED
LEVEL 4 EVENT STORE
Stores series of immutable events
There is no delete
Acts as ldquoEvent Logrdquo
Has built in projection engine
Is not designed for querying
BannerCreated BannerClickUrlsAdded BannerRenamed BannerRenamed
EVENT SOURCINGNEW WEAPON UNLOCKED
Performs left-folding of historical events
Produces projectionsviews into streams
Event selection
LEVEL 5 PROJECTIONS
Banner Projection
Click Urlschanged
Image Renamed
Image Created
Publishing UI Tags
PROJECTIONSNEW WEAPON UNLOCKED
Two way synchronization
Anti-corruption layer patters
LEVEL 6 STAYING IN SYNC
SYNC NEW TO OLD
Banner Event
Event Store Dispatcher
ACL Service
RabbitMQ
AdministrationDB
Reacts to domain events
Makes changes into AdsministrationDBwithin small transactions
Uses Dapper to simplify persistence
SYNC OLD TO NEW
Legacy event
ACL Service
RabbitMQReacts to legacy events (AdCreatedAdUpdated)
ACL transforms events into commands
Aggregates are updated
Banner Management
Service
Commands From old system
Events
TIP Make legacy integration interactions explicit
ANTI-CORRUPTION LAYERSNEW WEAPON UNLOCKED
LEVEL 7 API
This is the only way to interact with your system
Build UI on top of the API
Versioning is difficult ndash think if you really need it
EXPOSE COMMANDS AS RESOURCES
PUT httpImageBaneruuidName
Command RenameBanner
PUT httpImageBaneruuidFile
Command ReuploadFile
HYPERMEDIA ndash HELP YOUR CLIENT
GET httpImageBanneruuid
HTTP APINEW WEAPON UNLOCKED
LEVEL 8 UI amp UX
Excel is already invented itrsquos pretty damn good
UI must be built on top of your API
Guide user through business process
BEFORE
AFTER
TIP Build UI to solve business cases but not to edit data
TIP Exposing tasks can reduce overhead for users and for developers
TIP Build UI on top of the API
TASK BASED UINEW WEAPON UNLOCKED
LEVEL 9 TROUBLESHOOTING AND DEBUGGING
There is no F5 in distributed systems
Correlate all your requests and messages
Use centralized logging services
INSIDE THE RABBIT HOLE
REST API
Domain Service
ACL Service
ES Dispatcher
Service
Creative Upload
API
Creative Upload Service
Ad Analyzer Service
File Checker Service
File Generation
Service
Publishing Service
Preview Service
TRACK OPERATIONS
TIP Track every operation performance ndashthis helps to identify bottlenecks
TIP Automate load tests and run them often
CORRELATION IDSNEW ITEM UNLOCKED NIGHT VISION
YOU DONrsquoT NEED THEM ALL - CHOOSE WISELY
De-normalized read models
Strategic design
CQRS
Event sourcing
Projections
ACLs
REST API
Task based UI
Centralized logs
LOTS OF GUNS
BUT WHAT IFhellip
No guns for You
ADAPT TO BUSINESS THINKING
Avoid ndash technical arguments
Code quality is poor
We need to refactor
Technology is old
Everyone is using Angular nowhellip
Missing ldquobest practicesrdquo
We want to try NoSQLhellip
Prefer ndash economical arguments
Releases every day
Faster feature development
New products
Involve more developers
MS licenses are expensivehellip
DONrsquoT GET LOST IN A DUNGEON
Have a VISION
COMMIT
Define Your STRATEGY
Create TACTICS
FIGHT
ADOPT new tactics
Fight HARDER
WIN
ISSUES
Platform coupling
Model ambiguity
Growing learning curve
SCREW MUSHROOMS GIVE ME GUNS
LEVEL 1 ndash DE-NORMALIZED MODELS
Specifically designed for quering
Built asynchronously
Messages dispatched from legacy code
SALVATION WITH EVENTS
Send Message
DE-NORMALIZED MODEL
Project
Ad Deactivated
Ad Updated
Ad Created
OTHER POSSIBLE WAYS
SQL Server replicationsDepends on consumer count and your system load
Replicates the same relational structure
SQL Server Message BrokerQueue based message publishing
Custom data messages
Re-use write-model + cachingBe careful with excessive indexing ndash this might harm your writes
Cache rebuild and invalidation issues
READ MODELSNEW WEAPON UNLOCKED
MEET NEW ENEMIES (FRIENDS)
Eventual consistencyConsistency is a myth
Talk with your business people
Tradeoffs
Idempotency and orderingEvent versions
Read-model versions
What about 1 thread
DesynchronizationCreate sync tools
LEVEL 2 ndash SYNERGY BETWEEN SYSTEMS
Avoid adding new features into monolith
Avoid big-bang reworks
Use strategic design to handle complexity
REWORK = REFACTORING
Two systems side-by-side works together
Iterative functionality migration
In-syncOld System
New System
Sync
TIP Sometimes it is better to start over
TIP Having backup strategy keeps your blood pressure low
TIP Go live ASAP
SEPARATE INFRASTRUCTURE FROM BUSINESS LOGIC
TIP Identify infrastructure code and separate it
TIP Use different models for different tasks
STRATEGIC DESIGNNEW WEAPON UNLOCKED
LEVEL 3 WRITE MODEL DESIGN
Accepts commands only
Does not provide reading operations
Commands results into sequence of events
Events are immutable and persisted into EventStore
Commands RabbitMQ
Banner Management
Service
Event Store
Events
OR ANY OTHER ORM FRAMEWORK
Aggregates emit events
Aggregates are de-hydrated by replaying historical events
No settersgetters
Respect encapsulation
NO HIBERNATE
TIP Events and commands can be very natural constructs
TIP Excluding query operations can simplify code a lot
COMMANDS AND EVENTSNEW WEAPON UNLOCKED
LEVEL 4 EVENT STORE
Stores series of immutable events
There is no delete
Acts as ldquoEvent Logrdquo
Has built in projection engine
Is not designed for querying
BannerCreated BannerClickUrlsAdded BannerRenamed BannerRenamed
EVENT SOURCINGNEW WEAPON UNLOCKED
Performs left-folding of historical events
Produces projectionsviews into streams
Event selection
LEVEL 5 PROJECTIONS
Banner Projection
Click Urlschanged
Image Renamed
Image Created
Publishing UI Tags
PROJECTIONSNEW WEAPON UNLOCKED
Two way synchronization
Anti-corruption layer patters
LEVEL 6 STAYING IN SYNC
SYNC NEW TO OLD
Banner Event
Event Store Dispatcher
ACL Service
RabbitMQ
AdministrationDB
Reacts to domain events
Makes changes into AdsministrationDBwithin small transactions
Uses Dapper to simplify persistence
SYNC OLD TO NEW
Legacy event
ACL Service
RabbitMQReacts to legacy events (AdCreatedAdUpdated)
ACL transforms events into commands
Aggregates are updated
Banner Management
Service
Commands From old system
Events
TIP Make legacy integration interactions explicit
ANTI-CORRUPTION LAYERSNEW WEAPON UNLOCKED
LEVEL 7 API
This is the only way to interact with your system
Build UI on top of the API
Versioning is difficult ndash think if you really need it
EXPOSE COMMANDS AS RESOURCES
PUT httpImageBaneruuidName
Command RenameBanner
PUT httpImageBaneruuidFile
Command ReuploadFile
HYPERMEDIA ndash HELP YOUR CLIENT
GET httpImageBanneruuid
HTTP APINEW WEAPON UNLOCKED
LEVEL 8 UI amp UX
Excel is already invented itrsquos pretty damn good
UI must be built on top of your API
Guide user through business process
BEFORE
AFTER
TIP Build UI to solve business cases but not to edit data
TIP Exposing tasks can reduce overhead for users and for developers
TIP Build UI on top of the API
TASK BASED UINEW WEAPON UNLOCKED
LEVEL 9 TROUBLESHOOTING AND DEBUGGING
There is no F5 in distributed systems
Correlate all your requests and messages
Use centralized logging services
INSIDE THE RABBIT HOLE
REST API
Domain Service
ACL Service
ES Dispatcher
Service
Creative Upload
API
Creative Upload Service
Ad Analyzer Service
File Checker Service
File Generation
Service
Publishing Service
Preview Service
TRACK OPERATIONS
TIP Track every operation performance ndashthis helps to identify bottlenecks
TIP Automate load tests and run them often
CORRELATION IDSNEW ITEM UNLOCKED NIGHT VISION
YOU DONrsquoT NEED THEM ALL - CHOOSE WISELY
De-normalized read models
Strategic design
CQRS
Event sourcing
Projections
ACLs
REST API
Task based UI
Centralized logs
LOTS OF GUNS
BUT WHAT IFhellip
No guns for You
ADAPT TO BUSINESS THINKING
Avoid ndash technical arguments
Code quality is poor
We need to refactor
Technology is old
Everyone is using Angular nowhellip
Missing ldquobest practicesrdquo
We want to try NoSQLhellip
Prefer ndash economical arguments
Releases every day
Faster feature development
New products
Involve more developers
MS licenses are expensivehellip
DONrsquoT GET LOST IN A DUNGEON
Have a VISION
COMMIT
Define Your STRATEGY
Create TACTICS
FIGHT
ADOPT new tactics
Fight HARDER
WIN
SCREW MUSHROOMS GIVE ME GUNS
LEVEL 1 ndash DE-NORMALIZED MODELS
Specifically designed for quering
Built asynchronously
Messages dispatched from legacy code
SALVATION WITH EVENTS
Send Message
DE-NORMALIZED MODEL
Project
Ad Deactivated
Ad Updated
Ad Created
OTHER POSSIBLE WAYS
SQL Server replicationsDepends on consumer count and your system load
Replicates the same relational structure
SQL Server Message BrokerQueue based message publishing
Custom data messages
Re-use write-model + cachingBe careful with excessive indexing ndash this might harm your writes
Cache rebuild and invalidation issues
READ MODELSNEW WEAPON UNLOCKED
MEET NEW ENEMIES (FRIENDS)
Eventual consistencyConsistency is a myth
Talk with your business people
Tradeoffs
Idempotency and orderingEvent versions
Read-model versions
What about 1 thread
DesynchronizationCreate sync tools
LEVEL 2 ndash SYNERGY BETWEEN SYSTEMS
Avoid adding new features into monolith
Avoid big-bang reworks
Use strategic design to handle complexity
REWORK = REFACTORING
Two systems side-by-side works together
Iterative functionality migration
In-syncOld System
New System
Sync
TIP Sometimes it is better to start over
TIP Having backup strategy keeps your blood pressure low
TIP Go live ASAP
SEPARATE INFRASTRUCTURE FROM BUSINESS LOGIC
TIP Identify infrastructure code and separate it
TIP Use different models for different tasks
STRATEGIC DESIGNNEW WEAPON UNLOCKED
LEVEL 3 WRITE MODEL DESIGN
Accepts commands only
Does not provide reading operations
Commands results into sequence of events
Events are immutable and persisted into EventStore
Commands RabbitMQ
Banner Management
Service
Event Store
Events
OR ANY OTHER ORM FRAMEWORK
Aggregates emit events
Aggregates are de-hydrated by replaying historical events
No settersgetters
Respect encapsulation
NO HIBERNATE
TIP Events and commands can be very natural constructs
TIP Excluding query operations can simplify code a lot
COMMANDS AND EVENTSNEW WEAPON UNLOCKED
LEVEL 4 EVENT STORE
Stores series of immutable events
There is no delete
Acts as ldquoEvent Logrdquo
Has built in projection engine
Is not designed for querying
BannerCreated BannerClickUrlsAdded BannerRenamed BannerRenamed
EVENT SOURCINGNEW WEAPON UNLOCKED
Performs left-folding of historical events
Produces projectionsviews into streams
Event selection
LEVEL 5 PROJECTIONS
Banner Projection
Click Urlschanged
Image Renamed
Image Created
Publishing UI Tags
PROJECTIONSNEW WEAPON UNLOCKED
Two way synchronization
Anti-corruption layer patters
LEVEL 6 STAYING IN SYNC
SYNC NEW TO OLD
Banner Event
Event Store Dispatcher
ACL Service
RabbitMQ
AdministrationDB
Reacts to domain events
Makes changes into AdsministrationDBwithin small transactions
Uses Dapper to simplify persistence
SYNC OLD TO NEW
Legacy event
ACL Service
RabbitMQReacts to legacy events (AdCreatedAdUpdated)
ACL transforms events into commands
Aggregates are updated
Banner Management
Service
Commands From old system
Events
TIP Make legacy integration interactions explicit
ANTI-CORRUPTION LAYERSNEW WEAPON UNLOCKED
LEVEL 7 API
This is the only way to interact with your system
Build UI on top of the API
Versioning is difficult ndash think if you really need it
EXPOSE COMMANDS AS RESOURCES
PUT httpImageBaneruuidName
Command RenameBanner
PUT httpImageBaneruuidFile
Command ReuploadFile
HYPERMEDIA ndash HELP YOUR CLIENT
GET httpImageBanneruuid
HTTP APINEW WEAPON UNLOCKED
LEVEL 8 UI amp UX
Excel is already invented itrsquos pretty damn good
UI must be built on top of your API
Guide user through business process
BEFORE
AFTER
TIP Build UI to solve business cases but not to edit data
TIP Exposing tasks can reduce overhead for users and for developers
TIP Build UI on top of the API
TASK BASED UINEW WEAPON UNLOCKED
LEVEL 9 TROUBLESHOOTING AND DEBUGGING
There is no F5 in distributed systems
Correlate all your requests and messages
Use centralized logging services
INSIDE THE RABBIT HOLE
REST API
Domain Service
ACL Service
ES Dispatcher
Service
Creative Upload
API
Creative Upload Service
Ad Analyzer Service
File Checker Service
File Generation
Service
Publishing Service
Preview Service
TRACK OPERATIONS
TIP Track every operation performance ndashthis helps to identify bottlenecks
TIP Automate load tests and run them often
CORRELATION IDSNEW ITEM UNLOCKED NIGHT VISION
YOU DONrsquoT NEED THEM ALL - CHOOSE WISELY
De-normalized read models
Strategic design
CQRS
Event sourcing
Projections
ACLs
REST API
Task based UI
Centralized logs
LOTS OF GUNS
BUT WHAT IFhellip
No guns for You
ADAPT TO BUSINESS THINKING
Avoid ndash technical arguments
Code quality is poor
We need to refactor
Technology is old
Everyone is using Angular nowhellip
Missing ldquobest practicesrdquo
We want to try NoSQLhellip
Prefer ndash economical arguments
Releases every day
Faster feature development
New products
Involve more developers
MS licenses are expensivehellip
DONrsquoT GET LOST IN A DUNGEON
Have a VISION
COMMIT
Define Your STRATEGY
Create TACTICS
FIGHT
ADOPT new tactics
Fight HARDER
WIN
LEVEL 1 ndash DE-NORMALIZED MODELS
Specifically designed for quering
Built asynchronously
Messages dispatched from legacy code
SALVATION WITH EVENTS
Send Message
DE-NORMALIZED MODEL
Project
Ad Deactivated
Ad Updated
Ad Created
OTHER POSSIBLE WAYS
SQL Server replicationsDepends on consumer count and your system load
Replicates the same relational structure
SQL Server Message BrokerQueue based message publishing
Custom data messages
Re-use write-model + cachingBe careful with excessive indexing ndash this might harm your writes
Cache rebuild and invalidation issues
READ MODELSNEW WEAPON UNLOCKED
MEET NEW ENEMIES (FRIENDS)
Eventual consistencyConsistency is a myth
Talk with your business people
Tradeoffs
Idempotency and orderingEvent versions
Read-model versions
What about 1 thread
DesynchronizationCreate sync tools
LEVEL 2 ndash SYNERGY BETWEEN SYSTEMS
Avoid adding new features into monolith
Avoid big-bang reworks
Use strategic design to handle complexity
REWORK = REFACTORING
Two systems side-by-side works together
Iterative functionality migration
In-syncOld System
New System
Sync
TIP Sometimes it is better to start over
TIP Having backup strategy keeps your blood pressure low
TIP Go live ASAP
SEPARATE INFRASTRUCTURE FROM BUSINESS LOGIC
TIP Identify infrastructure code and separate it
TIP Use different models for different tasks
STRATEGIC DESIGNNEW WEAPON UNLOCKED
LEVEL 3 WRITE MODEL DESIGN
Accepts commands only
Does not provide reading operations
Commands results into sequence of events
Events are immutable and persisted into EventStore
Commands RabbitMQ
Banner Management
Service
Event Store
Events
OR ANY OTHER ORM FRAMEWORK
Aggregates emit events
Aggregates are de-hydrated by replaying historical events
No settersgetters
Respect encapsulation
NO HIBERNATE
TIP Events and commands can be very natural constructs
TIP Excluding query operations can simplify code a lot
COMMANDS AND EVENTSNEW WEAPON UNLOCKED
LEVEL 4 EVENT STORE
Stores series of immutable events
There is no delete
Acts as ldquoEvent Logrdquo
Has built in projection engine
Is not designed for querying
BannerCreated BannerClickUrlsAdded BannerRenamed BannerRenamed
EVENT SOURCINGNEW WEAPON UNLOCKED
Performs left-folding of historical events
Produces projectionsviews into streams
Event selection
LEVEL 5 PROJECTIONS
Banner Projection
Click Urlschanged
Image Renamed
Image Created
Publishing UI Tags
PROJECTIONSNEW WEAPON UNLOCKED
Two way synchronization
Anti-corruption layer patters
LEVEL 6 STAYING IN SYNC
SYNC NEW TO OLD
Banner Event
Event Store Dispatcher
ACL Service
RabbitMQ
AdministrationDB
Reacts to domain events
Makes changes into AdsministrationDBwithin small transactions
Uses Dapper to simplify persistence
SYNC OLD TO NEW
Legacy event
ACL Service
RabbitMQReacts to legacy events (AdCreatedAdUpdated)
ACL transforms events into commands
Aggregates are updated
Banner Management
Service
Commands From old system
Events
TIP Make legacy integration interactions explicit
ANTI-CORRUPTION LAYERSNEW WEAPON UNLOCKED
LEVEL 7 API
This is the only way to interact with your system
Build UI on top of the API
Versioning is difficult ndash think if you really need it
EXPOSE COMMANDS AS RESOURCES
PUT httpImageBaneruuidName
Command RenameBanner
PUT httpImageBaneruuidFile
Command ReuploadFile
HYPERMEDIA ndash HELP YOUR CLIENT
GET httpImageBanneruuid
HTTP APINEW WEAPON UNLOCKED
LEVEL 8 UI amp UX
Excel is already invented itrsquos pretty damn good
UI must be built on top of your API
Guide user through business process
BEFORE
AFTER
TIP Build UI to solve business cases but not to edit data
TIP Exposing tasks can reduce overhead for users and for developers
TIP Build UI on top of the API
TASK BASED UINEW WEAPON UNLOCKED
LEVEL 9 TROUBLESHOOTING AND DEBUGGING
There is no F5 in distributed systems
Correlate all your requests and messages
Use centralized logging services
INSIDE THE RABBIT HOLE
REST API
Domain Service
ACL Service
ES Dispatcher
Service
Creative Upload
API
Creative Upload Service
Ad Analyzer Service
File Checker Service
File Generation
Service
Publishing Service
Preview Service
TRACK OPERATIONS
TIP Track every operation performance ndashthis helps to identify bottlenecks
TIP Automate load tests and run them often
CORRELATION IDSNEW ITEM UNLOCKED NIGHT VISION
YOU DONrsquoT NEED THEM ALL - CHOOSE WISELY
De-normalized read models
Strategic design
CQRS
Event sourcing
Projections
ACLs
REST API
Task based UI
Centralized logs
LOTS OF GUNS
BUT WHAT IFhellip
No guns for You
ADAPT TO BUSINESS THINKING
Avoid ndash technical arguments
Code quality is poor
We need to refactor
Technology is old
Everyone is using Angular nowhellip
Missing ldquobest practicesrdquo
We want to try NoSQLhellip
Prefer ndash economical arguments
Releases every day
Faster feature development
New products
Involve more developers
MS licenses are expensivehellip
DONrsquoT GET LOST IN A DUNGEON
Have a VISION
COMMIT
Define Your STRATEGY
Create TACTICS
FIGHT
ADOPT new tactics
Fight HARDER
WIN
SALVATION WITH EVENTS
Send Message
DE-NORMALIZED MODEL
Project
Ad Deactivated
Ad Updated
Ad Created
OTHER POSSIBLE WAYS
SQL Server replicationsDepends on consumer count and your system load
Replicates the same relational structure
SQL Server Message BrokerQueue based message publishing
Custom data messages
Re-use write-model + cachingBe careful with excessive indexing ndash this might harm your writes
Cache rebuild and invalidation issues
READ MODELSNEW WEAPON UNLOCKED
MEET NEW ENEMIES (FRIENDS)
Eventual consistencyConsistency is a myth
Talk with your business people
Tradeoffs
Idempotency and orderingEvent versions
Read-model versions
What about 1 thread
DesynchronizationCreate sync tools
LEVEL 2 ndash SYNERGY BETWEEN SYSTEMS
Avoid adding new features into monolith
Avoid big-bang reworks
Use strategic design to handle complexity
REWORK = REFACTORING
Two systems side-by-side works together
Iterative functionality migration
In-syncOld System
New System
Sync
TIP Sometimes it is better to start over
TIP Having backup strategy keeps your blood pressure low
TIP Go live ASAP
SEPARATE INFRASTRUCTURE FROM BUSINESS LOGIC
TIP Identify infrastructure code and separate it
TIP Use different models for different tasks
STRATEGIC DESIGNNEW WEAPON UNLOCKED
LEVEL 3 WRITE MODEL DESIGN
Accepts commands only
Does not provide reading operations
Commands results into sequence of events
Events are immutable and persisted into EventStore
Commands RabbitMQ
Banner Management
Service
Event Store
Events
OR ANY OTHER ORM FRAMEWORK
Aggregates emit events
Aggregates are de-hydrated by replaying historical events
No settersgetters
Respect encapsulation
NO HIBERNATE
TIP Events and commands can be very natural constructs
TIP Excluding query operations can simplify code a lot
COMMANDS AND EVENTSNEW WEAPON UNLOCKED
LEVEL 4 EVENT STORE
Stores series of immutable events
There is no delete
Acts as ldquoEvent Logrdquo
Has built in projection engine
Is not designed for querying
BannerCreated BannerClickUrlsAdded BannerRenamed BannerRenamed
EVENT SOURCINGNEW WEAPON UNLOCKED
Performs left-folding of historical events
Produces projectionsviews into streams
Event selection
LEVEL 5 PROJECTIONS
Banner Projection
Click Urlschanged
Image Renamed
Image Created
Publishing UI Tags
PROJECTIONSNEW WEAPON UNLOCKED
Two way synchronization
Anti-corruption layer patters
LEVEL 6 STAYING IN SYNC
SYNC NEW TO OLD
Banner Event
Event Store Dispatcher
ACL Service
RabbitMQ
AdministrationDB
Reacts to domain events
Makes changes into AdsministrationDBwithin small transactions
Uses Dapper to simplify persistence
SYNC OLD TO NEW
Legacy event
ACL Service
RabbitMQReacts to legacy events (AdCreatedAdUpdated)
ACL transforms events into commands
Aggregates are updated
Banner Management
Service
Commands From old system
Events
TIP Make legacy integration interactions explicit
ANTI-CORRUPTION LAYERSNEW WEAPON UNLOCKED
LEVEL 7 API
This is the only way to interact with your system
Build UI on top of the API
Versioning is difficult ndash think if you really need it
EXPOSE COMMANDS AS RESOURCES
PUT httpImageBaneruuidName
Command RenameBanner
PUT httpImageBaneruuidFile
Command ReuploadFile
HYPERMEDIA ndash HELP YOUR CLIENT
GET httpImageBanneruuid
HTTP APINEW WEAPON UNLOCKED
LEVEL 8 UI amp UX
Excel is already invented itrsquos pretty damn good
UI must be built on top of your API
Guide user through business process
BEFORE
AFTER
TIP Build UI to solve business cases but not to edit data
TIP Exposing tasks can reduce overhead for users and for developers
TIP Build UI on top of the API
TASK BASED UINEW WEAPON UNLOCKED
LEVEL 9 TROUBLESHOOTING AND DEBUGGING
There is no F5 in distributed systems
Correlate all your requests and messages
Use centralized logging services
INSIDE THE RABBIT HOLE
REST API
Domain Service
ACL Service
ES Dispatcher
Service
Creative Upload
API
Creative Upload Service
Ad Analyzer Service
File Checker Service
File Generation
Service
Publishing Service
Preview Service
TRACK OPERATIONS
TIP Track every operation performance ndashthis helps to identify bottlenecks
TIP Automate load tests and run them often
CORRELATION IDSNEW ITEM UNLOCKED NIGHT VISION
YOU DONrsquoT NEED THEM ALL - CHOOSE WISELY
De-normalized read models
Strategic design
CQRS
Event sourcing
Projections
ACLs
REST API
Task based UI
Centralized logs
LOTS OF GUNS
BUT WHAT IFhellip
No guns for You
ADAPT TO BUSINESS THINKING
Avoid ndash technical arguments
Code quality is poor
We need to refactor
Technology is old
Everyone is using Angular nowhellip
Missing ldquobest practicesrdquo
We want to try NoSQLhellip
Prefer ndash economical arguments
Releases every day
Faster feature development
New products
Involve more developers
MS licenses are expensivehellip
DONrsquoT GET LOST IN A DUNGEON
Have a VISION
COMMIT
Define Your STRATEGY
Create TACTICS
FIGHT
ADOPT new tactics
Fight HARDER
WIN
DE-NORMALIZED MODEL
Project
Ad Deactivated
Ad Updated
Ad Created
OTHER POSSIBLE WAYS
SQL Server replicationsDepends on consumer count and your system load
Replicates the same relational structure
SQL Server Message BrokerQueue based message publishing
Custom data messages
Re-use write-model + cachingBe careful with excessive indexing ndash this might harm your writes
Cache rebuild and invalidation issues
READ MODELSNEW WEAPON UNLOCKED
MEET NEW ENEMIES (FRIENDS)
Eventual consistencyConsistency is a myth
Talk with your business people
Tradeoffs
Idempotency and orderingEvent versions
Read-model versions
What about 1 thread
DesynchronizationCreate sync tools
LEVEL 2 ndash SYNERGY BETWEEN SYSTEMS
Avoid adding new features into monolith
Avoid big-bang reworks
Use strategic design to handle complexity
REWORK = REFACTORING
Two systems side-by-side works together
Iterative functionality migration
In-syncOld System
New System
Sync
TIP Sometimes it is better to start over
TIP Having backup strategy keeps your blood pressure low
TIP Go live ASAP
SEPARATE INFRASTRUCTURE FROM BUSINESS LOGIC
TIP Identify infrastructure code and separate it
TIP Use different models for different tasks
STRATEGIC DESIGNNEW WEAPON UNLOCKED
LEVEL 3 WRITE MODEL DESIGN
Accepts commands only
Does not provide reading operations
Commands results into sequence of events
Events are immutable and persisted into EventStore
Commands RabbitMQ
Banner Management
Service
Event Store
Events
OR ANY OTHER ORM FRAMEWORK
Aggregates emit events
Aggregates are de-hydrated by replaying historical events
No settersgetters
Respect encapsulation
NO HIBERNATE
TIP Events and commands can be very natural constructs
TIP Excluding query operations can simplify code a lot
COMMANDS AND EVENTSNEW WEAPON UNLOCKED
LEVEL 4 EVENT STORE
Stores series of immutable events
There is no delete
Acts as ldquoEvent Logrdquo
Has built in projection engine
Is not designed for querying
BannerCreated BannerClickUrlsAdded BannerRenamed BannerRenamed
EVENT SOURCINGNEW WEAPON UNLOCKED
Performs left-folding of historical events
Produces projectionsviews into streams
Event selection
LEVEL 5 PROJECTIONS
Banner Projection
Click Urlschanged
Image Renamed
Image Created
Publishing UI Tags
PROJECTIONSNEW WEAPON UNLOCKED
Two way synchronization
Anti-corruption layer patters
LEVEL 6 STAYING IN SYNC
SYNC NEW TO OLD
Banner Event
Event Store Dispatcher
ACL Service
RabbitMQ
AdministrationDB
Reacts to domain events
Makes changes into AdsministrationDBwithin small transactions
Uses Dapper to simplify persistence
SYNC OLD TO NEW
Legacy event
ACL Service
RabbitMQReacts to legacy events (AdCreatedAdUpdated)
ACL transforms events into commands
Aggregates are updated
Banner Management
Service
Commands From old system
Events
TIP Make legacy integration interactions explicit
ANTI-CORRUPTION LAYERSNEW WEAPON UNLOCKED
LEVEL 7 API
This is the only way to interact with your system
Build UI on top of the API
Versioning is difficult ndash think if you really need it
EXPOSE COMMANDS AS RESOURCES
PUT httpImageBaneruuidName
Command RenameBanner
PUT httpImageBaneruuidFile
Command ReuploadFile
HYPERMEDIA ndash HELP YOUR CLIENT
GET httpImageBanneruuid
HTTP APINEW WEAPON UNLOCKED
LEVEL 8 UI amp UX
Excel is already invented itrsquos pretty damn good
UI must be built on top of your API
Guide user through business process
BEFORE
AFTER
TIP Build UI to solve business cases but not to edit data
TIP Exposing tasks can reduce overhead for users and for developers
TIP Build UI on top of the API
TASK BASED UINEW WEAPON UNLOCKED
LEVEL 9 TROUBLESHOOTING AND DEBUGGING
There is no F5 in distributed systems
Correlate all your requests and messages
Use centralized logging services
INSIDE THE RABBIT HOLE
REST API
Domain Service
ACL Service
ES Dispatcher
Service
Creative Upload
API
Creative Upload Service
Ad Analyzer Service
File Checker Service
File Generation
Service
Publishing Service
Preview Service
TRACK OPERATIONS
TIP Track every operation performance ndashthis helps to identify bottlenecks
TIP Automate load tests and run them often
CORRELATION IDSNEW ITEM UNLOCKED NIGHT VISION
YOU DONrsquoT NEED THEM ALL - CHOOSE WISELY
De-normalized read models
Strategic design
CQRS
Event sourcing
Projections
ACLs
REST API
Task based UI
Centralized logs
LOTS OF GUNS
BUT WHAT IFhellip
No guns for You
ADAPT TO BUSINESS THINKING
Avoid ndash technical arguments
Code quality is poor
We need to refactor
Technology is old
Everyone is using Angular nowhellip
Missing ldquobest practicesrdquo
We want to try NoSQLhellip
Prefer ndash economical arguments
Releases every day
Faster feature development
New products
Involve more developers
MS licenses are expensivehellip
DONrsquoT GET LOST IN A DUNGEON
Have a VISION
COMMIT
Define Your STRATEGY
Create TACTICS
FIGHT
ADOPT new tactics
Fight HARDER
WIN
OTHER POSSIBLE WAYS
SQL Server replicationsDepends on consumer count and your system load
Replicates the same relational structure
SQL Server Message BrokerQueue based message publishing
Custom data messages
Re-use write-model + cachingBe careful with excessive indexing ndash this might harm your writes
Cache rebuild and invalidation issues
READ MODELSNEW WEAPON UNLOCKED
MEET NEW ENEMIES (FRIENDS)
Eventual consistencyConsistency is a myth
Talk with your business people
Tradeoffs
Idempotency and orderingEvent versions
Read-model versions
What about 1 thread
DesynchronizationCreate sync tools
LEVEL 2 ndash SYNERGY BETWEEN SYSTEMS
Avoid adding new features into monolith
Avoid big-bang reworks
Use strategic design to handle complexity
REWORK = REFACTORING
Two systems side-by-side works together
Iterative functionality migration
In-syncOld System
New System
Sync
TIP Sometimes it is better to start over
TIP Having backup strategy keeps your blood pressure low
TIP Go live ASAP
SEPARATE INFRASTRUCTURE FROM BUSINESS LOGIC
TIP Identify infrastructure code and separate it
TIP Use different models for different tasks
STRATEGIC DESIGNNEW WEAPON UNLOCKED
LEVEL 3 WRITE MODEL DESIGN
Accepts commands only
Does not provide reading operations
Commands results into sequence of events
Events are immutable and persisted into EventStore
Commands RabbitMQ
Banner Management
Service
Event Store
Events
OR ANY OTHER ORM FRAMEWORK
Aggregates emit events
Aggregates are de-hydrated by replaying historical events
No settersgetters
Respect encapsulation
NO HIBERNATE
TIP Events and commands can be very natural constructs
TIP Excluding query operations can simplify code a lot
COMMANDS AND EVENTSNEW WEAPON UNLOCKED
LEVEL 4 EVENT STORE
Stores series of immutable events
There is no delete
Acts as ldquoEvent Logrdquo
Has built in projection engine
Is not designed for querying
BannerCreated BannerClickUrlsAdded BannerRenamed BannerRenamed
EVENT SOURCINGNEW WEAPON UNLOCKED
Performs left-folding of historical events
Produces projectionsviews into streams
Event selection
LEVEL 5 PROJECTIONS
Banner Projection
Click Urlschanged
Image Renamed
Image Created
Publishing UI Tags
PROJECTIONSNEW WEAPON UNLOCKED
Two way synchronization
Anti-corruption layer patters
LEVEL 6 STAYING IN SYNC
SYNC NEW TO OLD
Banner Event
Event Store Dispatcher
ACL Service
RabbitMQ
AdministrationDB
Reacts to domain events
Makes changes into AdsministrationDBwithin small transactions
Uses Dapper to simplify persistence
SYNC OLD TO NEW
Legacy event
ACL Service
RabbitMQReacts to legacy events (AdCreatedAdUpdated)
ACL transforms events into commands
Aggregates are updated
Banner Management
Service
Commands From old system
Events
TIP Make legacy integration interactions explicit
ANTI-CORRUPTION LAYERSNEW WEAPON UNLOCKED
LEVEL 7 API
This is the only way to interact with your system
Build UI on top of the API
Versioning is difficult ndash think if you really need it
EXPOSE COMMANDS AS RESOURCES
PUT httpImageBaneruuidName
Command RenameBanner
PUT httpImageBaneruuidFile
Command ReuploadFile
HYPERMEDIA ndash HELP YOUR CLIENT
GET httpImageBanneruuid
HTTP APINEW WEAPON UNLOCKED
LEVEL 8 UI amp UX
Excel is already invented itrsquos pretty damn good
UI must be built on top of your API
Guide user through business process
BEFORE
AFTER
TIP Build UI to solve business cases but not to edit data
TIP Exposing tasks can reduce overhead for users and for developers
TIP Build UI on top of the API
TASK BASED UINEW WEAPON UNLOCKED
LEVEL 9 TROUBLESHOOTING AND DEBUGGING
There is no F5 in distributed systems
Correlate all your requests and messages
Use centralized logging services
INSIDE THE RABBIT HOLE
REST API
Domain Service
ACL Service
ES Dispatcher
Service
Creative Upload
API
Creative Upload Service
Ad Analyzer Service
File Checker Service
File Generation
Service
Publishing Service
Preview Service
TRACK OPERATIONS
TIP Track every operation performance ndashthis helps to identify bottlenecks
TIP Automate load tests and run them often
CORRELATION IDSNEW ITEM UNLOCKED NIGHT VISION
YOU DONrsquoT NEED THEM ALL - CHOOSE WISELY
De-normalized read models
Strategic design
CQRS
Event sourcing
Projections
ACLs
REST API
Task based UI
Centralized logs
LOTS OF GUNS
BUT WHAT IFhellip
No guns for You
ADAPT TO BUSINESS THINKING
Avoid ndash technical arguments
Code quality is poor
We need to refactor
Technology is old
Everyone is using Angular nowhellip
Missing ldquobest practicesrdquo
We want to try NoSQLhellip
Prefer ndash economical arguments
Releases every day
Faster feature development
New products
Involve more developers
MS licenses are expensivehellip
DONrsquoT GET LOST IN A DUNGEON
Have a VISION
COMMIT
Define Your STRATEGY
Create TACTICS
FIGHT
ADOPT new tactics
Fight HARDER
WIN
READ MODELSNEW WEAPON UNLOCKED
MEET NEW ENEMIES (FRIENDS)
Eventual consistencyConsistency is a myth
Talk with your business people
Tradeoffs
Idempotency and orderingEvent versions
Read-model versions
What about 1 thread
DesynchronizationCreate sync tools
LEVEL 2 ndash SYNERGY BETWEEN SYSTEMS
Avoid adding new features into monolith
Avoid big-bang reworks
Use strategic design to handle complexity
REWORK = REFACTORING
Two systems side-by-side works together
Iterative functionality migration
In-syncOld System
New System
Sync
TIP Sometimes it is better to start over
TIP Having backup strategy keeps your blood pressure low
TIP Go live ASAP
SEPARATE INFRASTRUCTURE FROM BUSINESS LOGIC
TIP Identify infrastructure code and separate it
TIP Use different models for different tasks
STRATEGIC DESIGNNEW WEAPON UNLOCKED
LEVEL 3 WRITE MODEL DESIGN
Accepts commands only
Does not provide reading operations
Commands results into sequence of events
Events are immutable and persisted into EventStore
Commands RabbitMQ
Banner Management
Service
Event Store
Events
OR ANY OTHER ORM FRAMEWORK
Aggregates emit events
Aggregates are de-hydrated by replaying historical events
No settersgetters
Respect encapsulation
NO HIBERNATE
TIP Events and commands can be very natural constructs
TIP Excluding query operations can simplify code a lot
COMMANDS AND EVENTSNEW WEAPON UNLOCKED
LEVEL 4 EVENT STORE
Stores series of immutable events
There is no delete
Acts as ldquoEvent Logrdquo
Has built in projection engine
Is not designed for querying
BannerCreated BannerClickUrlsAdded BannerRenamed BannerRenamed
EVENT SOURCINGNEW WEAPON UNLOCKED
Performs left-folding of historical events
Produces projectionsviews into streams
Event selection
LEVEL 5 PROJECTIONS
Banner Projection
Click Urlschanged
Image Renamed
Image Created
Publishing UI Tags
PROJECTIONSNEW WEAPON UNLOCKED
Two way synchronization
Anti-corruption layer patters
LEVEL 6 STAYING IN SYNC
SYNC NEW TO OLD
Banner Event
Event Store Dispatcher
ACL Service
RabbitMQ
AdministrationDB
Reacts to domain events
Makes changes into AdsministrationDBwithin small transactions
Uses Dapper to simplify persistence
SYNC OLD TO NEW
Legacy event
ACL Service
RabbitMQReacts to legacy events (AdCreatedAdUpdated)
ACL transforms events into commands
Aggregates are updated
Banner Management
Service
Commands From old system
Events
TIP Make legacy integration interactions explicit
ANTI-CORRUPTION LAYERSNEW WEAPON UNLOCKED
LEVEL 7 API
This is the only way to interact with your system
Build UI on top of the API
Versioning is difficult ndash think if you really need it
EXPOSE COMMANDS AS RESOURCES
PUT httpImageBaneruuidName
Command RenameBanner
PUT httpImageBaneruuidFile
Command ReuploadFile
HYPERMEDIA ndash HELP YOUR CLIENT
GET httpImageBanneruuid
HTTP APINEW WEAPON UNLOCKED
LEVEL 8 UI amp UX
Excel is already invented itrsquos pretty damn good
UI must be built on top of your API
Guide user through business process
BEFORE
AFTER
TIP Build UI to solve business cases but not to edit data
TIP Exposing tasks can reduce overhead for users and for developers
TIP Build UI on top of the API
TASK BASED UINEW WEAPON UNLOCKED
LEVEL 9 TROUBLESHOOTING AND DEBUGGING
There is no F5 in distributed systems
Correlate all your requests and messages
Use centralized logging services
INSIDE THE RABBIT HOLE
REST API
Domain Service
ACL Service
ES Dispatcher
Service
Creative Upload
API
Creative Upload Service
Ad Analyzer Service
File Checker Service
File Generation
Service
Publishing Service
Preview Service
TRACK OPERATIONS
TIP Track every operation performance ndashthis helps to identify bottlenecks
TIP Automate load tests and run them often
CORRELATION IDSNEW ITEM UNLOCKED NIGHT VISION
YOU DONrsquoT NEED THEM ALL - CHOOSE WISELY
De-normalized read models
Strategic design
CQRS
Event sourcing
Projections
ACLs
REST API
Task based UI
Centralized logs
LOTS OF GUNS
BUT WHAT IFhellip
No guns for You
ADAPT TO BUSINESS THINKING
Avoid ndash technical arguments
Code quality is poor
We need to refactor
Technology is old
Everyone is using Angular nowhellip
Missing ldquobest practicesrdquo
We want to try NoSQLhellip
Prefer ndash economical arguments
Releases every day
Faster feature development
New products
Involve more developers
MS licenses are expensivehellip
DONrsquoT GET LOST IN A DUNGEON
Have a VISION
COMMIT
Define Your STRATEGY
Create TACTICS
FIGHT
ADOPT new tactics
Fight HARDER
WIN
MEET NEW ENEMIES (FRIENDS)
Eventual consistencyConsistency is a myth
Talk with your business people
Tradeoffs
Idempotency and orderingEvent versions
Read-model versions
What about 1 thread
DesynchronizationCreate sync tools
LEVEL 2 ndash SYNERGY BETWEEN SYSTEMS
Avoid adding new features into monolith
Avoid big-bang reworks
Use strategic design to handle complexity
REWORK = REFACTORING
Two systems side-by-side works together
Iterative functionality migration
In-syncOld System
New System
Sync
TIP Sometimes it is better to start over
TIP Having backup strategy keeps your blood pressure low
TIP Go live ASAP
SEPARATE INFRASTRUCTURE FROM BUSINESS LOGIC
TIP Identify infrastructure code and separate it
TIP Use different models for different tasks
STRATEGIC DESIGNNEW WEAPON UNLOCKED
LEVEL 3 WRITE MODEL DESIGN
Accepts commands only
Does not provide reading operations
Commands results into sequence of events
Events are immutable and persisted into EventStore
Commands RabbitMQ
Banner Management
Service
Event Store
Events
OR ANY OTHER ORM FRAMEWORK
Aggregates emit events
Aggregates are de-hydrated by replaying historical events
No settersgetters
Respect encapsulation
NO HIBERNATE
TIP Events and commands can be very natural constructs
TIP Excluding query operations can simplify code a lot
COMMANDS AND EVENTSNEW WEAPON UNLOCKED
LEVEL 4 EVENT STORE
Stores series of immutable events
There is no delete
Acts as ldquoEvent Logrdquo
Has built in projection engine
Is not designed for querying
BannerCreated BannerClickUrlsAdded BannerRenamed BannerRenamed
EVENT SOURCINGNEW WEAPON UNLOCKED
Performs left-folding of historical events
Produces projectionsviews into streams
Event selection
LEVEL 5 PROJECTIONS
Banner Projection
Click Urlschanged
Image Renamed
Image Created
Publishing UI Tags
PROJECTIONSNEW WEAPON UNLOCKED
Two way synchronization
Anti-corruption layer patters
LEVEL 6 STAYING IN SYNC
SYNC NEW TO OLD
Banner Event
Event Store Dispatcher
ACL Service
RabbitMQ
AdministrationDB
Reacts to domain events
Makes changes into AdsministrationDBwithin small transactions
Uses Dapper to simplify persistence
SYNC OLD TO NEW
Legacy event
ACL Service
RabbitMQReacts to legacy events (AdCreatedAdUpdated)
ACL transforms events into commands
Aggregates are updated
Banner Management
Service
Commands From old system
Events
TIP Make legacy integration interactions explicit
ANTI-CORRUPTION LAYERSNEW WEAPON UNLOCKED
LEVEL 7 API
This is the only way to interact with your system
Build UI on top of the API
Versioning is difficult ndash think if you really need it
EXPOSE COMMANDS AS RESOURCES
PUT httpImageBaneruuidName
Command RenameBanner
PUT httpImageBaneruuidFile
Command ReuploadFile
HYPERMEDIA ndash HELP YOUR CLIENT
GET httpImageBanneruuid
HTTP APINEW WEAPON UNLOCKED
LEVEL 8 UI amp UX
Excel is already invented itrsquos pretty damn good
UI must be built on top of your API
Guide user through business process
BEFORE
AFTER
TIP Build UI to solve business cases but not to edit data
TIP Exposing tasks can reduce overhead for users and for developers
TIP Build UI on top of the API
TASK BASED UINEW WEAPON UNLOCKED
LEVEL 9 TROUBLESHOOTING AND DEBUGGING
There is no F5 in distributed systems
Correlate all your requests and messages
Use centralized logging services
INSIDE THE RABBIT HOLE
REST API
Domain Service
ACL Service
ES Dispatcher
Service
Creative Upload
API
Creative Upload Service
Ad Analyzer Service
File Checker Service
File Generation
Service
Publishing Service
Preview Service
TRACK OPERATIONS
TIP Track every operation performance ndashthis helps to identify bottlenecks
TIP Automate load tests and run them often
CORRELATION IDSNEW ITEM UNLOCKED NIGHT VISION
YOU DONrsquoT NEED THEM ALL - CHOOSE WISELY
De-normalized read models
Strategic design
CQRS
Event sourcing
Projections
ACLs
REST API
Task based UI
Centralized logs
LOTS OF GUNS
BUT WHAT IFhellip
No guns for You
ADAPT TO BUSINESS THINKING
Avoid ndash technical arguments
Code quality is poor
We need to refactor
Technology is old
Everyone is using Angular nowhellip
Missing ldquobest practicesrdquo
We want to try NoSQLhellip
Prefer ndash economical arguments
Releases every day
Faster feature development
New products
Involve more developers
MS licenses are expensivehellip
DONrsquoT GET LOST IN A DUNGEON
Have a VISION
COMMIT
Define Your STRATEGY
Create TACTICS
FIGHT
ADOPT new tactics
Fight HARDER
WIN
LEVEL 2 ndash SYNERGY BETWEEN SYSTEMS
Avoid adding new features into monolith
Avoid big-bang reworks
Use strategic design to handle complexity
REWORK = REFACTORING
Two systems side-by-side works together
Iterative functionality migration
In-syncOld System
New System
Sync
TIP Sometimes it is better to start over
TIP Having backup strategy keeps your blood pressure low
TIP Go live ASAP
SEPARATE INFRASTRUCTURE FROM BUSINESS LOGIC
TIP Identify infrastructure code and separate it
TIP Use different models for different tasks
STRATEGIC DESIGNNEW WEAPON UNLOCKED
LEVEL 3 WRITE MODEL DESIGN
Accepts commands only
Does not provide reading operations
Commands results into sequence of events
Events are immutable and persisted into EventStore
Commands RabbitMQ
Banner Management
Service
Event Store
Events
OR ANY OTHER ORM FRAMEWORK
Aggregates emit events
Aggregates are de-hydrated by replaying historical events
No settersgetters
Respect encapsulation
NO HIBERNATE
TIP Events and commands can be very natural constructs
TIP Excluding query operations can simplify code a lot
COMMANDS AND EVENTSNEW WEAPON UNLOCKED
LEVEL 4 EVENT STORE
Stores series of immutable events
There is no delete
Acts as ldquoEvent Logrdquo
Has built in projection engine
Is not designed for querying
BannerCreated BannerClickUrlsAdded BannerRenamed BannerRenamed
EVENT SOURCINGNEW WEAPON UNLOCKED
Performs left-folding of historical events
Produces projectionsviews into streams
Event selection
LEVEL 5 PROJECTIONS
Banner Projection
Click Urlschanged
Image Renamed
Image Created
Publishing UI Tags
PROJECTIONSNEW WEAPON UNLOCKED
Two way synchronization
Anti-corruption layer patters
LEVEL 6 STAYING IN SYNC
SYNC NEW TO OLD
Banner Event
Event Store Dispatcher
ACL Service
RabbitMQ
AdministrationDB
Reacts to domain events
Makes changes into AdsministrationDBwithin small transactions
Uses Dapper to simplify persistence
SYNC OLD TO NEW
Legacy event
ACL Service
RabbitMQReacts to legacy events (AdCreatedAdUpdated)
ACL transforms events into commands
Aggregates are updated
Banner Management
Service
Commands From old system
Events
TIP Make legacy integration interactions explicit
ANTI-CORRUPTION LAYERSNEW WEAPON UNLOCKED
LEVEL 7 API
This is the only way to interact with your system
Build UI on top of the API
Versioning is difficult ndash think if you really need it
EXPOSE COMMANDS AS RESOURCES
PUT httpImageBaneruuidName
Command RenameBanner
PUT httpImageBaneruuidFile
Command ReuploadFile
HYPERMEDIA ndash HELP YOUR CLIENT
GET httpImageBanneruuid
HTTP APINEW WEAPON UNLOCKED
LEVEL 8 UI amp UX
Excel is already invented itrsquos pretty damn good
UI must be built on top of your API
Guide user through business process
BEFORE
AFTER
TIP Build UI to solve business cases but not to edit data
TIP Exposing tasks can reduce overhead for users and for developers
TIP Build UI on top of the API
TASK BASED UINEW WEAPON UNLOCKED
LEVEL 9 TROUBLESHOOTING AND DEBUGGING
There is no F5 in distributed systems
Correlate all your requests and messages
Use centralized logging services
INSIDE THE RABBIT HOLE
REST API
Domain Service
ACL Service
ES Dispatcher
Service
Creative Upload
API
Creative Upload Service
Ad Analyzer Service
File Checker Service
File Generation
Service
Publishing Service
Preview Service
TRACK OPERATIONS
TIP Track every operation performance ndashthis helps to identify bottlenecks
TIP Automate load tests and run them often
CORRELATION IDSNEW ITEM UNLOCKED NIGHT VISION
YOU DONrsquoT NEED THEM ALL - CHOOSE WISELY
De-normalized read models
Strategic design
CQRS
Event sourcing
Projections
ACLs
REST API
Task based UI
Centralized logs
LOTS OF GUNS
BUT WHAT IFhellip
No guns for You
ADAPT TO BUSINESS THINKING
Avoid ndash technical arguments
Code quality is poor
We need to refactor
Technology is old
Everyone is using Angular nowhellip
Missing ldquobest practicesrdquo
We want to try NoSQLhellip
Prefer ndash economical arguments
Releases every day
Faster feature development
New products
Involve more developers
MS licenses are expensivehellip
DONrsquoT GET LOST IN A DUNGEON
Have a VISION
COMMIT
Define Your STRATEGY
Create TACTICS
FIGHT
ADOPT new tactics
Fight HARDER
WIN
REWORK = REFACTORING
Two systems side-by-side works together
Iterative functionality migration
In-syncOld System
New System
Sync
TIP Sometimes it is better to start over
TIP Having backup strategy keeps your blood pressure low
TIP Go live ASAP
SEPARATE INFRASTRUCTURE FROM BUSINESS LOGIC
TIP Identify infrastructure code and separate it
TIP Use different models for different tasks
STRATEGIC DESIGNNEW WEAPON UNLOCKED
LEVEL 3 WRITE MODEL DESIGN
Accepts commands only
Does not provide reading operations
Commands results into sequence of events
Events are immutable and persisted into EventStore
Commands RabbitMQ
Banner Management
Service
Event Store
Events
OR ANY OTHER ORM FRAMEWORK
Aggregates emit events
Aggregates are de-hydrated by replaying historical events
No settersgetters
Respect encapsulation
NO HIBERNATE
TIP Events and commands can be very natural constructs
TIP Excluding query operations can simplify code a lot
COMMANDS AND EVENTSNEW WEAPON UNLOCKED
LEVEL 4 EVENT STORE
Stores series of immutable events
There is no delete
Acts as ldquoEvent Logrdquo
Has built in projection engine
Is not designed for querying
BannerCreated BannerClickUrlsAdded BannerRenamed BannerRenamed
EVENT SOURCINGNEW WEAPON UNLOCKED
Performs left-folding of historical events
Produces projectionsviews into streams
Event selection
LEVEL 5 PROJECTIONS
Banner Projection
Click Urlschanged
Image Renamed
Image Created
Publishing UI Tags
PROJECTIONSNEW WEAPON UNLOCKED
Two way synchronization
Anti-corruption layer patters
LEVEL 6 STAYING IN SYNC
SYNC NEW TO OLD
Banner Event
Event Store Dispatcher
ACL Service
RabbitMQ
AdministrationDB
Reacts to domain events
Makes changes into AdsministrationDBwithin small transactions
Uses Dapper to simplify persistence
SYNC OLD TO NEW
Legacy event
ACL Service
RabbitMQReacts to legacy events (AdCreatedAdUpdated)
ACL transforms events into commands
Aggregates are updated
Banner Management
Service
Commands From old system
Events
TIP Make legacy integration interactions explicit
ANTI-CORRUPTION LAYERSNEW WEAPON UNLOCKED
LEVEL 7 API
This is the only way to interact with your system
Build UI on top of the API
Versioning is difficult ndash think if you really need it
EXPOSE COMMANDS AS RESOURCES
PUT httpImageBaneruuidName
Command RenameBanner
PUT httpImageBaneruuidFile
Command ReuploadFile
HYPERMEDIA ndash HELP YOUR CLIENT
GET httpImageBanneruuid
HTTP APINEW WEAPON UNLOCKED
LEVEL 8 UI amp UX
Excel is already invented itrsquos pretty damn good
UI must be built on top of your API
Guide user through business process
BEFORE
AFTER
TIP Build UI to solve business cases but not to edit data
TIP Exposing tasks can reduce overhead for users and for developers
TIP Build UI on top of the API
TASK BASED UINEW WEAPON UNLOCKED
LEVEL 9 TROUBLESHOOTING AND DEBUGGING
There is no F5 in distributed systems
Correlate all your requests and messages
Use centralized logging services
INSIDE THE RABBIT HOLE
REST API
Domain Service
ACL Service
ES Dispatcher
Service
Creative Upload
API
Creative Upload Service
Ad Analyzer Service
File Checker Service
File Generation
Service
Publishing Service
Preview Service
TRACK OPERATIONS
TIP Track every operation performance ndashthis helps to identify bottlenecks
TIP Automate load tests and run them often
CORRELATION IDSNEW ITEM UNLOCKED NIGHT VISION
YOU DONrsquoT NEED THEM ALL - CHOOSE WISELY
De-normalized read models
Strategic design
CQRS
Event sourcing
Projections
ACLs
REST API
Task based UI
Centralized logs
LOTS OF GUNS
BUT WHAT IFhellip
No guns for You
ADAPT TO BUSINESS THINKING
Avoid ndash technical arguments
Code quality is poor
We need to refactor
Technology is old
Everyone is using Angular nowhellip
Missing ldquobest practicesrdquo
We want to try NoSQLhellip
Prefer ndash economical arguments
Releases every day
Faster feature development
New products
Involve more developers
MS licenses are expensivehellip
DONrsquoT GET LOST IN A DUNGEON
Have a VISION
COMMIT
Define Your STRATEGY
Create TACTICS
FIGHT
ADOPT new tactics
Fight HARDER
WIN
TIP Sometimes it is better to start over
TIP Having backup strategy keeps your blood pressure low
TIP Go live ASAP
SEPARATE INFRASTRUCTURE FROM BUSINESS LOGIC
TIP Identify infrastructure code and separate it
TIP Use different models for different tasks
STRATEGIC DESIGNNEW WEAPON UNLOCKED
LEVEL 3 WRITE MODEL DESIGN
Accepts commands only
Does not provide reading operations
Commands results into sequence of events
Events are immutable and persisted into EventStore
Commands RabbitMQ
Banner Management
Service
Event Store
Events
OR ANY OTHER ORM FRAMEWORK
Aggregates emit events
Aggregates are de-hydrated by replaying historical events
No settersgetters
Respect encapsulation
NO HIBERNATE
TIP Events and commands can be very natural constructs
TIP Excluding query operations can simplify code a lot
COMMANDS AND EVENTSNEW WEAPON UNLOCKED
LEVEL 4 EVENT STORE
Stores series of immutable events
There is no delete
Acts as ldquoEvent Logrdquo
Has built in projection engine
Is not designed for querying
BannerCreated BannerClickUrlsAdded BannerRenamed BannerRenamed
EVENT SOURCINGNEW WEAPON UNLOCKED
Performs left-folding of historical events
Produces projectionsviews into streams
Event selection
LEVEL 5 PROJECTIONS
Banner Projection
Click Urlschanged
Image Renamed
Image Created
Publishing UI Tags
PROJECTIONSNEW WEAPON UNLOCKED
Two way synchronization
Anti-corruption layer patters
LEVEL 6 STAYING IN SYNC
SYNC NEW TO OLD
Banner Event
Event Store Dispatcher
ACL Service
RabbitMQ
AdministrationDB
Reacts to domain events
Makes changes into AdsministrationDBwithin small transactions
Uses Dapper to simplify persistence
SYNC OLD TO NEW
Legacy event
ACL Service
RabbitMQReacts to legacy events (AdCreatedAdUpdated)
ACL transforms events into commands
Aggregates are updated
Banner Management
Service
Commands From old system
Events
TIP Make legacy integration interactions explicit
ANTI-CORRUPTION LAYERSNEW WEAPON UNLOCKED
LEVEL 7 API
This is the only way to interact with your system
Build UI on top of the API
Versioning is difficult ndash think if you really need it
EXPOSE COMMANDS AS RESOURCES
PUT httpImageBaneruuidName
Command RenameBanner
PUT httpImageBaneruuidFile
Command ReuploadFile
HYPERMEDIA ndash HELP YOUR CLIENT
GET httpImageBanneruuid
HTTP APINEW WEAPON UNLOCKED
LEVEL 8 UI amp UX
Excel is already invented itrsquos pretty damn good
UI must be built on top of your API
Guide user through business process
BEFORE
AFTER
TIP Build UI to solve business cases but not to edit data
TIP Exposing tasks can reduce overhead for users and for developers
TIP Build UI on top of the API
TASK BASED UINEW WEAPON UNLOCKED
LEVEL 9 TROUBLESHOOTING AND DEBUGGING
There is no F5 in distributed systems
Correlate all your requests and messages
Use centralized logging services
INSIDE THE RABBIT HOLE
REST API
Domain Service
ACL Service
ES Dispatcher
Service
Creative Upload
API
Creative Upload Service
Ad Analyzer Service
File Checker Service
File Generation
Service
Publishing Service
Preview Service
TRACK OPERATIONS
TIP Track every operation performance ndashthis helps to identify bottlenecks
TIP Automate load tests and run them often
CORRELATION IDSNEW ITEM UNLOCKED NIGHT VISION
YOU DONrsquoT NEED THEM ALL - CHOOSE WISELY
De-normalized read models
Strategic design
CQRS
Event sourcing
Projections
ACLs
REST API
Task based UI
Centralized logs
LOTS OF GUNS
BUT WHAT IFhellip
No guns for You
ADAPT TO BUSINESS THINKING
Avoid ndash technical arguments
Code quality is poor
We need to refactor
Technology is old
Everyone is using Angular nowhellip
Missing ldquobest practicesrdquo
We want to try NoSQLhellip
Prefer ndash economical arguments
Releases every day
Faster feature development
New products
Involve more developers
MS licenses are expensivehellip
DONrsquoT GET LOST IN A DUNGEON
Have a VISION
COMMIT
Define Your STRATEGY
Create TACTICS
FIGHT
ADOPT new tactics
Fight HARDER
WIN
SEPARATE INFRASTRUCTURE FROM BUSINESS LOGIC
TIP Identify infrastructure code and separate it
TIP Use different models for different tasks
STRATEGIC DESIGNNEW WEAPON UNLOCKED
LEVEL 3 WRITE MODEL DESIGN
Accepts commands only
Does not provide reading operations
Commands results into sequence of events
Events are immutable and persisted into EventStore
Commands RabbitMQ
Banner Management
Service
Event Store
Events
OR ANY OTHER ORM FRAMEWORK
Aggregates emit events
Aggregates are de-hydrated by replaying historical events
No settersgetters
Respect encapsulation
NO HIBERNATE
TIP Events and commands can be very natural constructs
TIP Excluding query operations can simplify code a lot
COMMANDS AND EVENTSNEW WEAPON UNLOCKED
LEVEL 4 EVENT STORE
Stores series of immutable events
There is no delete
Acts as ldquoEvent Logrdquo
Has built in projection engine
Is not designed for querying
BannerCreated BannerClickUrlsAdded BannerRenamed BannerRenamed
EVENT SOURCINGNEW WEAPON UNLOCKED
Performs left-folding of historical events
Produces projectionsviews into streams
Event selection
LEVEL 5 PROJECTIONS
Banner Projection
Click Urlschanged
Image Renamed
Image Created
Publishing UI Tags
PROJECTIONSNEW WEAPON UNLOCKED
Two way synchronization
Anti-corruption layer patters
LEVEL 6 STAYING IN SYNC
SYNC NEW TO OLD
Banner Event
Event Store Dispatcher
ACL Service
RabbitMQ
AdministrationDB
Reacts to domain events
Makes changes into AdsministrationDBwithin small transactions
Uses Dapper to simplify persistence
SYNC OLD TO NEW
Legacy event
ACL Service
RabbitMQReacts to legacy events (AdCreatedAdUpdated)
ACL transforms events into commands
Aggregates are updated
Banner Management
Service
Commands From old system
Events
TIP Make legacy integration interactions explicit
ANTI-CORRUPTION LAYERSNEW WEAPON UNLOCKED
LEVEL 7 API
This is the only way to interact with your system
Build UI on top of the API
Versioning is difficult ndash think if you really need it
EXPOSE COMMANDS AS RESOURCES
PUT httpImageBaneruuidName
Command RenameBanner
PUT httpImageBaneruuidFile
Command ReuploadFile
HYPERMEDIA ndash HELP YOUR CLIENT
GET httpImageBanneruuid
HTTP APINEW WEAPON UNLOCKED
LEVEL 8 UI amp UX
Excel is already invented itrsquos pretty damn good
UI must be built on top of your API
Guide user through business process
BEFORE
AFTER
TIP Build UI to solve business cases but not to edit data
TIP Exposing tasks can reduce overhead for users and for developers
TIP Build UI on top of the API
TASK BASED UINEW WEAPON UNLOCKED
LEVEL 9 TROUBLESHOOTING AND DEBUGGING
There is no F5 in distributed systems
Correlate all your requests and messages
Use centralized logging services
INSIDE THE RABBIT HOLE
REST API
Domain Service
ACL Service
ES Dispatcher
Service
Creative Upload
API
Creative Upload Service
Ad Analyzer Service
File Checker Service
File Generation
Service
Publishing Service
Preview Service
TRACK OPERATIONS
TIP Track every operation performance ndashthis helps to identify bottlenecks
TIP Automate load tests and run them often
CORRELATION IDSNEW ITEM UNLOCKED NIGHT VISION
YOU DONrsquoT NEED THEM ALL - CHOOSE WISELY
De-normalized read models
Strategic design
CQRS
Event sourcing
Projections
ACLs
REST API
Task based UI
Centralized logs
LOTS OF GUNS
BUT WHAT IFhellip
No guns for You
ADAPT TO BUSINESS THINKING
Avoid ndash technical arguments
Code quality is poor
We need to refactor
Technology is old
Everyone is using Angular nowhellip
Missing ldquobest practicesrdquo
We want to try NoSQLhellip
Prefer ndash economical arguments
Releases every day
Faster feature development
New products
Involve more developers
MS licenses are expensivehellip
DONrsquoT GET LOST IN A DUNGEON
Have a VISION
COMMIT
Define Your STRATEGY
Create TACTICS
FIGHT
ADOPT new tactics
Fight HARDER
WIN
TIP Identify infrastructure code and separate it
TIP Use different models for different tasks
STRATEGIC DESIGNNEW WEAPON UNLOCKED
LEVEL 3 WRITE MODEL DESIGN
Accepts commands only
Does not provide reading operations
Commands results into sequence of events
Events are immutable and persisted into EventStore
Commands RabbitMQ
Banner Management
Service
Event Store
Events
OR ANY OTHER ORM FRAMEWORK
Aggregates emit events
Aggregates are de-hydrated by replaying historical events
No settersgetters
Respect encapsulation
NO HIBERNATE
TIP Events and commands can be very natural constructs
TIP Excluding query operations can simplify code a lot
COMMANDS AND EVENTSNEW WEAPON UNLOCKED
LEVEL 4 EVENT STORE
Stores series of immutable events
There is no delete
Acts as ldquoEvent Logrdquo
Has built in projection engine
Is not designed for querying
BannerCreated BannerClickUrlsAdded BannerRenamed BannerRenamed
EVENT SOURCINGNEW WEAPON UNLOCKED
Performs left-folding of historical events
Produces projectionsviews into streams
Event selection
LEVEL 5 PROJECTIONS
Banner Projection
Click Urlschanged
Image Renamed
Image Created
Publishing UI Tags
PROJECTIONSNEW WEAPON UNLOCKED
Two way synchronization
Anti-corruption layer patters
LEVEL 6 STAYING IN SYNC
SYNC NEW TO OLD
Banner Event
Event Store Dispatcher
ACL Service
RabbitMQ
AdministrationDB
Reacts to domain events
Makes changes into AdsministrationDBwithin small transactions
Uses Dapper to simplify persistence
SYNC OLD TO NEW
Legacy event
ACL Service
RabbitMQReacts to legacy events (AdCreatedAdUpdated)
ACL transforms events into commands
Aggregates are updated
Banner Management
Service
Commands From old system
Events
TIP Make legacy integration interactions explicit
ANTI-CORRUPTION LAYERSNEW WEAPON UNLOCKED
LEVEL 7 API
This is the only way to interact with your system
Build UI on top of the API
Versioning is difficult ndash think if you really need it
EXPOSE COMMANDS AS RESOURCES
PUT httpImageBaneruuidName
Command RenameBanner
PUT httpImageBaneruuidFile
Command ReuploadFile
HYPERMEDIA ndash HELP YOUR CLIENT
GET httpImageBanneruuid
HTTP APINEW WEAPON UNLOCKED
LEVEL 8 UI amp UX
Excel is already invented itrsquos pretty damn good
UI must be built on top of your API
Guide user through business process
BEFORE
AFTER
TIP Build UI to solve business cases but not to edit data
TIP Exposing tasks can reduce overhead for users and for developers
TIP Build UI on top of the API
TASK BASED UINEW WEAPON UNLOCKED
LEVEL 9 TROUBLESHOOTING AND DEBUGGING
There is no F5 in distributed systems
Correlate all your requests and messages
Use centralized logging services
INSIDE THE RABBIT HOLE
REST API
Domain Service
ACL Service
ES Dispatcher
Service
Creative Upload
API
Creative Upload Service
Ad Analyzer Service
File Checker Service
File Generation
Service
Publishing Service
Preview Service
TRACK OPERATIONS
TIP Track every operation performance ndashthis helps to identify bottlenecks
TIP Automate load tests and run them often
CORRELATION IDSNEW ITEM UNLOCKED NIGHT VISION
YOU DONrsquoT NEED THEM ALL - CHOOSE WISELY
De-normalized read models
Strategic design
CQRS
Event sourcing
Projections
ACLs
REST API
Task based UI
Centralized logs
LOTS OF GUNS
BUT WHAT IFhellip
No guns for You
ADAPT TO BUSINESS THINKING
Avoid ndash technical arguments
Code quality is poor
We need to refactor
Technology is old
Everyone is using Angular nowhellip
Missing ldquobest practicesrdquo
We want to try NoSQLhellip
Prefer ndash economical arguments
Releases every day
Faster feature development
New products
Involve more developers
MS licenses are expensivehellip
DONrsquoT GET LOST IN A DUNGEON
Have a VISION
COMMIT
Define Your STRATEGY
Create TACTICS
FIGHT
ADOPT new tactics
Fight HARDER
WIN
STRATEGIC DESIGNNEW WEAPON UNLOCKED
LEVEL 3 WRITE MODEL DESIGN
Accepts commands only
Does not provide reading operations
Commands results into sequence of events
Events are immutable and persisted into EventStore
Commands RabbitMQ
Banner Management
Service
Event Store
Events
OR ANY OTHER ORM FRAMEWORK
Aggregates emit events
Aggregates are de-hydrated by replaying historical events
No settersgetters
Respect encapsulation
NO HIBERNATE
TIP Events and commands can be very natural constructs
TIP Excluding query operations can simplify code a lot
COMMANDS AND EVENTSNEW WEAPON UNLOCKED
LEVEL 4 EVENT STORE
Stores series of immutable events
There is no delete
Acts as ldquoEvent Logrdquo
Has built in projection engine
Is not designed for querying
BannerCreated BannerClickUrlsAdded BannerRenamed BannerRenamed
EVENT SOURCINGNEW WEAPON UNLOCKED
Performs left-folding of historical events
Produces projectionsviews into streams
Event selection
LEVEL 5 PROJECTIONS
Banner Projection
Click Urlschanged
Image Renamed
Image Created
Publishing UI Tags
PROJECTIONSNEW WEAPON UNLOCKED
Two way synchronization
Anti-corruption layer patters
LEVEL 6 STAYING IN SYNC
SYNC NEW TO OLD
Banner Event
Event Store Dispatcher
ACL Service
RabbitMQ
AdministrationDB
Reacts to domain events
Makes changes into AdsministrationDBwithin small transactions
Uses Dapper to simplify persistence
SYNC OLD TO NEW
Legacy event
ACL Service
RabbitMQReacts to legacy events (AdCreatedAdUpdated)
ACL transforms events into commands
Aggregates are updated
Banner Management
Service
Commands From old system
Events
TIP Make legacy integration interactions explicit
ANTI-CORRUPTION LAYERSNEW WEAPON UNLOCKED
LEVEL 7 API
This is the only way to interact with your system
Build UI on top of the API
Versioning is difficult ndash think if you really need it
EXPOSE COMMANDS AS RESOURCES
PUT httpImageBaneruuidName
Command RenameBanner
PUT httpImageBaneruuidFile
Command ReuploadFile
HYPERMEDIA ndash HELP YOUR CLIENT
GET httpImageBanneruuid
HTTP APINEW WEAPON UNLOCKED
LEVEL 8 UI amp UX
Excel is already invented itrsquos pretty damn good
UI must be built on top of your API
Guide user through business process
BEFORE
AFTER
TIP Build UI to solve business cases but not to edit data
TIP Exposing tasks can reduce overhead for users and for developers
TIP Build UI on top of the API
TASK BASED UINEW WEAPON UNLOCKED
LEVEL 9 TROUBLESHOOTING AND DEBUGGING
There is no F5 in distributed systems
Correlate all your requests and messages
Use centralized logging services
INSIDE THE RABBIT HOLE
REST API
Domain Service
ACL Service
ES Dispatcher
Service
Creative Upload
API
Creative Upload Service
Ad Analyzer Service
File Checker Service
File Generation
Service
Publishing Service
Preview Service
TRACK OPERATIONS
TIP Track every operation performance ndashthis helps to identify bottlenecks
TIP Automate load tests and run them often
CORRELATION IDSNEW ITEM UNLOCKED NIGHT VISION
YOU DONrsquoT NEED THEM ALL - CHOOSE WISELY
De-normalized read models
Strategic design
CQRS
Event sourcing
Projections
ACLs
REST API
Task based UI
Centralized logs
LOTS OF GUNS
BUT WHAT IFhellip
No guns for You
ADAPT TO BUSINESS THINKING
Avoid ndash technical arguments
Code quality is poor
We need to refactor
Technology is old
Everyone is using Angular nowhellip
Missing ldquobest practicesrdquo
We want to try NoSQLhellip
Prefer ndash economical arguments
Releases every day
Faster feature development
New products
Involve more developers
MS licenses are expensivehellip
DONrsquoT GET LOST IN A DUNGEON
Have a VISION
COMMIT
Define Your STRATEGY
Create TACTICS
FIGHT
ADOPT new tactics
Fight HARDER
WIN
LEVEL 3 WRITE MODEL DESIGN
Accepts commands only
Does not provide reading operations
Commands results into sequence of events
Events are immutable and persisted into EventStore
Commands RabbitMQ
Banner Management
Service
Event Store
Events
OR ANY OTHER ORM FRAMEWORK
Aggregates emit events
Aggregates are de-hydrated by replaying historical events
No settersgetters
Respect encapsulation
NO HIBERNATE
TIP Events and commands can be very natural constructs
TIP Excluding query operations can simplify code a lot
COMMANDS AND EVENTSNEW WEAPON UNLOCKED
LEVEL 4 EVENT STORE
Stores series of immutable events
There is no delete
Acts as ldquoEvent Logrdquo
Has built in projection engine
Is not designed for querying
BannerCreated BannerClickUrlsAdded BannerRenamed BannerRenamed
EVENT SOURCINGNEW WEAPON UNLOCKED
Performs left-folding of historical events
Produces projectionsviews into streams
Event selection
LEVEL 5 PROJECTIONS
Banner Projection
Click Urlschanged
Image Renamed
Image Created
Publishing UI Tags
PROJECTIONSNEW WEAPON UNLOCKED
Two way synchronization
Anti-corruption layer patters
LEVEL 6 STAYING IN SYNC
SYNC NEW TO OLD
Banner Event
Event Store Dispatcher
ACL Service
RabbitMQ
AdministrationDB
Reacts to domain events
Makes changes into AdsministrationDBwithin small transactions
Uses Dapper to simplify persistence
SYNC OLD TO NEW
Legacy event
ACL Service
RabbitMQReacts to legacy events (AdCreatedAdUpdated)
ACL transforms events into commands
Aggregates are updated
Banner Management
Service
Commands From old system
Events
TIP Make legacy integration interactions explicit
ANTI-CORRUPTION LAYERSNEW WEAPON UNLOCKED
LEVEL 7 API
This is the only way to interact with your system
Build UI on top of the API
Versioning is difficult ndash think if you really need it
EXPOSE COMMANDS AS RESOURCES
PUT httpImageBaneruuidName
Command RenameBanner
PUT httpImageBaneruuidFile
Command ReuploadFile
HYPERMEDIA ndash HELP YOUR CLIENT
GET httpImageBanneruuid
HTTP APINEW WEAPON UNLOCKED
LEVEL 8 UI amp UX
Excel is already invented itrsquos pretty damn good
UI must be built on top of your API
Guide user through business process
BEFORE
AFTER
TIP Build UI to solve business cases but not to edit data
TIP Exposing tasks can reduce overhead for users and for developers
TIP Build UI on top of the API
TASK BASED UINEW WEAPON UNLOCKED
LEVEL 9 TROUBLESHOOTING AND DEBUGGING
There is no F5 in distributed systems
Correlate all your requests and messages
Use centralized logging services
INSIDE THE RABBIT HOLE
REST API
Domain Service
ACL Service
ES Dispatcher
Service
Creative Upload
API
Creative Upload Service
Ad Analyzer Service
File Checker Service
File Generation
Service
Publishing Service
Preview Service
TRACK OPERATIONS
TIP Track every operation performance ndashthis helps to identify bottlenecks
TIP Automate load tests and run them often
CORRELATION IDSNEW ITEM UNLOCKED NIGHT VISION
YOU DONrsquoT NEED THEM ALL - CHOOSE WISELY
De-normalized read models
Strategic design
CQRS
Event sourcing
Projections
ACLs
REST API
Task based UI
Centralized logs
LOTS OF GUNS
BUT WHAT IFhellip
No guns for You
ADAPT TO BUSINESS THINKING
Avoid ndash technical arguments
Code quality is poor
We need to refactor
Technology is old
Everyone is using Angular nowhellip
Missing ldquobest practicesrdquo
We want to try NoSQLhellip
Prefer ndash economical arguments
Releases every day
Faster feature development
New products
Involve more developers
MS licenses are expensivehellip
DONrsquoT GET LOST IN A DUNGEON
Have a VISION
COMMIT
Define Your STRATEGY
Create TACTICS
FIGHT
ADOPT new tactics
Fight HARDER
WIN
OR ANY OTHER ORM FRAMEWORK
Aggregates emit events
Aggregates are de-hydrated by replaying historical events
No settersgetters
Respect encapsulation
NO HIBERNATE
TIP Events and commands can be very natural constructs
TIP Excluding query operations can simplify code a lot
COMMANDS AND EVENTSNEW WEAPON UNLOCKED
LEVEL 4 EVENT STORE
Stores series of immutable events
There is no delete
Acts as ldquoEvent Logrdquo
Has built in projection engine
Is not designed for querying
BannerCreated BannerClickUrlsAdded BannerRenamed BannerRenamed
EVENT SOURCINGNEW WEAPON UNLOCKED
Performs left-folding of historical events
Produces projectionsviews into streams
Event selection
LEVEL 5 PROJECTIONS
Banner Projection
Click Urlschanged
Image Renamed
Image Created
Publishing UI Tags
PROJECTIONSNEW WEAPON UNLOCKED
Two way synchronization
Anti-corruption layer patters
LEVEL 6 STAYING IN SYNC
SYNC NEW TO OLD
Banner Event
Event Store Dispatcher
ACL Service
RabbitMQ
AdministrationDB
Reacts to domain events
Makes changes into AdsministrationDBwithin small transactions
Uses Dapper to simplify persistence
SYNC OLD TO NEW
Legacy event
ACL Service
RabbitMQReacts to legacy events (AdCreatedAdUpdated)
ACL transforms events into commands
Aggregates are updated
Banner Management
Service
Commands From old system
Events
TIP Make legacy integration interactions explicit
ANTI-CORRUPTION LAYERSNEW WEAPON UNLOCKED
LEVEL 7 API
This is the only way to interact with your system
Build UI on top of the API
Versioning is difficult ndash think if you really need it
EXPOSE COMMANDS AS RESOURCES
PUT httpImageBaneruuidName
Command RenameBanner
PUT httpImageBaneruuidFile
Command ReuploadFile
HYPERMEDIA ndash HELP YOUR CLIENT
GET httpImageBanneruuid
HTTP APINEW WEAPON UNLOCKED
LEVEL 8 UI amp UX
Excel is already invented itrsquos pretty damn good
UI must be built on top of your API
Guide user through business process
BEFORE
AFTER
TIP Build UI to solve business cases but not to edit data
TIP Exposing tasks can reduce overhead for users and for developers
TIP Build UI on top of the API
TASK BASED UINEW WEAPON UNLOCKED
LEVEL 9 TROUBLESHOOTING AND DEBUGGING
There is no F5 in distributed systems
Correlate all your requests and messages
Use centralized logging services
INSIDE THE RABBIT HOLE
REST API
Domain Service
ACL Service
ES Dispatcher
Service
Creative Upload
API
Creative Upload Service
Ad Analyzer Service
File Checker Service
File Generation
Service
Publishing Service
Preview Service
TRACK OPERATIONS
TIP Track every operation performance ndashthis helps to identify bottlenecks
TIP Automate load tests and run them often
CORRELATION IDSNEW ITEM UNLOCKED NIGHT VISION
YOU DONrsquoT NEED THEM ALL - CHOOSE WISELY
De-normalized read models
Strategic design
CQRS
Event sourcing
Projections
ACLs
REST API
Task based UI
Centralized logs
LOTS OF GUNS
BUT WHAT IFhellip
No guns for You
ADAPT TO BUSINESS THINKING
Avoid ndash technical arguments
Code quality is poor
We need to refactor
Technology is old
Everyone is using Angular nowhellip
Missing ldquobest practicesrdquo
We want to try NoSQLhellip
Prefer ndash economical arguments
Releases every day
Faster feature development
New products
Involve more developers
MS licenses are expensivehellip
DONrsquoT GET LOST IN A DUNGEON
Have a VISION
COMMIT
Define Your STRATEGY
Create TACTICS
FIGHT
ADOPT new tactics
Fight HARDER
WIN
TIP Events and commands can be very natural constructs
TIP Excluding query operations can simplify code a lot
COMMANDS AND EVENTSNEW WEAPON UNLOCKED
LEVEL 4 EVENT STORE
Stores series of immutable events
There is no delete
Acts as ldquoEvent Logrdquo
Has built in projection engine
Is not designed for querying
BannerCreated BannerClickUrlsAdded BannerRenamed BannerRenamed
EVENT SOURCINGNEW WEAPON UNLOCKED
Performs left-folding of historical events
Produces projectionsviews into streams
Event selection
LEVEL 5 PROJECTIONS
Banner Projection
Click Urlschanged
Image Renamed
Image Created
Publishing UI Tags
PROJECTIONSNEW WEAPON UNLOCKED
Two way synchronization
Anti-corruption layer patters
LEVEL 6 STAYING IN SYNC
SYNC NEW TO OLD
Banner Event
Event Store Dispatcher
ACL Service
RabbitMQ
AdministrationDB
Reacts to domain events
Makes changes into AdsministrationDBwithin small transactions
Uses Dapper to simplify persistence
SYNC OLD TO NEW
Legacy event
ACL Service
RabbitMQReacts to legacy events (AdCreatedAdUpdated)
ACL transforms events into commands
Aggregates are updated
Banner Management
Service
Commands From old system
Events
TIP Make legacy integration interactions explicit
ANTI-CORRUPTION LAYERSNEW WEAPON UNLOCKED
LEVEL 7 API
This is the only way to interact with your system
Build UI on top of the API
Versioning is difficult ndash think if you really need it
EXPOSE COMMANDS AS RESOURCES
PUT httpImageBaneruuidName
Command RenameBanner
PUT httpImageBaneruuidFile
Command ReuploadFile
HYPERMEDIA ndash HELP YOUR CLIENT
GET httpImageBanneruuid
HTTP APINEW WEAPON UNLOCKED
LEVEL 8 UI amp UX
Excel is already invented itrsquos pretty damn good
UI must be built on top of your API
Guide user through business process
BEFORE
AFTER
TIP Build UI to solve business cases but not to edit data
TIP Exposing tasks can reduce overhead for users and for developers
TIP Build UI on top of the API
TASK BASED UINEW WEAPON UNLOCKED
LEVEL 9 TROUBLESHOOTING AND DEBUGGING
There is no F5 in distributed systems
Correlate all your requests and messages
Use centralized logging services
INSIDE THE RABBIT HOLE
REST API
Domain Service
ACL Service
ES Dispatcher
Service
Creative Upload
API
Creative Upload Service
Ad Analyzer Service
File Checker Service
File Generation
Service
Publishing Service
Preview Service
TRACK OPERATIONS
TIP Track every operation performance ndashthis helps to identify bottlenecks
TIP Automate load tests and run them often
CORRELATION IDSNEW ITEM UNLOCKED NIGHT VISION
YOU DONrsquoT NEED THEM ALL - CHOOSE WISELY
De-normalized read models
Strategic design
CQRS
Event sourcing
Projections
ACLs
REST API
Task based UI
Centralized logs
LOTS OF GUNS
BUT WHAT IFhellip
No guns for You
ADAPT TO BUSINESS THINKING
Avoid ndash technical arguments
Code quality is poor
We need to refactor
Technology is old
Everyone is using Angular nowhellip
Missing ldquobest practicesrdquo
We want to try NoSQLhellip
Prefer ndash economical arguments
Releases every day
Faster feature development
New products
Involve more developers
MS licenses are expensivehellip
DONrsquoT GET LOST IN A DUNGEON
Have a VISION
COMMIT
Define Your STRATEGY
Create TACTICS
FIGHT
ADOPT new tactics
Fight HARDER
WIN
COMMANDS AND EVENTSNEW WEAPON UNLOCKED
LEVEL 4 EVENT STORE
Stores series of immutable events
There is no delete
Acts as ldquoEvent Logrdquo
Has built in projection engine
Is not designed for querying
BannerCreated BannerClickUrlsAdded BannerRenamed BannerRenamed
EVENT SOURCINGNEW WEAPON UNLOCKED
Performs left-folding of historical events
Produces projectionsviews into streams
Event selection
LEVEL 5 PROJECTIONS
Banner Projection
Click Urlschanged
Image Renamed
Image Created
Publishing UI Tags
PROJECTIONSNEW WEAPON UNLOCKED
Two way synchronization
Anti-corruption layer patters
LEVEL 6 STAYING IN SYNC
SYNC NEW TO OLD
Banner Event
Event Store Dispatcher
ACL Service
RabbitMQ
AdministrationDB
Reacts to domain events
Makes changes into AdsministrationDBwithin small transactions
Uses Dapper to simplify persistence
SYNC OLD TO NEW
Legacy event
ACL Service
RabbitMQReacts to legacy events (AdCreatedAdUpdated)
ACL transforms events into commands
Aggregates are updated
Banner Management
Service
Commands From old system
Events
TIP Make legacy integration interactions explicit
ANTI-CORRUPTION LAYERSNEW WEAPON UNLOCKED
LEVEL 7 API
This is the only way to interact with your system
Build UI on top of the API
Versioning is difficult ndash think if you really need it
EXPOSE COMMANDS AS RESOURCES
PUT httpImageBaneruuidName
Command RenameBanner
PUT httpImageBaneruuidFile
Command ReuploadFile
HYPERMEDIA ndash HELP YOUR CLIENT
GET httpImageBanneruuid
HTTP APINEW WEAPON UNLOCKED
LEVEL 8 UI amp UX
Excel is already invented itrsquos pretty damn good
UI must be built on top of your API
Guide user through business process
BEFORE
AFTER
TIP Build UI to solve business cases but not to edit data
TIP Exposing tasks can reduce overhead for users and for developers
TIP Build UI on top of the API
TASK BASED UINEW WEAPON UNLOCKED
LEVEL 9 TROUBLESHOOTING AND DEBUGGING
There is no F5 in distributed systems
Correlate all your requests and messages
Use centralized logging services
INSIDE THE RABBIT HOLE
REST API
Domain Service
ACL Service
ES Dispatcher
Service
Creative Upload
API
Creative Upload Service
Ad Analyzer Service
File Checker Service
File Generation
Service
Publishing Service
Preview Service
TRACK OPERATIONS
TIP Track every operation performance ndashthis helps to identify bottlenecks
TIP Automate load tests and run them often
CORRELATION IDSNEW ITEM UNLOCKED NIGHT VISION
YOU DONrsquoT NEED THEM ALL - CHOOSE WISELY
De-normalized read models
Strategic design
CQRS
Event sourcing
Projections
ACLs
REST API
Task based UI
Centralized logs
LOTS OF GUNS
BUT WHAT IFhellip
No guns for You
ADAPT TO BUSINESS THINKING
Avoid ndash technical arguments
Code quality is poor
We need to refactor
Technology is old
Everyone is using Angular nowhellip
Missing ldquobest practicesrdquo
We want to try NoSQLhellip
Prefer ndash economical arguments
Releases every day
Faster feature development
New products
Involve more developers
MS licenses are expensivehellip
DONrsquoT GET LOST IN A DUNGEON
Have a VISION
COMMIT
Define Your STRATEGY
Create TACTICS
FIGHT
ADOPT new tactics
Fight HARDER
WIN
LEVEL 4 EVENT STORE
Stores series of immutable events
There is no delete
Acts as ldquoEvent Logrdquo
Has built in projection engine
Is not designed for querying
BannerCreated BannerClickUrlsAdded BannerRenamed BannerRenamed
EVENT SOURCINGNEW WEAPON UNLOCKED
Performs left-folding of historical events
Produces projectionsviews into streams
Event selection
LEVEL 5 PROJECTIONS
Banner Projection
Click Urlschanged
Image Renamed
Image Created
Publishing UI Tags
PROJECTIONSNEW WEAPON UNLOCKED
Two way synchronization
Anti-corruption layer patters
LEVEL 6 STAYING IN SYNC
SYNC NEW TO OLD
Banner Event
Event Store Dispatcher
ACL Service
RabbitMQ
AdministrationDB
Reacts to domain events
Makes changes into AdsministrationDBwithin small transactions
Uses Dapper to simplify persistence
SYNC OLD TO NEW
Legacy event
ACL Service
RabbitMQReacts to legacy events (AdCreatedAdUpdated)
ACL transforms events into commands
Aggregates are updated
Banner Management
Service
Commands From old system
Events
TIP Make legacy integration interactions explicit
ANTI-CORRUPTION LAYERSNEW WEAPON UNLOCKED
LEVEL 7 API
This is the only way to interact with your system
Build UI on top of the API
Versioning is difficult ndash think if you really need it
EXPOSE COMMANDS AS RESOURCES
PUT httpImageBaneruuidName
Command RenameBanner
PUT httpImageBaneruuidFile
Command ReuploadFile
HYPERMEDIA ndash HELP YOUR CLIENT
GET httpImageBanneruuid
HTTP APINEW WEAPON UNLOCKED
LEVEL 8 UI amp UX
Excel is already invented itrsquos pretty damn good
UI must be built on top of your API
Guide user through business process
BEFORE
AFTER
TIP Build UI to solve business cases but not to edit data
TIP Exposing tasks can reduce overhead for users and for developers
TIP Build UI on top of the API
TASK BASED UINEW WEAPON UNLOCKED
LEVEL 9 TROUBLESHOOTING AND DEBUGGING
There is no F5 in distributed systems
Correlate all your requests and messages
Use centralized logging services
INSIDE THE RABBIT HOLE
REST API
Domain Service
ACL Service
ES Dispatcher
Service
Creative Upload
API
Creative Upload Service
Ad Analyzer Service
File Checker Service
File Generation
Service
Publishing Service
Preview Service
TRACK OPERATIONS
TIP Track every operation performance ndashthis helps to identify bottlenecks
TIP Automate load tests and run them often
CORRELATION IDSNEW ITEM UNLOCKED NIGHT VISION
YOU DONrsquoT NEED THEM ALL - CHOOSE WISELY
De-normalized read models
Strategic design
CQRS
Event sourcing
Projections
ACLs
REST API
Task based UI
Centralized logs
LOTS OF GUNS
BUT WHAT IFhellip
No guns for You
ADAPT TO BUSINESS THINKING
Avoid ndash technical arguments
Code quality is poor
We need to refactor
Technology is old
Everyone is using Angular nowhellip
Missing ldquobest practicesrdquo
We want to try NoSQLhellip
Prefer ndash economical arguments
Releases every day
Faster feature development
New products
Involve more developers
MS licenses are expensivehellip
DONrsquoT GET LOST IN A DUNGEON
Have a VISION
COMMIT
Define Your STRATEGY
Create TACTICS
FIGHT
ADOPT new tactics
Fight HARDER
WIN
EVENT SOURCINGNEW WEAPON UNLOCKED
Performs left-folding of historical events
Produces projectionsviews into streams
Event selection
LEVEL 5 PROJECTIONS
Banner Projection
Click Urlschanged
Image Renamed
Image Created
Publishing UI Tags
PROJECTIONSNEW WEAPON UNLOCKED
Two way synchronization
Anti-corruption layer patters
LEVEL 6 STAYING IN SYNC
SYNC NEW TO OLD
Banner Event
Event Store Dispatcher
ACL Service
RabbitMQ
AdministrationDB
Reacts to domain events
Makes changes into AdsministrationDBwithin small transactions
Uses Dapper to simplify persistence
SYNC OLD TO NEW
Legacy event
ACL Service
RabbitMQReacts to legacy events (AdCreatedAdUpdated)
ACL transforms events into commands
Aggregates are updated
Banner Management
Service
Commands From old system
Events
TIP Make legacy integration interactions explicit
ANTI-CORRUPTION LAYERSNEW WEAPON UNLOCKED
LEVEL 7 API
This is the only way to interact with your system
Build UI on top of the API
Versioning is difficult ndash think if you really need it
EXPOSE COMMANDS AS RESOURCES
PUT httpImageBaneruuidName
Command RenameBanner
PUT httpImageBaneruuidFile
Command ReuploadFile
HYPERMEDIA ndash HELP YOUR CLIENT
GET httpImageBanneruuid
HTTP APINEW WEAPON UNLOCKED
LEVEL 8 UI amp UX
Excel is already invented itrsquos pretty damn good
UI must be built on top of your API
Guide user through business process
BEFORE
AFTER
TIP Build UI to solve business cases but not to edit data
TIP Exposing tasks can reduce overhead for users and for developers
TIP Build UI on top of the API
TASK BASED UINEW WEAPON UNLOCKED
LEVEL 9 TROUBLESHOOTING AND DEBUGGING
There is no F5 in distributed systems
Correlate all your requests and messages
Use centralized logging services
INSIDE THE RABBIT HOLE
REST API
Domain Service
ACL Service
ES Dispatcher
Service
Creative Upload
API
Creative Upload Service
Ad Analyzer Service
File Checker Service
File Generation
Service
Publishing Service
Preview Service
TRACK OPERATIONS
TIP Track every operation performance ndashthis helps to identify bottlenecks
TIP Automate load tests and run them often
CORRELATION IDSNEW ITEM UNLOCKED NIGHT VISION
YOU DONrsquoT NEED THEM ALL - CHOOSE WISELY
De-normalized read models
Strategic design
CQRS
Event sourcing
Projections
ACLs
REST API
Task based UI
Centralized logs
LOTS OF GUNS
BUT WHAT IFhellip
No guns for You
ADAPT TO BUSINESS THINKING
Avoid ndash technical arguments
Code quality is poor
We need to refactor
Technology is old
Everyone is using Angular nowhellip
Missing ldquobest practicesrdquo
We want to try NoSQLhellip
Prefer ndash economical arguments
Releases every day
Faster feature development
New products
Involve more developers
MS licenses are expensivehellip
DONrsquoT GET LOST IN A DUNGEON
Have a VISION
COMMIT
Define Your STRATEGY
Create TACTICS
FIGHT
ADOPT new tactics
Fight HARDER
WIN
Performs left-folding of historical events
Produces projectionsviews into streams
Event selection
LEVEL 5 PROJECTIONS
Banner Projection
Click Urlschanged
Image Renamed
Image Created
Publishing UI Tags
PROJECTIONSNEW WEAPON UNLOCKED
Two way synchronization
Anti-corruption layer patters
LEVEL 6 STAYING IN SYNC
SYNC NEW TO OLD
Banner Event
Event Store Dispatcher
ACL Service
RabbitMQ
AdministrationDB
Reacts to domain events
Makes changes into AdsministrationDBwithin small transactions
Uses Dapper to simplify persistence
SYNC OLD TO NEW
Legacy event
ACL Service
RabbitMQReacts to legacy events (AdCreatedAdUpdated)
ACL transforms events into commands
Aggregates are updated
Banner Management
Service
Commands From old system
Events
TIP Make legacy integration interactions explicit
ANTI-CORRUPTION LAYERSNEW WEAPON UNLOCKED
LEVEL 7 API
This is the only way to interact with your system
Build UI on top of the API
Versioning is difficult ndash think if you really need it
EXPOSE COMMANDS AS RESOURCES
PUT httpImageBaneruuidName
Command RenameBanner
PUT httpImageBaneruuidFile
Command ReuploadFile
HYPERMEDIA ndash HELP YOUR CLIENT
GET httpImageBanneruuid
HTTP APINEW WEAPON UNLOCKED
LEVEL 8 UI amp UX
Excel is already invented itrsquos pretty damn good
UI must be built on top of your API
Guide user through business process
BEFORE
AFTER
TIP Build UI to solve business cases but not to edit data
TIP Exposing tasks can reduce overhead for users and for developers
TIP Build UI on top of the API
TASK BASED UINEW WEAPON UNLOCKED
LEVEL 9 TROUBLESHOOTING AND DEBUGGING
There is no F5 in distributed systems
Correlate all your requests and messages
Use centralized logging services
INSIDE THE RABBIT HOLE
REST API
Domain Service
ACL Service
ES Dispatcher
Service
Creative Upload
API
Creative Upload Service
Ad Analyzer Service
File Checker Service
File Generation
Service
Publishing Service
Preview Service
TRACK OPERATIONS
TIP Track every operation performance ndashthis helps to identify bottlenecks
TIP Automate load tests and run them often
CORRELATION IDSNEW ITEM UNLOCKED NIGHT VISION
YOU DONrsquoT NEED THEM ALL - CHOOSE WISELY
De-normalized read models
Strategic design
CQRS
Event sourcing
Projections
ACLs
REST API
Task based UI
Centralized logs
LOTS OF GUNS
BUT WHAT IFhellip
No guns for You
ADAPT TO BUSINESS THINKING
Avoid ndash technical arguments
Code quality is poor
We need to refactor
Technology is old
Everyone is using Angular nowhellip
Missing ldquobest practicesrdquo
We want to try NoSQLhellip
Prefer ndash economical arguments
Releases every day
Faster feature development
New products
Involve more developers
MS licenses are expensivehellip
DONrsquoT GET LOST IN A DUNGEON
Have a VISION
COMMIT
Define Your STRATEGY
Create TACTICS
FIGHT
ADOPT new tactics
Fight HARDER
WIN
PROJECTIONSNEW WEAPON UNLOCKED
Two way synchronization
Anti-corruption layer patters
LEVEL 6 STAYING IN SYNC
SYNC NEW TO OLD
Banner Event
Event Store Dispatcher
ACL Service
RabbitMQ
AdministrationDB
Reacts to domain events
Makes changes into AdsministrationDBwithin small transactions
Uses Dapper to simplify persistence
SYNC OLD TO NEW
Legacy event
ACL Service
RabbitMQReacts to legacy events (AdCreatedAdUpdated)
ACL transforms events into commands
Aggregates are updated
Banner Management
Service
Commands From old system
Events
TIP Make legacy integration interactions explicit
ANTI-CORRUPTION LAYERSNEW WEAPON UNLOCKED
LEVEL 7 API
This is the only way to interact with your system
Build UI on top of the API
Versioning is difficult ndash think if you really need it
EXPOSE COMMANDS AS RESOURCES
PUT httpImageBaneruuidName
Command RenameBanner
PUT httpImageBaneruuidFile
Command ReuploadFile
HYPERMEDIA ndash HELP YOUR CLIENT
GET httpImageBanneruuid
HTTP APINEW WEAPON UNLOCKED
LEVEL 8 UI amp UX
Excel is already invented itrsquos pretty damn good
UI must be built on top of your API
Guide user through business process
BEFORE
AFTER
TIP Build UI to solve business cases but not to edit data
TIP Exposing tasks can reduce overhead for users and for developers
TIP Build UI on top of the API
TASK BASED UINEW WEAPON UNLOCKED
LEVEL 9 TROUBLESHOOTING AND DEBUGGING
There is no F5 in distributed systems
Correlate all your requests and messages
Use centralized logging services
INSIDE THE RABBIT HOLE
REST API
Domain Service
ACL Service
ES Dispatcher
Service
Creative Upload
API
Creative Upload Service
Ad Analyzer Service
File Checker Service
File Generation
Service
Publishing Service
Preview Service
TRACK OPERATIONS
TIP Track every operation performance ndashthis helps to identify bottlenecks
TIP Automate load tests and run them often
CORRELATION IDSNEW ITEM UNLOCKED NIGHT VISION
YOU DONrsquoT NEED THEM ALL - CHOOSE WISELY
De-normalized read models
Strategic design
CQRS
Event sourcing
Projections
ACLs
REST API
Task based UI
Centralized logs
LOTS OF GUNS
BUT WHAT IFhellip
No guns for You
ADAPT TO BUSINESS THINKING
Avoid ndash technical arguments
Code quality is poor
We need to refactor
Technology is old
Everyone is using Angular nowhellip
Missing ldquobest practicesrdquo
We want to try NoSQLhellip
Prefer ndash economical arguments
Releases every day
Faster feature development
New products
Involve more developers
MS licenses are expensivehellip
DONrsquoT GET LOST IN A DUNGEON
Have a VISION
COMMIT
Define Your STRATEGY
Create TACTICS
FIGHT
ADOPT new tactics
Fight HARDER
WIN
Two way synchronization
Anti-corruption layer patters
LEVEL 6 STAYING IN SYNC
SYNC NEW TO OLD
Banner Event
Event Store Dispatcher
ACL Service
RabbitMQ
AdministrationDB
Reacts to domain events
Makes changes into AdsministrationDBwithin small transactions
Uses Dapper to simplify persistence
SYNC OLD TO NEW
Legacy event
ACL Service
RabbitMQReacts to legacy events (AdCreatedAdUpdated)
ACL transforms events into commands
Aggregates are updated
Banner Management
Service
Commands From old system
Events
TIP Make legacy integration interactions explicit
ANTI-CORRUPTION LAYERSNEW WEAPON UNLOCKED
LEVEL 7 API
This is the only way to interact with your system
Build UI on top of the API
Versioning is difficult ndash think if you really need it
EXPOSE COMMANDS AS RESOURCES
PUT httpImageBaneruuidName
Command RenameBanner
PUT httpImageBaneruuidFile
Command ReuploadFile
HYPERMEDIA ndash HELP YOUR CLIENT
GET httpImageBanneruuid
HTTP APINEW WEAPON UNLOCKED
LEVEL 8 UI amp UX
Excel is already invented itrsquos pretty damn good
UI must be built on top of your API
Guide user through business process
BEFORE
AFTER
TIP Build UI to solve business cases but not to edit data
TIP Exposing tasks can reduce overhead for users and for developers
TIP Build UI on top of the API
TASK BASED UINEW WEAPON UNLOCKED
LEVEL 9 TROUBLESHOOTING AND DEBUGGING
There is no F5 in distributed systems
Correlate all your requests and messages
Use centralized logging services
INSIDE THE RABBIT HOLE
REST API
Domain Service
ACL Service
ES Dispatcher
Service
Creative Upload
API
Creative Upload Service
Ad Analyzer Service
File Checker Service
File Generation
Service
Publishing Service
Preview Service
TRACK OPERATIONS
TIP Track every operation performance ndashthis helps to identify bottlenecks
TIP Automate load tests and run them often
CORRELATION IDSNEW ITEM UNLOCKED NIGHT VISION
YOU DONrsquoT NEED THEM ALL - CHOOSE WISELY
De-normalized read models
Strategic design
CQRS
Event sourcing
Projections
ACLs
REST API
Task based UI
Centralized logs
LOTS OF GUNS
BUT WHAT IFhellip
No guns for You
ADAPT TO BUSINESS THINKING
Avoid ndash technical arguments
Code quality is poor
We need to refactor
Technology is old
Everyone is using Angular nowhellip
Missing ldquobest practicesrdquo
We want to try NoSQLhellip
Prefer ndash economical arguments
Releases every day
Faster feature development
New products
Involve more developers
MS licenses are expensivehellip
DONrsquoT GET LOST IN A DUNGEON
Have a VISION
COMMIT
Define Your STRATEGY
Create TACTICS
FIGHT
ADOPT new tactics
Fight HARDER
WIN
SYNC NEW TO OLD
Banner Event
Event Store Dispatcher
ACL Service
RabbitMQ
AdministrationDB
Reacts to domain events
Makes changes into AdsministrationDBwithin small transactions
Uses Dapper to simplify persistence
SYNC OLD TO NEW
Legacy event
ACL Service
RabbitMQReacts to legacy events (AdCreatedAdUpdated)
ACL transforms events into commands
Aggregates are updated
Banner Management
Service
Commands From old system
Events
TIP Make legacy integration interactions explicit
ANTI-CORRUPTION LAYERSNEW WEAPON UNLOCKED
LEVEL 7 API
This is the only way to interact with your system
Build UI on top of the API
Versioning is difficult ndash think if you really need it
EXPOSE COMMANDS AS RESOURCES
PUT httpImageBaneruuidName
Command RenameBanner
PUT httpImageBaneruuidFile
Command ReuploadFile
HYPERMEDIA ndash HELP YOUR CLIENT
GET httpImageBanneruuid
HTTP APINEW WEAPON UNLOCKED
LEVEL 8 UI amp UX
Excel is already invented itrsquos pretty damn good
UI must be built on top of your API
Guide user through business process
BEFORE
AFTER
TIP Build UI to solve business cases but not to edit data
TIP Exposing tasks can reduce overhead for users and for developers
TIP Build UI on top of the API
TASK BASED UINEW WEAPON UNLOCKED
LEVEL 9 TROUBLESHOOTING AND DEBUGGING
There is no F5 in distributed systems
Correlate all your requests and messages
Use centralized logging services
INSIDE THE RABBIT HOLE
REST API
Domain Service
ACL Service
ES Dispatcher
Service
Creative Upload
API
Creative Upload Service
Ad Analyzer Service
File Checker Service
File Generation
Service
Publishing Service
Preview Service
TRACK OPERATIONS
TIP Track every operation performance ndashthis helps to identify bottlenecks
TIP Automate load tests and run them often
CORRELATION IDSNEW ITEM UNLOCKED NIGHT VISION
YOU DONrsquoT NEED THEM ALL - CHOOSE WISELY
De-normalized read models
Strategic design
CQRS
Event sourcing
Projections
ACLs
REST API
Task based UI
Centralized logs
LOTS OF GUNS
BUT WHAT IFhellip
No guns for You
ADAPT TO BUSINESS THINKING
Avoid ndash technical arguments
Code quality is poor
We need to refactor
Technology is old
Everyone is using Angular nowhellip
Missing ldquobest practicesrdquo
We want to try NoSQLhellip
Prefer ndash economical arguments
Releases every day
Faster feature development
New products
Involve more developers
MS licenses are expensivehellip
DONrsquoT GET LOST IN A DUNGEON
Have a VISION
COMMIT
Define Your STRATEGY
Create TACTICS
FIGHT
ADOPT new tactics
Fight HARDER
WIN
SYNC OLD TO NEW
Legacy event
ACL Service
RabbitMQReacts to legacy events (AdCreatedAdUpdated)
ACL transforms events into commands
Aggregates are updated
Banner Management
Service
Commands From old system
Events
TIP Make legacy integration interactions explicit
ANTI-CORRUPTION LAYERSNEW WEAPON UNLOCKED
LEVEL 7 API
This is the only way to interact with your system
Build UI on top of the API
Versioning is difficult ndash think if you really need it
EXPOSE COMMANDS AS RESOURCES
PUT httpImageBaneruuidName
Command RenameBanner
PUT httpImageBaneruuidFile
Command ReuploadFile
HYPERMEDIA ndash HELP YOUR CLIENT
GET httpImageBanneruuid
HTTP APINEW WEAPON UNLOCKED
LEVEL 8 UI amp UX
Excel is already invented itrsquos pretty damn good
UI must be built on top of your API
Guide user through business process
BEFORE
AFTER
TIP Build UI to solve business cases but not to edit data
TIP Exposing tasks can reduce overhead for users and for developers
TIP Build UI on top of the API
TASK BASED UINEW WEAPON UNLOCKED
LEVEL 9 TROUBLESHOOTING AND DEBUGGING
There is no F5 in distributed systems
Correlate all your requests and messages
Use centralized logging services
INSIDE THE RABBIT HOLE
REST API
Domain Service
ACL Service
ES Dispatcher
Service
Creative Upload
API
Creative Upload Service
Ad Analyzer Service
File Checker Service
File Generation
Service
Publishing Service
Preview Service
TRACK OPERATIONS
TIP Track every operation performance ndashthis helps to identify bottlenecks
TIP Automate load tests and run them often
CORRELATION IDSNEW ITEM UNLOCKED NIGHT VISION
YOU DONrsquoT NEED THEM ALL - CHOOSE WISELY
De-normalized read models
Strategic design
CQRS
Event sourcing
Projections
ACLs
REST API
Task based UI
Centralized logs
LOTS OF GUNS
BUT WHAT IFhellip
No guns for You
ADAPT TO BUSINESS THINKING
Avoid ndash technical arguments
Code quality is poor
We need to refactor
Technology is old
Everyone is using Angular nowhellip
Missing ldquobest practicesrdquo
We want to try NoSQLhellip
Prefer ndash economical arguments
Releases every day
Faster feature development
New products
Involve more developers
MS licenses are expensivehellip
DONrsquoT GET LOST IN A DUNGEON
Have a VISION
COMMIT
Define Your STRATEGY
Create TACTICS
FIGHT
ADOPT new tactics
Fight HARDER
WIN
TIP Make legacy integration interactions explicit
ANTI-CORRUPTION LAYERSNEW WEAPON UNLOCKED
LEVEL 7 API
This is the only way to interact with your system
Build UI on top of the API
Versioning is difficult ndash think if you really need it
EXPOSE COMMANDS AS RESOURCES
PUT httpImageBaneruuidName
Command RenameBanner
PUT httpImageBaneruuidFile
Command ReuploadFile
HYPERMEDIA ndash HELP YOUR CLIENT
GET httpImageBanneruuid
HTTP APINEW WEAPON UNLOCKED
LEVEL 8 UI amp UX
Excel is already invented itrsquos pretty damn good
UI must be built on top of your API
Guide user through business process
BEFORE
AFTER
TIP Build UI to solve business cases but not to edit data
TIP Exposing tasks can reduce overhead for users and for developers
TIP Build UI on top of the API
TASK BASED UINEW WEAPON UNLOCKED
LEVEL 9 TROUBLESHOOTING AND DEBUGGING
There is no F5 in distributed systems
Correlate all your requests and messages
Use centralized logging services
INSIDE THE RABBIT HOLE
REST API
Domain Service
ACL Service
ES Dispatcher
Service
Creative Upload
API
Creative Upload Service
Ad Analyzer Service
File Checker Service
File Generation
Service
Publishing Service
Preview Service
TRACK OPERATIONS
TIP Track every operation performance ndashthis helps to identify bottlenecks
TIP Automate load tests and run them often
CORRELATION IDSNEW ITEM UNLOCKED NIGHT VISION
YOU DONrsquoT NEED THEM ALL - CHOOSE WISELY
De-normalized read models
Strategic design
CQRS
Event sourcing
Projections
ACLs
REST API
Task based UI
Centralized logs
LOTS OF GUNS
BUT WHAT IFhellip
No guns for You
ADAPT TO BUSINESS THINKING
Avoid ndash technical arguments
Code quality is poor
We need to refactor
Technology is old
Everyone is using Angular nowhellip
Missing ldquobest practicesrdquo
We want to try NoSQLhellip
Prefer ndash economical arguments
Releases every day
Faster feature development
New products
Involve more developers
MS licenses are expensivehellip
DONrsquoT GET LOST IN A DUNGEON
Have a VISION
COMMIT
Define Your STRATEGY
Create TACTICS
FIGHT
ADOPT new tactics
Fight HARDER
WIN
ANTI-CORRUPTION LAYERSNEW WEAPON UNLOCKED
LEVEL 7 API
This is the only way to interact with your system
Build UI on top of the API
Versioning is difficult ndash think if you really need it
EXPOSE COMMANDS AS RESOURCES
PUT httpImageBaneruuidName
Command RenameBanner
PUT httpImageBaneruuidFile
Command ReuploadFile
HYPERMEDIA ndash HELP YOUR CLIENT
GET httpImageBanneruuid
HTTP APINEW WEAPON UNLOCKED
LEVEL 8 UI amp UX
Excel is already invented itrsquos pretty damn good
UI must be built on top of your API
Guide user through business process
BEFORE
AFTER
TIP Build UI to solve business cases but not to edit data
TIP Exposing tasks can reduce overhead for users and for developers
TIP Build UI on top of the API
TASK BASED UINEW WEAPON UNLOCKED
LEVEL 9 TROUBLESHOOTING AND DEBUGGING
There is no F5 in distributed systems
Correlate all your requests and messages
Use centralized logging services
INSIDE THE RABBIT HOLE
REST API
Domain Service
ACL Service
ES Dispatcher
Service
Creative Upload
API
Creative Upload Service
Ad Analyzer Service
File Checker Service
File Generation
Service
Publishing Service
Preview Service
TRACK OPERATIONS
TIP Track every operation performance ndashthis helps to identify bottlenecks
TIP Automate load tests and run them often
CORRELATION IDSNEW ITEM UNLOCKED NIGHT VISION
YOU DONrsquoT NEED THEM ALL - CHOOSE WISELY
De-normalized read models
Strategic design
CQRS
Event sourcing
Projections
ACLs
REST API
Task based UI
Centralized logs
LOTS OF GUNS
BUT WHAT IFhellip
No guns for You
ADAPT TO BUSINESS THINKING
Avoid ndash technical arguments
Code quality is poor
We need to refactor
Technology is old
Everyone is using Angular nowhellip
Missing ldquobest practicesrdquo
We want to try NoSQLhellip
Prefer ndash economical arguments
Releases every day
Faster feature development
New products
Involve more developers
MS licenses are expensivehellip
DONrsquoT GET LOST IN A DUNGEON
Have a VISION
COMMIT
Define Your STRATEGY
Create TACTICS
FIGHT
ADOPT new tactics
Fight HARDER
WIN
LEVEL 7 API
This is the only way to interact with your system
Build UI on top of the API
Versioning is difficult ndash think if you really need it
EXPOSE COMMANDS AS RESOURCES
PUT httpImageBaneruuidName
Command RenameBanner
PUT httpImageBaneruuidFile
Command ReuploadFile
HYPERMEDIA ndash HELP YOUR CLIENT
GET httpImageBanneruuid
HTTP APINEW WEAPON UNLOCKED
LEVEL 8 UI amp UX
Excel is already invented itrsquos pretty damn good
UI must be built on top of your API
Guide user through business process
BEFORE
AFTER
TIP Build UI to solve business cases but not to edit data
TIP Exposing tasks can reduce overhead for users and for developers
TIP Build UI on top of the API
TASK BASED UINEW WEAPON UNLOCKED
LEVEL 9 TROUBLESHOOTING AND DEBUGGING
There is no F5 in distributed systems
Correlate all your requests and messages
Use centralized logging services
INSIDE THE RABBIT HOLE
REST API
Domain Service
ACL Service
ES Dispatcher
Service
Creative Upload
API
Creative Upload Service
Ad Analyzer Service
File Checker Service
File Generation
Service
Publishing Service
Preview Service
TRACK OPERATIONS
TIP Track every operation performance ndashthis helps to identify bottlenecks
TIP Automate load tests and run them often
CORRELATION IDSNEW ITEM UNLOCKED NIGHT VISION
YOU DONrsquoT NEED THEM ALL - CHOOSE WISELY
De-normalized read models
Strategic design
CQRS
Event sourcing
Projections
ACLs
REST API
Task based UI
Centralized logs
LOTS OF GUNS
BUT WHAT IFhellip
No guns for You
ADAPT TO BUSINESS THINKING
Avoid ndash technical arguments
Code quality is poor
We need to refactor
Technology is old
Everyone is using Angular nowhellip
Missing ldquobest practicesrdquo
We want to try NoSQLhellip
Prefer ndash economical arguments
Releases every day
Faster feature development
New products
Involve more developers
MS licenses are expensivehellip
DONrsquoT GET LOST IN A DUNGEON
Have a VISION
COMMIT
Define Your STRATEGY
Create TACTICS
FIGHT
ADOPT new tactics
Fight HARDER
WIN
EXPOSE COMMANDS AS RESOURCES
PUT httpImageBaneruuidName
Command RenameBanner
PUT httpImageBaneruuidFile
Command ReuploadFile
HYPERMEDIA ndash HELP YOUR CLIENT
GET httpImageBanneruuid
HTTP APINEW WEAPON UNLOCKED
LEVEL 8 UI amp UX
Excel is already invented itrsquos pretty damn good
UI must be built on top of your API
Guide user through business process
BEFORE
AFTER
TIP Build UI to solve business cases but not to edit data
TIP Exposing tasks can reduce overhead for users and for developers
TIP Build UI on top of the API
TASK BASED UINEW WEAPON UNLOCKED
LEVEL 9 TROUBLESHOOTING AND DEBUGGING
There is no F5 in distributed systems
Correlate all your requests and messages
Use centralized logging services
INSIDE THE RABBIT HOLE
REST API
Domain Service
ACL Service
ES Dispatcher
Service
Creative Upload
API
Creative Upload Service
Ad Analyzer Service
File Checker Service
File Generation
Service
Publishing Service
Preview Service
TRACK OPERATIONS
TIP Track every operation performance ndashthis helps to identify bottlenecks
TIP Automate load tests and run them often
CORRELATION IDSNEW ITEM UNLOCKED NIGHT VISION
YOU DONrsquoT NEED THEM ALL - CHOOSE WISELY
De-normalized read models
Strategic design
CQRS
Event sourcing
Projections
ACLs
REST API
Task based UI
Centralized logs
LOTS OF GUNS
BUT WHAT IFhellip
No guns for You
ADAPT TO BUSINESS THINKING
Avoid ndash technical arguments
Code quality is poor
We need to refactor
Technology is old
Everyone is using Angular nowhellip
Missing ldquobest practicesrdquo
We want to try NoSQLhellip
Prefer ndash economical arguments
Releases every day
Faster feature development
New products
Involve more developers
MS licenses are expensivehellip
DONrsquoT GET LOST IN A DUNGEON
Have a VISION
COMMIT
Define Your STRATEGY
Create TACTICS
FIGHT
ADOPT new tactics
Fight HARDER
WIN
HYPERMEDIA ndash HELP YOUR CLIENT
GET httpImageBanneruuid
HTTP APINEW WEAPON UNLOCKED
LEVEL 8 UI amp UX
Excel is already invented itrsquos pretty damn good
UI must be built on top of your API
Guide user through business process
BEFORE
AFTER
TIP Build UI to solve business cases but not to edit data
TIP Exposing tasks can reduce overhead for users and for developers
TIP Build UI on top of the API
TASK BASED UINEW WEAPON UNLOCKED
LEVEL 9 TROUBLESHOOTING AND DEBUGGING
There is no F5 in distributed systems
Correlate all your requests and messages
Use centralized logging services
INSIDE THE RABBIT HOLE
REST API
Domain Service
ACL Service
ES Dispatcher
Service
Creative Upload
API
Creative Upload Service
Ad Analyzer Service
File Checker Service
File Generation
Service
Publishing Service
Preview Service
TRACK OPERATIONS
TIP Track every operation performance ndashthis helps to identify bottlenecks
TIP Automate load tests and run them often
CORRELATION IDSNEW ITEM UNLOCKED NIGHT VISION
YOU DONrsquoT NEED THEM ALL - CHOOSE WISELY
De-normalized read models
Strategic design
CQRS
Event sourcing
Projections
ACLs
REST API
Task based UI
Centralized logs
LOTS OF GUNS
BUT WHAT IFhellip
No guns for You
ADAPT TO BUSINESS THINKING
Avoid ndash technical arguments
Code quality is poor
We need to refactor
Technology is old
Everyone is using Angular nowhellip
Missing ldquobest practicesrdquo
We want to try NoSQLhellip
Prefer ndash economical arguments
Releases every day
Faster feature development
New products
Involve more developers
MS licenses are expensivehellip
DONrsquoT GET LOST IN A DUNGEON
Have a VISION
COMMIT
Define Your STRATEGY
Create TACTICS
FIGHT
ADOPT new tactics
Fight HARDER
WIN
HTTP APINEW WEAPON UNLOCKED
LEVEL 8 UI amp UX
Excel is already invented itrsquos pretty damn good
UI must be built on top of your API
Guide user through business process
BEFORE
AFTER
TIP Build UI to solve business cases but not to edit data
TIP Exposing tasks can reduce overhead for users and for developers
TIP Build UI on top of the API
TASK BASED UINEW WEAPON UNLOCKED
LEVEL 9 TROUBLESHOOTING AND DEBUGGING
There is no F5 in distributed systems
Correlate all your requests and messages
Use centralized logging services
INSIDE THE RABBIT HOLE
REST API
Domain Service
ACL Service
ES Dispatcher
Service
Creative Upload
API
Creative Upload Service
Ad Analyzer Service
File Checker Service
File Generation
Service
Publishing Service
Preview Service
TRACK OPERATIONS
TIP Track every operation performance ndashthis helps to identify bottlenecks
TIP Automate load tests and run them often
CORRELATION IDSNEW ITEM UNLOCKED NIGHT VISION
YOU DONrsquoT NEED THEM ALL - CHOOSE WISELY
De-normalized read models
Strategic design
CQRS
Event sourcing
Projections
ACLs
REST API
Task based UI
Centralized logs
LOTS OF GUNS
BUT WHAT IFhellip
No guns for You
ADAPT TO BUSINESS THINKING
Avoid ndash technical arguments
Code quality is poor
We need to refactor
Technology is old
Everyone is using Angular nowhellip
Missing ldquobest practicesrdquo
We want to try NoSQLhellip
Prefer ndash economical arguments
Releases every day
Faster feature development
New products
Involve more developers
MS licenses are expensivehellip
DONrsquoT GET LOST IN A DUNGEON
Have a VISION
COMMIT
Define Your STRATEGY
Create TACTICS
FIGHT
ADOPT new tactics
Fight HARDER
WIN
LEVEL 8 UI amp UX
Excel is already invented itrsquos pretty damn good
UI must be built on top of your API
Guide user through business process
BEFORE
AFTER
TIP Build UI to solve business cases but not to edit data
TIP Exposing tasks can reduce overhead for users and for developers
TIP Build UI on top of the API
TASK BASED UINEW WEAPON UNLOCKED
LEVEL 9 TROUBLESHOOTING AND DEBUGGING
There is no F5 in distributed systems
Correlate all your requests and messages
Use centralized logging services
INSIDE THE RABBIT HOLE
REST API
Domain Service
ACL Service
ES Dispatcher
Service
Creative Upload
API
Creative Upload Service
Ad Analyzer Service
File Checker Service
File Generation
Service
Publishing Service
Preview Service
TRACK OPERATIONS
TIP Track every operation performance ndashthis helps to identify bottlenecks
TIP Automate load tests and run them often
CORRELATION IDSNEW ITEM UNLOCKED NIGHT VISION
YOU DONrsquoT NEED THEM ALL - CHOOSE WISELY
De-normalized read models
Strategic design
CQRS
Event sourcing
Projections
ACLs
REST API
Task based UI
Centralized logs
LOTS OF GUNS
BUT WHAT IFhellip
No guns for You
ADAPT TO BUSINESS THINKING
Avoid ndash technical arguments
Code quality is poor
We need to refactor
Technology is old
Everyone is using Angular nowhellip
Missing ldquobest practicesrdquo
We want to try NoSQLhellip
Prefer ndash economical arguments
Releases every day
Faster feature development
New products
Involve more developers
MS licenses are expensivehellip
DONrsquoT GET LOST IN A DUNGEON
Have a VISION
COMMIT
Define Your STRATEGY
Create TACTICS
FIGHT
ADOPT new tactics
Fight HARDER
WIN
BEFORE
AFTER
TIP Build UI to solve business cases but not to edit data
TIP Exposing tasks can reduce overhead for users and for developers
TIP Build UI on top of the API
TASK BASED UINEW WEAPON UNLOCKED
LEVEL 9 TROUBLESHOOTING AND DEBUGGING
There is no F5 in distributed systems
Correlate all your requests and messages
Use centralized logging services
INSIDE THE RABBIT HOLE
REST API
Domain Service
ACL Service
ES Dispatcher
Service
Creative Upload
API
Creative Upload Service
Ad Analyzer Service
File Checker Service
File Generation
Service
Publishing Service
Preview Service
TRACK OPERATIONS
TIP Track every operation performance ndashthis helps to identify bottlenecks
TIP Automate load tests and run them often
CORRELATION IDSNEW ITEM UNLOCKED NIGHT VISION
YOU DONrsquoT NEED THEM ALL - CHOOSE WISELY
De-normalized read models
Strategic design
CQRS
Event sourcing
Projections
ACLs
REST API
Task based UI
Centralized logs
LOTS OF GUNS
BUT WHAT IFhellip
No guns for You
ADAPT TO BUSINESS THINKING
Avoid ndash technical arguments
Code quality is poor
We need to refactor
Technology is old
Everyone is using Angular nowhellip
Missing ldquobest practicesrdquo
We want to try NoSQLhellip
Prefer ndash economical arguments
Releases every day
Faster feature development
New products
Involve more developers
MS licenses are expensivehellip
DONrsquoT GET LOST IN A DUNGEON
Have a VISION
COMMIT
Define Your STRATEGY
Create TACTICS
FIGHT
ADOPT new tactics
Fight HARDER
WIN
AFTER
TIP Build UI to solve business cases but not to edit data
TIP Exposing tasks can reduce overhead for users and for developers
TIP Build UI on top of the API
TASK BASED UINEW WEAPON UNLOCKED
LEVEL 9 TROUBLESHOOTING AND DEBUGGING
There is no F5 in distributed systems
Correlate all your requests and messages
Use centralized logging services
INSIDE THE RABBIT HOLE
REST API
Domain Service
ACL Service
ES Dispatcher
Service
Creative Upload
API
Creative Upload Service
Ad Analyzer Service
File Checker Service
File Generation
Service
Publishing Service
Preview Service
TRACK OPERATIONS
TIP Track every operation performance ndashthis helps to identify bottlenecks
TIP Automate load tests and run them often
CORRELATION IDSNEW ITEM UNLOCKED NIGHT VISION
YOU DONrsquoT NEED THEM ALL - CHOOSE WISELY
De-normalized read models
Strategic design
CQRS
Event sourcing
Projections
ACLs
REST API
Task based UI
Centralized logs
LOTS OF GUNS
BUT WHAT IFhellip
No guns for You
ADAPT TO BUSINESS THINKING
Avoid ndash technical arguments
Code quality is poor
We need to refactor
Technology is old
Everyone is using Angular nowhellip
Missing ldquobest practicesrdquo
We want to try NoSQLhellip
Prefer ndash economical arguments
Releases every day
Faster feature development
New products
Involve more developers
MS licenses are expensivehellip
DONrsquoT GET LOST IN A DUNGEON
Have a VISION
COMMIT
Define Your STRATEGY
Create TACTICS
FIGHT
ADOPT new tactics
Fight HARDER
WIN
TIP Build UI to solve business cases but not to edit data
TIP Exposing tasks can reduce overhead for users and for developers
TIP Build UI on top of the API
TASK BASED UINEW WEAPON UNLOCKED
LEVEL 9 TROUBLESHOOTING AND DEBUGGING
There is no F5 in distributed systems
Correlate all your requests and messages
Use centralized logging services
INSIDE THE RABBIT HOLE
REST API
Domain Service
ACL Service
ES Dispatcher
Service
Creative Upload
API
Creative Upload Service
Ad Analyzer Service
File Checker Service
File Generation
Service
Publishing Service
Preview Service
TRACK OPERATIONS
TIP Track every operation performance ndashthis helps to identify bottlenecks
TIP Automate load tests and run them often
CORRELATION IDSNEW ITEM UNLOCKED NIGHT VISION
YOU DONrsquoT NEED THEM ALL - CHOOSE WISELY
De-normalized read models
Strategic design
CQRS
Event sourcing
Projections
ACLs
REST API
Task based UI
Centralized logs
LOTS OF GUNS
BUT WHAT IFhellip
No guns for You
ADAPT TO BUSINESS THINKING
Avoid ndash technical arguments
Code quality is poor
We need to refactor
Technology is old
Everyone is using Angular nowhellip
Missing ldquobest practicesrdquo
We want to try NoSQLhellip
Prefer ndash economical arguments
Releases every day
Faster feature development
New products
Involve more developers
MS licenses are expensivehellip
DONrsquoT GET LOST IN A DUNGEON
Have a VISION
COMMIT
Define Your STRATEGY
Create TACTICS
FIGHT
ADOPT new tactics
Fight HARDER
WIN
TASK BASED UINEW WEAPON UNLOCKED
LEVEL 9 TROUBLESHOOTING AND DEBUGGING
There is no F5 in distributed systems
Correlate all your requests and messages
Use centralized logging services
INSIDE THE RABBIT HOLE
REST API
Domain Service
ACL Service
ES Dispatcher
Service
Creative Upload
API
Creative Upload Service
Ad Analyzer Service
File Checker Service
File Generation
Service
Publishing Service
Preview Service
TRACK OPERATIONS
TIP Track every operation performance ndashthis helps to identify bottlenecks
TIP Automate load tests and run them often
CORRELATION IDSNEW ITEM UNLOCKED NIGHT VISION
YOU DONrsquoT NEED THEM ALL - CHOOSE WISELY
De-normalized read models
Strategic design
CQRS
Event sourcing
Projections
ACLs
REST API
Task based UI
Centralized logs
LOTS OF GUNS
BUT WHAT IFhellip
No guns for You
ADAPT TO BUSINESS THINKING
Avoid ndash technical arguments
Code quality is poor
We need to refactor
Technology is old
Everyone is using Angular nowhellip
Missing ldquobest practicesrdquo
We want to try NoSQLhellip
Prefer ndash economical arguments
Releases every day
Faster feature development
New products
Involve more developers
MS licenses are expensivehellip
DONrsquoT GET LOST IN A DUNGEON
Have a VISION
COMMIT
Define Your STRATEGY
Create TACTICS
FIGHT
ADOPT new tactics
Fight HARDER
WIN
LEVEL 9 TROUBLESHOOTING AND DEBUGGING
There is no F5 in distributed systems
Correlate all your requests and messages
Use centralized logging services
INSIDE THE RABBIT HOLE
REST API
Domain Service
ACL Service
ES Dispatcher
Service
Creative Upload
API
Creative Upload Service
Ad Analyzer Service
File Checker Service
File Generation
Service
Publishing Service
Preview Service
TRACK OPERATIONS
TIP Track every operation performance ndashthis helps to identify bottlenecks
TIP Automate load tests and run them often
CORRELATION IDSNEW ITEM UNLOCKED NIGHT VISION
YOU DONrsquoT NEED THEM ALL - CHOOSE WISELY
De-normalized read models
Strategic design
CQRS
Event sourcing
Projections
ACLs
REST API
Task based UI
Centralized logs
LOTS OF GUNS
BUT WHAT IFhellip
No guns for You
ADAPT TO BUSINESS THINKING
Avoid ndash technical arguments
Code quality is poor
We need to refactor
Technology is old
Everyone is using Angular nowhellip
Missing ldquobest practicesrdquo
We want to try NoSQLhellip
Prefer ndash economical arguments
Releases every day
Faster feature development
New products
Involve more developers
MS licenses are expensivehellip
DONrsquoT GET LOST IN A DUNGEON
Have a VISION
COMMIT
Define Your STRATEGY
Create TACTICS
FIGHT
ADOPT new tactics
Fight HARDER
WIN
INSIDE THE RABBIT HOLE
REST API
Domain Service
ACL Service
ES Dispatcher
Service
Creative Upload
API
Creative Upload Service
Ad Analyzer Service
File Checker Service
File Generation
Service
Publishing Service
Preview Service
TRACK OPERATIONS
TIP Track every operation performance ndashthis helps to identify bottlenecks
TIP Automate load tests and run them often
CORRELATION IDSNEW ITEM UNLOCKED NIGHT VISION
YOU DONrsquoT NEED THEM ALL - CHOOSE WISELY
De-normalized read models
Strategic design
CQRS
Event sourcing
Projections
ACLs
REST API
Task based UI
Centralized logs
LOTS OF GUNS
BUT WHAT IFhellip
No guns for You
ADAPT TO BUSINESS THINKING
Avoid ndash technical arguments
Code quality is poor
We need to refactor
Technology is old
Everyone is using Angular nowhellip
Missing ldquobest practicesrdquo
We want to try NoSQLhellip
Prefer ndash economical arguments
Releases every day
Faster feature development
New products
Involve more developers
MS licenses are expensivehellip
DONrsquoT GET LOST IN A DUNGEON
Have a VISION
COMMIT
Define Your STRATEGY
Create TACTICS
FIGHT
ADOPT new tactics
Fight HARDER
WIN
TRACK OPERATIONS
TIP Track every operation performance ndashthis helps to identify bottlenecks
TIP Automate load tests and run them often
CORRELATION IDSNEW ITEM UNLOCKED NIGHT VISION
YOU DONrsquoT NEED THEM ALL - CHOOSE WISELY
De-normalized read models
Strategic design
CQRS
Event sourcing
Projections
ACLs
REST API
Task based UI
Centralized logs
LOTS OF GUNS
BUT WHAT IFhellip
No guns for You
ADAPT TO BUSINESS THINKING
Avoid ndash technical arguments
Code quality is poor
We need to refactor
Technology is old
Everyone is using Angular nowhellip
Missing ldquobest practicesrdquo
We want to try NoSQLhellip
Prefer ndash economical arguments
Releases every day
Faster feature development
New products
Involve more developers
MS licenses are expensivehellip
DONrsquoT GET LOST IN A DUNGEON
Have a VISION
COMMIT
Define Your STRATEGY
Create TACTICS
FIGHT
ADOPT new tactics
Fight HARDER
WIN
TIP Track every operation performance ndashthis helps to identify bottlenecks
TIP Automate load tests and run them often
CORRELATION IDSNEW ITEM UNLOCKED NIGHT VISION
YOU DONrsquoT NEED THEM ALL - CHOOSE WISELY
De-normalized read models
Strategic design
CQRS
Event sourcing
Projections
ACLs
REST API
Task based UI
Centralized logs
LOTS OF GUNS
BUT WHAT IFhellip
No guns for You
ADAPT TO BUSINESS THINKING
Avoid ndash technical arguments
Code quality is poor
We need to refactor
Technology is old
Everyone is using Angular nowhellip
Missing ldquobest practicesrdquo
We want to try NoSQLhellip
Prefer ndash economical arguments
Releases every day
Faster feature development
New products
Involve more developers
MS licenses are expensivehellip
DONrsquoT GET LOST IN A DUNGEON
Have a VISION
COMMIT
Define Your STRATEGY
Create TACTICS
FIGHT
ADOPT new tactics
Fight HARDER
WIN
CORRELATION IDSNEW ITEM UNLOCKED NIGHT VISION
YOU DONrsquoT NEED THEM ALL - CHOOSE WISELY
De-normalized read models
Strategic design
CQRS
Event sourcing
Projections
ACLs
REST API
Task based UI
Centralized logs
LOTS OF GUNS
BUT WHAT IFhellip
No guns for You
ADAPT TO BUSINESS THINKING
Avoid ndash technical arguments
Code quality is poor
We need to refactor
Technology is old
Everyone is using Angular nowhellip
Missing ldquobest practicesrdquo
We want to try NoSQLhellip
Prefer ndash economical arguments
Releases every day
Faster feature development
New products
Involve more developers
MS licenses are expensivehellip
DONrsquoT GET LOST IN A DUNGEON
Have a VISION
COMMIT
Define Your STRATEGY
Create TACTICS
FIGHT
ADOPT new tactics
Fight HARDER
WIN
YOU DONrsquoT NEED THEM ALL - CHOOSE WISELY
De-normalized read models
Strategic design
CQRS
Event sourcing
Projections
ACLs
REST API
Task based UI
Centralized logs
LOTS OF GUNS
BUT WHAT IFhellip
No guns for You
ADAPT TO BUSINESS THINKING
Avoid ndash technical arguments
Code quality is poor
We need to refactor
Technology is old
Everyone is using Angular nowhellip
Missing ldquobest practicesrdquo
We want to try NoSQLhellip
Prefer ndash economical arguments
Releases every day
Faster feature development
New products
Involve more developers
MS licenses are expensivehellip
DONrsquoT GET LOST IN A DUNGEON
Have a VISION
COMMIT
Define Your STRATEGY
Create TACTICS
FIGHT
ADOPT new tactics
Fight HARDER
WIN
BUT WHAT IFhellip
No guns for You
ADAPT TO BUSINESS THINKING
Avoid ndash technical arguments
Code quality is poor
We need to refactor
Technology is old
Everyone is using Angular nowhellip
Missing ldquobest practicesrdquo
We want to try NoSQLhellip
Prefer ndash economical arguments
Releases every day
Faster feature development
New products
Involve more developers
MS licenses are expensivehellip
DONrsquoT GET LOST IN A DUNGEON
Have a VISION
COMMIT
Define Your STRATEGY
Create TACTICS
FIGHT
ADOPT new tactics
Fight HARDER
WIN
ADAPT TO BUSINESS THINKING
Avoid ndash technical arguments
Code quality is poor
We need to refactor
Technology is old
Everyone is using Angular nowhellip
Missing ldquobest practicesrdquo
We want to try NoSQLhellip
Prefer ndash economical arguments
Releases every day
Faster feature development
New products
Involve more developers
MS licenses are expensivehellip
DONrsquoT GET LOST IN A DUNGEON
Have a VISION
COMMIT
Define Your STRATEGY
Create TACTICS
FIGHT
ADOPT new tactics
Fight HARDER
WIN
DONrsquoT GET LOST IN A DUNGEON
Have a VISION
COMMIT
Define Your STRATEGY
Create TACTICS
FIGHT
ADOPT new tactics
Fight HARDER
WIN