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 15M 20M 10M 5M 1M 2015 2014 2013 2012 2011 2010 2009 25M members worldwide 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 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 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 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 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 ➔ 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 Dispatcher Event Listener 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 Dispatcher New 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 Dispatcher New 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 Dispatcher New 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 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 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 Mail SMS Publication Push Indexation Image 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 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 Before After Branding Media Environment Debug?
PHP Frameworks Day 2016 - 25+ million members in 22 countries; How to scale with Symfony2 @odolbeau & @genes0r Put everything in the same place can be dangerous!
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 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 40 269 Commits 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 851 NCLOC 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 We’re hiring! In Paris & Warsaw! http://blbl.cr/dreamjobs