docker cqrs react

138
CQRS, REACTJS, DOCKER IN A NUTSHELL Andrea Giuliano Claudio D'Alicandro Simone Di Maulo

Upload: simone-di-maulo

Post on 12-Apr-2017

114 views

Category:

Engineering


4 download

TRANSCRIPT

Page 1: Docker cqrs react

CQRS, REACTJS, DOCKERIN A NUTSHELL

Andrea GiulianoClaudio D'Alicandro Simone Di Maulo

Page 2: Docker cqrs react

NEW AMAZING PROJECT

Page 3: Docker cqrs react

WE CAN WRITE IT FROM SCRATCH

Page 4: Docker cqrs react

BUT

Page 5: Docker cqrs react

immagine manager incazzato

WE NEED IT IN A VERY FEW TIME

Page 6: Docker cqrs react

AND

Page 7: Docker cqrs react

IT SHOULD BE

Page 8: Docker cqrs react

WTF!

Page 9: Docker cqrs react

WHERE DO WE START?

Page 10: Docker cqrs react

COMFORT ZONE

Page 11: Docker cqrs react

DOMAIN

▸ data come from and go to external entities

▸ users can configure to send a subset of data

▸ users send data based on their plan

send data from a source to a targetGOAL

Page 12: Docker cqrs react

THE DOMAIN

▸ unpredictable data structures

▸ ad hoc workflow for each vendor

▸ variable number of steps

▸ handle rate limits from different vendors

▸ handle different error cases from different vendors

▸ handle business-oriented limits (based on plans...)

▸ some tasks need to be done asynchronously

Page 13: Docker cqrs react

IDEA

Page 14: Docker cqrs react

BLACK BOX REASONING▸ identify the main entities involved

▸ define a common input and output

▸ find a way to let things talk

INPUT OUTPUT

Page 15: Docker cqrs react

FROM BLACK BOXES TO BOUNDED CONTEXTS

Page 16: Docker cqrs react

DEPENDENCIES INFRA BC

MODEL

APPLICATION

PRESENTATION

Page 17: Docker cqrs react

PROJECT DIRECTORY TREE

Page 18: Docker cqrs react

APP DIRECTORY TREE

Page 19: Docker cqrs react

INFRASTRUCTURE DIRECTORY TREE

Page 20: Docker cqrs react

INSIDE THE BOUNDED CONTEXT

Page 21: Docker cqrs react

BC DIRECTORY TREE

Page 22: Docker cqrs react

BC APPLICATION DIRECTORY TREE

Page 23: Docker cqrs react

BC MODEL DIRECTORY TREE

Page 24: Docker cqrs react

BC PRESENTATION DIRECTORY TREE

Page 25: Docker cqrs react

EVERYTHING'S AWESOME

▸ the framework is an implementation detail

▸ the directory structure is explicit

▸ the domain is isolated

Page 26: Docker cqrs react

WE DON'T WANT TO MESS THINGS UP

Page 27: Docker cqrs react

DON'T MESS UP THINGS

Page 28: Docker cqrs react

WHAT'S THE ISSUE HERE

▸ understandable?

▸ code can't be reused

▸ high coupling

▸ untestable

▸ too many responsibilities

▸ hard to find bugs

▸ not changes-prone

Page 29: Docker cqrs react

WHAT WE WANT

Page 30: Docker cqrs react

COMMAND QUERY RESPONSIBILITY SEGREGATION AKA CQRS

A SOLUTION

Page 31: Docker cqrs react

CQRS

▸ separe reads from writes

▸ commands perform actions

▸ queries return data

▸ heterogeneous data storages

▸ easy scaling

▸ deal with eventual consistency

Page 32: Docker cqrs react

WRITE STORAGE

QUERY

COMMAND

COMMAND

COMMAND BUS

COMMAND HANDLERDOMAIN

REPOSITORY

READ STORAGEREPOSITORY

EVENT BUS

EVENT SUBSCRIBER

Page 33: Docker cqrs react

IT'S ALL ABOUT BUSES

Page 34: Docker cqrs react

IT'S ALL ABOUT BUSES COMMUNICATION

Page 35: Docker cqrs react

INTERNAL COMMUNICATION

BC

EVENT

COMMAND

Page 36: Docker cqrs react

MESSAGE BUS

$ composer require simple-bus/message-bus

Page 37: Docker cqrs react

COMMANDS

COMMAND BUS

Represent the change that should be done in the domain

They are named with a verb in the imperative tense and may include the aggregate type, for example ScheduleATask.

Page 38: Docker cqrs react

COMMANDS

COMMAND BUS

CONTROLLER

$commandBus->handle( ScheduleATask::fromTaskId($taskId) );

HANDLER

public function handle(Command $command) { //do something with the $command }

Page 39: Docker cqrs react

EVENTS

BC 1 BC 2

EVENT BUS

An event represents something that took place in the domain. They are always named with a past-participle verb, such as TaskScheduled

Page 40: Docker cqrs react

EVENTS

BC 1 BC 2

EVENT BUS

subscribes_to: 'user-created'

subscribes_to: 'task-stopped'

subscribes_to: 'task-suspended'

Page 41: Docker cqrs react

EVENTS

BC 1 BC 2

EVENT BUS

$messageBus->handle( UserCreatedEvent::fromUser($user) );

subscribes_to: 'user-created'

subscribes_to: 'task-stopped'

subscribes_to: 'task-suspended'$messageBus->handle( TaskSuspendedEvent::fromTask($task) );

Page 42: Docker cqrs react

COMMUNICATION AMONG BCS

BC 1 BC 2

QUEUE

NETWORK

Page 43: Docker cqrs react

QUEUE

BC 1 BC 2

QUEUE

$producer->publish($message); $consumer->consume($message);

Page 44: Docker cqrs react

NETWORK

BC 1 BC 2

NETWORK

$httpClient->post('/tasks/schedule');

POST /tasks/schedule

Page 45: Docker cqrs react

SCENARIO: TRIGGER THE TASKS SCHEDULE EVERY 10 MINUTES

TIMER

Page 46: Docker cqrs react

SCENARIO: TRIGGER THE TASKS SCHEDULE EVERY 10 MINUTES

TIMER SCHEDULERPOST /tasks/schedule

Page 47: Docker cqrs react

SCENARIO: TRIGGER THE TASKS SCHEDULE EVERY 10 MINUTES

TIMER SCHEDULERPOST /tasks/schedule

DATA STORAGE

$taskRepository->getAll()

Page 48: Docker cqrs react

SCENARIO: TRIGGER THE TASKS SCHEDULE EVERY 10 MINUTES

TIMER SCHEDULERPOST /tasks/schedule

DATA STORAGE

$taskRepository->getAll()

TASK QUEUE

enqueue($taskId)

Page 49: Docker cqrs react

SCENARIO: TRIGGER THE TASKS SCHEDULE EVERY 10 MINUTES

TIMER SCHEDULERPOST /tasks/schedule

DATA STORAGE

$taskRepository->getAll()

TASK QUEUE

enqueue($taskId)

W1 W2 W3 W..N...

Page 50: Docker cqrs react

LET ME SEE WHAT YOU HAVE DONE

IT'S TIME TO SHOW DOWN

Page 51: Docker cqrs react

WHAT THE TEAM HAS DELIVERED

Page 52: Docker cqrs react

WHAT THE MANAGEMENT SEE

Page 53: Docker cqrs react

WHAT THE MANAGEMENT WANTS

Page 54: Docker cqrs react

LET'S START FROM THE TEMPLATE

Page 55: Docker cqrs react

TWIG

Page 56: Docker cqrs react

THE FRONTEND STUFF

Page 57: Docker cqrs react

THE FRONTEND STUFFORDER DEPENDENT

Page 58: Docker cqrs react

THE FRONTEND STUFF

GLOBAL SCOPE

Page 59: Docker cqrs react

<script> $('.btn').click(function(e){

e.stopPropagation(); // Do something cool! }); </script>

NEVER TRUST THE GLOBAL SCOPE

Page 60: Docker cqrs react

A STEP BACKWARD

Page 61: Docker cqrs react

WE ARE BACKEND DEVELOPERS

Page 62: Docker cqrs react

OUR COMFORT ZONE

Page 63: Docker cqrs react

OOP

Page 64: Docker cqrs react

ENCAPSULATION

Page 65: Docker cqrs react

MODULES

Page 66: Docker cqrs react

DEPENDENCY INJECTION

Page 67: Docker cqrs react

GOOD NEWS

Page 68: Docker cqrs react
Page 69: Docker cqrs react

ECMASCRIPT 6

Page 70: Docker cqrs react

DEFAULT VALUES

Page 71: Docker cqrs react

CLASSES

Page 72: Docker cqrs react

INHERITANCE

Page 73: Docker cqrs react

CREATE YOUR MODULES

Page 74: Docker cqrs react

IMPORT A MODULE

Page 75: Docker cqrs react

IMPORT ONLY WHAT YOU NEED

Page 76: Docker cqrs react

WHAT ABOUT THE UI?

Page 77: Docker cqrs react
Page 78: Docker cqrs react

var React = require('react'); var ReactDOM = require('react-dom');

ReactDOM.render( <h1>Hello, world!</h1>, document.getElementById('app') );

Page 79: Docker cqrs react
Page 80: Docker cqrs react

https://kangax.github.io/compat-table/es6/

Page 81: Docker cqrs react
Page 82: Docker cqrs react

ASSETIC CUSTOM FILTERS

Page 83: Docker cqrs react
Page 84: Docker cqrs react

ANOTHER STEP BACKWARD

Page 85: Docker cqrs react

REMEMBER THE BOUNDED CONTEXT

Page 86: Docker cqrs react

A LOT OF SMALL COMPONENTS

Page 87: Docker cqrs react

A LOT OF SMALL APPLICATIONS

Page 88: Docker cqrs react

BOUNDED CONTEXT FACEBOOK BOUNDED CONTEXT MAILCHIMPBOUNDED CONTEXT MAPPING

Page 89: Docker cqrs react

BOUNDED CONTEXT FACEBOOK BOUNDED CONTEXT MAILCHIMPBOUNDED CONTEXT MAPPING

Page 90: Docker cqrs react

Gulp Bundler

+

BOUNDED CONTEXT FACEBOOK BOUNDED CONTEXT MAILCHIMPBOUNDED CONTEXT MAPPING

Page 91: Docker cqrs react

DEVELOPMENT WORKFLOW

Page 92: Docker cqrs react

$ docker/gulp

docker-compose run --rm --entrypoint bash npm -c "gulp"

Page 93: Docker cqrs react

// gulpfile.js var gulp = require('gulp'); var hub = require('gulp-hub');

process .env .WEBPACK_CONFIG_FILE = path.join( __dirname, 'webpack.config.js' ) ;

hub(['src/**/gulpfile.js']);

Page 94: Docker cqrs react

BOUNDED CONTEXT FACEBOOK BOUNDED CONTEXT MAILCHIMPBOUNDED CONTEXT MAPPING

gulpfile.js gulpfile.js gulpfile.js

Page 95: Docker cqrs react

BOUNDED CONTEXT FACEBOOK

gulpfile.js

"## FacebookPresentationBundle.php $## Resources "## assets "## config "## public $## views

Page 96: Docker cqrs react

$ app/console assets:install

LET'S EXPOSE TO THE WEB

Page 97: Docker cqrs react

APPLICATION ENTRYPOINT

Page 98: Docker cqrs react

IT'S A BIG WORLD OUT THERE!

Page 99: Docker cqrs react
Page 100: Docker cqrs react
Page 101: Docker cqrs react
Page 102: Docker cqrs react
Page 103: Docker cqrs react

THE DEVELOPMENT ENVIRONMENT

▸ Easy to use so many technologies at no installation cost

▸ Prepare the scaffolding for a new developer is extremely simple

▸ Superior performances over previous systems

Page 104: Docker cqrs react

docker-compose.yml docker-compose.dev.yml

Page 105: Docker cqrs react

THE INFRASTRUCTURE

Page 106: Docker cqrs react

THE INFRASTRUCTURE

Page 107: Docker cqrs react

THE INFRASTRUCTURE

Page 108: Docker cqrs react

THE INFRASTRUCTURE

Page 109: Docker cqrs react

THE INFRASTRUCTURE

VS

Page 110: Docker cqrs react

THE INFRASTRUCTURE

VS

Page 111: Docker cqrs react

STAGE

▸ Automate image building

▸ Copy the same structure used in dev

Page 112: Docker cqrs react

STAGE

▸ Automate image building

▸ Copy the same structure used in dev

Page 113: Docker cqrs react

AUFS: VOLUMES MIGHT BE A LITTLE HARDER THAN IT SEEMS

Page 114: Docker cqrs react

SYMFONY PARAMETERS

Page 115: Docker cqrs react

incenteev/composer-parameter-handler

Page 116: Docker cqrs react

DOCKER CLOUD REPOSITORY CONFIGURATION

Page 117: Docker cqrs react
Page 118: Docker cqrs react
Page 119: Docker cqrs react

DATA ONLY CONTAINER

Page 120: Docker cqrs react

DATA ONLY CONTAINER

Page 121: Docker cqrs react

DATA ONLY CONTAINER

Page 122: Docker cqrs react

DATA ONLY CONTAINER

Page 123: Docker cqrs react

FIRST DEPLOY

Page 124: Docker cqrs react

AN ELEPHANT IN THE ROOM... WE NEED

▸ Automated deploy strategy

▸ The freedom to easily scale

Page 125: Docker cqrs react

SCALE

$ docker-compose scale \web=2 \worker=3

Page 126: Docker cqrs react

HARD TRUTH

fpm:

image: 'adespresso/hubespresso-staging:fpm-latest'

deployment_strategy: every_node

sequential_deployment: true

tags:

- fpm

- hubespresso

- production

volumes:

- /var/www/project

volumes_from:

- shared-fpm.hubespresso-production

SCALE CONTAINERS IS WORTHLESS IF YOU DO NOT SCALE NODES

Page 127: Docker cqrs react

HARD TRUTH

SCALE CONTAINERS IS WORTHLESS IF YOU DO NOT SCALE NODES

fpm:

image: 'adespresso/hubespresso-staging:fpm-latest'

deployment_strategy: every_node

sequential_deployment: true

tags:

- fpm

- hubespresso

- production

volumes:

- /var/www/project

volumes_from:

- shared-fpm.hubespresso-production

Page 128: Docker cqrs react

DATA ONLY CONTAINER IS A PAIN

Page 129: Docker cqrs react
Page 130: Docker cqrs react

DEPLOYMENT

▸ deploy the infrastructure is not straightforward

▸ multiple container in multiple nodes

▸ every container has its own lifecycle

▸ we are not assuring zero-downtime on deployment

Page 131: Docker cqrs react

THE SOLUTION: GREEN BLUE DEPLOYMENT

Page 132: Docker cqrs react

THE SOLUTION: GREEN BLUE DEPLOYMENT

Page 133: Docker cqrs react

THE SOLUTION: GREEN BLUE DEPLOYMENT

Page 134: Docker cqrs react

CONCLUSION

Page 135: Docker cqrs react

CQRSPHP7

DOCKERREACTJS

MONGODBWEBPACKGULP

Page 136: Docker cqrs react

LEAVE THE COMFORT ZONE

Page 137: Docker cqrs react

THANKS

Page 138: Docker cqrs react

QUESTIONS?