TO YOUR ADVANTAGE LEVERAGING A DISTRIBUTED ARCHITECTURE
WHO AM I?
MICHELANGELO VAN DAM
▸ Professional PHP architect
▸ President PHPBenelux
▸ Coach at CoderDojo
▸ Contributor to open source projects
▸ Zend Certified Engineer
WHO AM I?
MICHELANGELO VAN DAM
▸ Professional PHP architect
▸ President PHPBenelux
▸ Coach at CoderDojo
▸ Contributor to open source projects
▸ Zend Certified Engineer Rafael Dohms
@rdohms
WHO AM I?
MICHELANGELO VAN DAM
▸ Professional PHP architect
▸ President PHPBenelux
▸ Coach at CoderDojo
▸ Contributor to open source projects
▸ Zend Certified Engineer Rafael Dohms
@rdohmsMe
@DragonBe
WHY USED?
SMALL WEB APPLICATIONS
▸ WordPress blogs
▸ Joomla marketing sites
▸ Drupal business sites
▸ TYPO3 publications
▸ A lot more …
BENEFITS GALORE
WE LOVE EASY
▸ Single point of concern
▸ Easy to maintain
▸ Easy to distribute
▸ Easy to protect
BENEFITS GALORE
WE LOVE EASY
▸ Single point of concern
▸ Easy to maintain
▸ Easy to distribute
▸ Easy to protect
NOT ALL SUNSHINE
DOESN'T SCALE WELL
▸ Increase of users
▸ Huge amount of data
▸ Additional logic or features
▸ Compliance requirements
Fatalerror:Allowedmemorysizeof268435456bytesexhausted(triedtoallocate77bytes)in/path/to/MassiveClass.phponline666
PHP
MySQL
Apache
Linux
P
M
A
L
PHP
MySQL
Apache
Linux
P
M
A
L
PHP
MySQL
Apache
Linux
P
M
A
L
PHP
MySQL
Apache
Linux
P
M
A
L
PHP
MySQL
Apache
Linux
P
M
A
L
PHP
MySQL
Apache
Linux
P
M
A
L
PHP
MySQL
Apache
Linux
P
M
A
L
PHP
MySQL
Apache
Linux
P
M
A
L
PHP
MySQL
Apache
Linux
P
M
A
L
PHP
MySQL
Apache
Linux
P
M
A
L
PHP
MySQL
Apache
Linux
P
M
A
L
PHP
MySQL
Apache
Linux
P
M
A
L
SCALING MISTAKE #1: DON’T ADD MORE MACHINES AND THINK YOU’RE SCALED.
Remember this!!!
TWEETABLE QUOTE
SOME WISDOM
SCALE WITH PURPOSE
▸ Separate based on responsibility
▸ Pinpoint your weakest link
▸ You need more of them
▸ Look for “alternate” (better) solutions
▸ e.g. Nginx vs. Apache
▸ Don’t over-scale
ANALYSING YOUR CODE
SOMETHING TO LOOK OUT FOR
resources.db.params.host = "database.server.tld" resources.db.params.port = 3306 resources.db.params.username = "fda23a84" resources.db.params.password = "b10a8db164e0754105b7a99be72e3fe5" resources.db.params.dbname = "webapp" resources.db.isDefaultTableAdapter = true
REPLACE WITH SOMETHING THAT CHANGES OUTSIDE YOUR APP
ENVIRONMENT VARIABLES CAN HELP
resources.db.params.host = WEBAPP_DB_HOST resources.db.params.port = WEBAPP_DB_PORT resources.db.params.username = WEBAPP_DB_USERNAME resources.db.params.password = WEBAPP_DB_PASSWORD resources.db.params.dbname = WEBAPP_DB_DBNAME resources.db.isDefaultTableAdapter = WEBAPP_DB_DEFAULT
HOW SOMETHING SIMPLE THINGS BECOMES VERY COMPLEX VERY QUICKLY
MORE ITEMS ADDED
▸ Caching
▸ Search engine
HOW SOMETHING SIMPLE THINGS BECOMES VERY COMPLEX VERY QUICKLY
MORE ITEMS ADDED
▸ Caching
▸ Search engine
▸ Load balancer
HOW SOMETHING SIMPLE THINGS BECOMES VERY COMPLEX VERY QUICKLY
MORE ITEMS ADDED
▸ Caching
▸ Search engine
▸ Load balancer
▸ Replication
HOW SOMETHING SIMPLE THINGS BECOMES VERY COMPLEX VERY QUICKLY
MORE ITEMS ADDED
▸ Caching
▸ Search engine
▸ Load balancer
▸ Replication
▸ Queues
HOW SOMETHING SIMPLE THINGS BECOMES VERY COMPLEX VERY QUICKLY
MORE ITEMS ADDED
▸ Caching
▸ Search engine
▸ Load balancer
▸ Replication
▸ Queues
▸ Workers
HOW SOMETHING SIMPLE THINGS BECOMES VERY COMPLEX VERY QUICKLY
MORE ITEMS ADDED
▸ Caching
▸ Search engine
▸ Load balancer
▸ Replication
▸ Queues
▸ Workers
▸ API’s
HOW SOMETHING SIMPLE THINGS BECOMES VERY COMPLEX VERY QUICKLY
MORE ITEMS ADDED
▸ Caching
▸ Search engine
▸ Load balancer
▸ Replication
▸ Queues
▸ Workers
▸ API’s
▸ and even more things …
PHP-FPM
NGINXShared FS
MariaDB
MariaDB
MariaDB
MongoDB
MongoDB
MongoDB
Redis Cache
Redis Cache
Redis Cache
ElasticSearch ElasticSearch
Varnish
RabbitMQ
PHP (workers)
PHP (workers)
PHP-FPM
NGINX
Source: The Register 2015-09-20
Source: CBS News 2017-02-28
Source: Forbes 2014-11-18
Source: ZDNet 2016-09-15
Source: C|Net 2009-06-29
Source: The Register 2016-04-20
Source: InfoWorld 2013-03-22
DynamoDB
EC2 EC2
Elas-csearchRDS-MySQLInstance
SQSQueueS3
Elas-cLoadBalancing
CloudFront
CloudSearch
West Europe
DynamoDB
EC2 EC2
Elas-csearchRDS-MySQLInstance
SQSQueueS3 CloudFront
CloudSearch
North Europe
DynamoDB
EC2 EC2
Elas-csearchRDS-MySQLInstance
SQSQueueS3 CloudFront
CloudSearch
South America
DynamoDB
EC2 EC2
Elas-csearchRDS-MySQLInstance
SQSQueueS3
Elas-cLoadBalancing
CloudFront
CloudSearch
West Europe
DynamoDB
EC2 EC2
Elas-csearchRDS-MySQLInstance
SQSQueueS3 CloudFront
CloudSearch
North Europe South America
DynamoDB
EC2 EC2
Elas-csearchRDS-MySQLInstance
SQSQueueS3
Elas-cLoadBalancing
CloudFront
CloudSearch
West Europe
DynamoDB
EC2 EC2
Elas-csearchRDS-MySQLInstance
SQSQueueS3 CloudFront
CloudSearch
North Europe South America
WARNING: THIS MEANS YOU NEED TO REPLICATE ALL TRANSACTIONS OVER BOTH CLOUD PROVIDERS!!! (COST X 2)
RESILIENCE TESTING
NETFLIX SIMIAN ARMY
▸ Chaos Monkey
▸ Chaos Gorilla
▸ Chaos Kong
▸ Janitor Monkey
▸ Doctor Monkey
▸ Compliance Monkey
▸ Latency Monkey
▸ Security Monkey
Unit tests Metrics
Provisioningnew target
Provisioningdatabases
Provisioningworkers
Integrationtests
Promotebranch
CI
Unit tests Metrics
Provisioningnew target
Provisioningdatabases
Provisioningworkers
Integrationtests
Promotebranch
CI
WHAT TO TAKE HOME FROM THIS TALK
RECAP
▸ Prepare you code to scale and distribute
▸ When online is important, scale over multiple hosting options
▸ Test your resilience for failure
▸ Automate your processes
▸ Build pipelines for all tasks
▸ Release with confidence
in it2PROFESSIONAL PHP SERVICES
Michelangelo van DamZend Certified Engineer
[email protected] - www.in2it.be - T in2itvof - F in2itvof
Microsoft Azure Zend Framework Consulting
Quality Assurance & Disaster Recovery