Raimondas tijunaitis tackle_big_ball_of_mud_super_mario_style

51

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