PHP Frameworks Day 2016 - 25+ million members in 22 countries; How to scale with Symfony2 @odolbeau & @genes0r
25+ million members in 22 countries; How to scale with Symfony2?Benjamin De Bernardi - Olivier Dolbeau
PHP Frameworks Day 2016 - 25+ million members in 22 countries; How to scale with Symfony2 @odolbeau & @genes0r
@genes0r
Lead Engineer
Benjamin De Bernardi
PHP Frameworks Day 2016 - 25+ million members in 22 countries; How to scale with Symfony2 @odolbeau & @genes0r
Olivier Dolbeau
@odolbeau
Web Architect
PHP Frameworks Day 2016 - 25+ million members in 22 countries; How to scale with Symfony2 @odolbeau & @genes0r
100€ 25€ 25€ 25€
100€ 25€
PHP Frameworks Day 2016 - 25+ million members in 22 countries; How to scale with Symfony2 @odolbeau & @genes0r
15M
20M
10M
5M
1M
2015201420132012201120102009
25M
mem
bers worldw
ide
Over 25 million members and growing
1.5 million+joining each month
PHP Frameworks Day 2016 - 25+ million members in 22 countries; How to scale with Symfony2 @odolbeau & @genes0r
PHP Frameworks Day 2016 - 25+ million members in 22 countries; How to scale with Symfony2 @odolbeau & @genes0r
1. The past
2. Why symfony?
3. How?
○ How to deal with 22 countries?
○ Why do we love the EventDispatcher?
○ Performance & asynchronous
○ Doctrine
4. Traps
5. Here & now
Talk overview:
PHP Frameworks Day 2016 - 25+ million members in 22 countries; How to scale with Symfony2 @odolbeau & @genes0r
The past
1
PHP Frameworks Day 2016 - 25+ million members in 22 countries; How to scale with Symfony2 @odolbeau & @genes0r
v1.0
2005-2006
PHP Frameworks Day 2016 - 25+ million members in 22 countries; How to scale with Symfony2 @odolbeau & @genes0r
PHP Frameworks Day 2016 - 25+ million members in 22 countries; How to scale with Symfony2 @odolbeau & @genes0r
v2.0
2008-2011(2014)
PHP Frameworks Day 2016 - 25+ million members in 22 countries; How to scale with Symfony2 @odolbeau & @genes0r
PHP Frameworks Day 2016 - 25+ million members in 22 countries; How to scale with Symfony2 @odolbeau & @genes0r
2010
New countries
2011 2012
PHP Frameworks Day 2016 - 25+ million members in 22 countries; How to scale with Symfony2 @odolbeau & @genes0r
PHP Frameworks Day 2016 - 25+ million members in 22 countries; How to scale with Symfony2 @odolbeau & @genes0r
3 770 lines of code
69 functions
926 lines for the longest one.
lib.trip.php
PHP Frameworks Day 2016 - 25+ million members in 22 countries; How to scale with Symfony2 @odolbeau & @genes0r
Homemade framework
PHP Frameworks Day 2016 - 25+ million members in 22 countries; How to scale with Symfony2 @odolbeau & @genes0r
NO TESTS
PHP Frameworks Day 2016 - 25+ million members in 22 countries; How to scale with Symfony2 @odolbeau & @genes0r
v3.0
2011 - today
PHP Frameworks Day 2016 - 25+ million members in 22 countries; How to scale with Symfony2 @odolbeau & @genes0r
PHP Frameworks Day 2016 - 25+ million members in 22 countries; How to scale with Symfony2 @odolbeau & @genes0r
2012 2013 2014 2015
New countries
PHP Frameworks Day 2016 - 25+ million members in 22 countries; How to scale with Symfony2 @odolbeau & @genes0r
Why Symfony?
2
PHP Frameworks Day 2016 - 25+ million members in 22 countries; How to scale with Symfony2 @odolbeau & @genes0r
Huge community.
PHP Frameworks Day 2016 - 25+ million members in 22 countries; How to scale with Symfony2 @odolbeau & @genes0r
PHP Frameworks Day 2016 - 25+ million members in 22 countries; How to scale with Symfony2 @odolbeau & @genes0r
Attract new people
PHP Frameworks Day 2016 - 25+ million members in 22 countries; How to scale with Symfony2 @odolbeau & @genes0r
How?3
PHP Frameworks Day 2016 - 25+ million members in 22 countries; How to scale with Symfony2 @odolbeau & @genes0r
22 countries, how can we manage specificities?
PHP Frameworks Day 2016 - 25+ million members in 22 countries; How to scale with Symfony2 @odolbeau & @genes0r
➔ One codebase for each country?
➔ Conditions everywhere in the code?
➔ Configuration and Context?
22 countries: how can we manage specificities?
PHP Frameworks Day 2016 - 25+ million members in 22 countries; How to scale with Symfony2 @odolbeau & @genes0r
➔ One codebase for each country?
➔ Conditions everywhere in the code?
➔ Configuration and Context?
22 countries: how can we manage specificities?
PHP Frameworks Day 2016 - 25+ million members in 22 countries; How to scale with Symfony2 @odolbeau & @genes0r
Web request Listener
Symfony parse & build a Request object
Build Context from configuration and Request
Response
22 countries: Configuration & Context
PHP Frameworks Day 2016 - 25+ million members in 22 countries; How to scale with Symfony2 @odolbeau & @genes0r
1 file for each country
100+ configuration keys
Inheritance
Toggling of features
Metadata
22 countries: Configuration & Context
Configuration:
PHP Frameworks Day 2016 - 25+ million members in 22 countries; How to scale with Symfony2 @odolbeau & @genes0r
22 countries: Configuration & Context
PHP Frameworks Day 2016 - 25+ million members in 22 countries; How to scale with Symfony2 @odolbeau & @genes0r
22 countries: Configuration & Context
Get config from a controller:
PHP Frameworks Day 2016 - 25+ million members in 22 countries; How to scale with Symfony2 @odolbeau & @genes0r
22 countries: Configuration & Context
Get config from a controller:
PHP Frameworks Day 2016 - 25+ million members in 22 countries; How to scale with Symfony2 @odolbeau & @genes0r
22 countries: Configuration & Context
Get config from the view:
PHP Frameworks Day 2016 - 25+ million members in 22 countries; How to scale with Symfony2 @odolbeau & @genes0r
22 countries: Configuration & Context
PHP Frameworks Day 2016 - 25+ million members in 22 countries; How to scale with Symfony2 @odolbeau & @genes0r
Lot of code, how to keep events clean?
PHP Frameworks Day 2016 - 25+ million members in 22 countries; How to scale with Symfony2 @odolbeau & @genes0r
➔ Symfony built-in EventDispatcher
Lot of code, how to keep events clean?
PHP Frameworks Day 2016 - 25+ million members in 22 countries; How to scale with Symfony2 @odolbeau & @genes0r
EventDispatcher how it works:
Lot of code, how to keep events clean?
Event DispatcherEventListener
Listener
PHP Frameworks Day 2016 - 25+ million members in 22 countries; How to scale with Symfony2 @odolbeau & @genes0r
User A rates User B:
Lot of code, how to keep events clean?
Event DispatcherNew Rating
PHP Frameworks Day 2016 - 25+ million members in 22 countries; How to scale with Symfony2 @odolbeau & @genes0r
User A rates User B:
Lot of code, how to keep events clean?
Event DispatcherNew Rating
Grade Listener
Recalculate the grade of both users
PHP Frameworks Day 2016 - 25+ million members in 22 countries; How to scale with Symfony2 @odolbeau & @genes0r
User A rates User B:
Lot of code, how to keep events clean?
Event DispatcherNew Rating
Grade Listener
Moderation Listener
Ask for content verification
PHP Frameworks Day 2016 - 25+ million members in 22 countries; How to scale with Symfony2 @odolbeau & @genes0r
Lot of code, how to keep events clean?
Sending the event:
● Sent from anywhere
PHP Frameworks Day 2016 - 25+ million members in 22 countries; How to scale with Symfony2 @odolbeau & @genes0r
Lot of code, how to keep events clean?
Registering a listener:
● Update a configuration file
PHP Frameworks Day 2016 - 25+ million members in 22 countries; How to scale with Symfony2 @odolbeau & @genes0r
Lot of code, how to keep events clean?
Listening the event:
● Inside a registered listener
PHP Frameworks Day 2016 - 25+ million members in 22 countries; How to scale with Symfony2 @odolbeau & @genes0r
+ Perfect to decouple code inside the app.+ Small listeners, easy to understand, to test.+ Easy to dispatch events outside application.
- Sometimes, hard to understand the flow.- Need tools/rules to keep a common logic.
Dispatching events Pros/Cons
PHP Frameworks Day 2016 - 25+ million members in 22 countries; How to scale with Symfony2 @odolbeau & @genes0r
■ Avoid Entities
■ Keep listener small and dedicated to a single task
■ Limit dependencies
Dispatching events one last thing:
PHP Frameworks Day 2016 - 25+ million members in 22 countries; How to scale with Symfony2 @odolbeau & @genes0r
High traffic, how to improve performance?
PHP Frameworks Day 2016 - 25+ million members in 22 countries; How to scale with Symfony2 @odolbeau & @genes0r
Problem:The website is a bit slow
PHP Frameworks Day 2016 - 25+ million members in 22 countries; How to scale with Symfony2 @odolbeau & @genes0r
Solution:All side tasks can be done asynchronously
PHP Frameworks Day 2016 - 25+ million members in 22 countries; How to scale with Symfony2 @odolbeau & @genes0r
Solution:All side tasks can be done asynchronously
Tasks:
● Find a tool to transmit messages● Create workers ● Use the event dispatcher
PHP Frameworks Day 2016 - 25+ million members in 22 countries; How to scale with Symfony2 @odolbeau & @genes0r
Asynchronous jobs everywhere.
● Performance● Job splitting
PHP Frameworks Day 2016 - 25+ million members in 22 countries; How to scale with Symfony2 @odolbeau & @genes0r
PHP Frameworks Day 2016 - 25+ million members in 22 countries; How to scale with Symfony2 @odolbeau & @genes0r
Dispatch Event with the EventDispatcher.
● Sent from anywhere
● Listened with RabbitMQ or internal Listeners
PHP Frameworks Day 2016 - 25+ million members in 22 countries; How to scale with Symfony2 @odolbeau & @genes0r
Check eventName & event interface
Dispatch the event in the application
Decorated EventDispatcher.
Publish to RabbitMQ
PHP Frameworks Day 2016 - 25+ million members in 22 countries; How to scale with Symfony2 @odolbeau & @genes0r
Send an Email
● Sent from anywhere
● Built using the User context in a dedicated worker
PHP Frameworks Day 2016 - 25+ million members in 22 countries; How to scale with Symfony2 @odolbeau & @genes0r
+ Perfect to decouple code+ Small workers, easy to understand+ Easy to dispatch events outside application+ Separate projects & deployment+ Scalable!
- Learning curve- Need tools/rules to keep a common logic- Hard to test a complete flow with mock/stubs- Mapping is time consuming
Asynchronous event & process Pros/Cons
PHP Frameworks Day 2016 - 25+ million members in 22 countries; How to scale with Symfony2 @odolbeau & @genes0r
129 workers
SMS
Publication
Push
IndexationImage
resizing
Alerts
Profile completion
I love workers!
Payment
PHP Frameworks Day 2016 - 25+ million members in 22 countries; How to scale with Symfony2 @odolbeau & @genes0r
Asynchronous workers:
Infrastructure:
■ PHP
■ Supervisord
Code:
■ Symfony command inside the main app
■ Standalone app + Symfony components
PHP Frameworks Day 2016 - 25+ million members in 22 countries; How to scale with Symfony2 @odolbeau & @genes0r
Asynchronous workers, Symfony:
+ Access to Entities+ Every already defined services
- Entire Symfony- Not dedicated- Deployed along the website- Not the main goal of Symfony- High memory usage
PHP Frameworks Day 2016 - 25+ million members in 22 countries; How to scale with Symfony2 @odolbeau & @genes0r
Asynchronous workers, Standalone:
+ Dedicated to a single task/type+ Maintainable small code+ Deployed independently+ Easily created & tested
- Component splitting from the codebase- More monitoring
PHP Frameworks Day 2016 - 25+ million members in 22 countries; How to scale with Symfony2 @odolbeau & @genes0r
About Doctrine...
PHP Frameworks Day 2016 - 25+ million members in 22 countries; How to scale with Symfony2 @odolbeau & @genes0r
It’s not a troll.
PHP Frameworks Day 2016 - 25+ million members in 22 countries; How to scale with Symfony2 @odolbeau & @genes0r
Code fast!
PHP Frameworks Day 2016 - 25+ million members in 22 countries; How to scale with Symfony2 @odolbeau & @genes0r
Code well?
PHP Frameworks Day 2016 - 25+ million members in 22 countries; How to scale with Symfony2 @odolbeau & @genes0r
PHP Frameworks Day 2016 - 25+ million members in 22 countries; How to scale with Symfony2 @odolbeau & @genes0r
Queries from the view!
Hard to control cache strategy
No integrity check.
PHP Frameworks Day 2016 - 25+ million members in 22 countries; How to scale with Symfony2 @odolbeau & @genes0r
Doctrine Pros/Cons
+ Quick to bootstrap a new project+ Quick to code a small project
- Hard to respect MVC- Hard to deal with cache- Hard to deal with integrity problems in DB- Not made to decouple code (relations).- Not made to scale.
PHP Frameworks Day 2016 - 25+ million members in 22 countries; How to scale with Symfony2 @odolbeau & @genes0r
We fell in traps...
4
PHP Frameworks Day 2016 - 25+ million members in 22 countries; How to scale with Symfony2 @odolbeau & @genes0r
Never pimp your kernel!
PHP Frameworks Day 2016 - 25+ million members in 22 countries; How to scale with Symfony2 @odolbeau & @genes0r
Before
EnvironmentDebug?
PHP Frameworks Day 2016 - 25+ million members in 22 countries; How to scale with Symfony2 @odolbeau & @genes0r
Before
After
Branding Media
EnvironmentDebug?
PHP Frameworks Day 2016 - 25+ million members in 22 countries; How to scale with Symfony2 @odolbeau & @genes0r
Put everything inthe same place can be
dangerous!
PHP Frameworks Day 2016 - 25+ million members in 22 countries; How to scale with Symfony2 @odolbeau & @genes0r
PHP Frameworks Day 2016 - 25+ million members in 22 countries; How to scale with Symfony2 @odolbeau & @genes0r
This is our application.
This is our business code.
PHP Frameworks Day 2016 - 25+ million members in 22 countries; How to scale with Symfony2 @odolbeau & @genes0r
Don’t mess with your tools!
PHP Frameworks Day 2016 - 25+ million members in 22 countries; How to scale with Symfony2 @odolbeau & @genes0r
PHP Frameworks Day 2016 - 25+ million members in 22 countries; How to scale with Symfony2 @odolbeau & @genes0r
PHP Frameworks Day 2016 - 25+ million members in 22 countries; How to scale with Symfony2 @odolbeau & @genes0r
We fell in traps...
PHP Frameworks Day 2016 - 25+ million members in 22 countries; How to scale with Symfony2 @odolbeau & @genes0r
We had parachutes!
PHP Frameworks Day 2016 - 25+ million members in 22 countries; How to scale with Symfony2 @odolbeau & @genes0r
Problems solved?
+ Use symfony only as a tool+ Work a lot on onboarding
+ Try to decouple everything with components
- We still have one big application- As everyone, we lack of documentation
PHP Frameworks Day 2016 - 25+ million members in 22 countries; How to scale with Symfony2 @odolbeau & @genes0r
5
PHP Frameworks Day 2016 - 25+ million members in 22 countries; How to scale with Symfony2 @odolbeau & @genes0r
40 269Commits
There are “only” 18 952 commits for symfony/symfony
PHP Frameworks Day 2016 - 25+ million members in 22 countries; How to scale with Symfony2 @odolbeau & @genes0r
561 851NCLOC
There are “only” 278 909 NCLOC for symfony/symfony
PHP Frameworks Day 2016 - 25+ million members in 22 countries; How to scale with Symfony2 @odolbeau & @genes0r
~ 20 minutes to run all the unit/functional tests
PHP Frameworks Day 2016 - 25+ million members in 22 countries; How to scale with Symfony2 @odolbeau & @genes0r
~ 30minutes to deploy the application
PHP Frameworks Day 2016 - 25+ million members in 22 countries; How to scale with Symfony2 @odolbeau & @genes0r
Too big!
PHP Frameworks Day 2016 - 25+ million members in 22 countries; How to scale with Symfony2 @odolbeau & @genes0r
We’re working on it! ;)
Recommended