caching on the edge with symfony2
DESCRIPTION
TRANSCRIPT
Caching on the Edge Fabien Potencier
Let’s run some benchmarks ;)
Lorem ipsum dolor sit amet, consectetur adipiscing elit. In vel nulla arcu, vitae cursus nunc. Integer semper turpis et enim por6tor iaculis. Nulla facilisi. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Mauris vehicula ves;bulum dictum. Aenean non velit tortor. Nullam adipiscing malesuada aliquam. Mauris dignissim, urna quis iaculis tempus, justo libero por6tor est, nec eleifend est elit vitae ante. Curabitur interdum luctus metus, in pulvinar lectus rutrum sit amet. Duis gravida, metus in dictum eleifend, dolor risus ;ncidunt ligula, non volutpat nulla sapien in elit. Nulla rutrum erat id neque suscipit eu ultricies odio sollicitudin. Aliquam a mi vel eros placerat hendrerit. Phasellus por6tor, augue sit amet vulputate venena;s, dui leo commodo odio, a euismod turpis ligula in elit. Sed cursus tortor quis dolor aliquet accumsan. Curabitur convallis egestas erat, et pharetra neque faucibus vitae. Integer at urna leo. Suspendisse poten;. Nulla hendrerit nisl sit amet lorem semper nec porta mauris volutpat. Curabitur a velit erat, a viverra sem. Duis a eros nec diam faucibus vehicula a sed orci. Vivamus vehicula dapibus tellus in luctus. Curabitur luctus, lorem ac pre;um pharetra, nisl risus condimentum mi, sit amet placerat orci ante et velit. Vivamus dapibus nulla tempor metus tris;que vel gravida purus pre;um. Curabitur suscipit bibendum massa, at imperdiet purus interdum sit amet. Donec ;ncidunt porta dictum.
cacheable for 10 seconds
comes from DB (simulated)
0
100
200
300
400
500
600
10 30 50 70 90
symfony
Symfony2
requests / second
For 10 concurrent users, Symfony2 is 5 times faster than symfony
0
100
200
300
400
500
600
10 30 50 70 90
symfony
Symfony2
requests / second
number of concurrent users
For 100 concurrent users, Symfony2 is 11 times faster than symfony
What if I add an HTTP accelerator?
Symfony2 embraces the HTTP specification
HTTP Expiration / HTTP Validation
$response->setSharedMaxAge(...); $response->setTtl(...); $response->setMaxAge(...); $response->setClientTtl(...); $response->setExpires(...);
$response->setETag(...); $response->setLastModified(...);
Cache-Control: s-maxage=10
public function showAction() { // ...
$response = $this->render('...', $vars);
$response->setSharedMaxAge(10);
return $response; }
public function showAction() { // ...
$response = $this->createResponse(); $response->setSharedMaxAge(10);
return $this->render( '...', $vars, $response); }
Symfony 2 comes built-in with an HTTP accelerator
$kernel = new HelloCache( new HelloKernel('prod', false) );
$kernel->handle()->send();
Let’s run some benchmarks… again
Lorem ipsum dolor sit amet, consectetur adipiscing elit. In vel nulla arcu, vitae cursus nunc. Integer semper turpis et enim por6tor iaculis. Nulla facilisi. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Mauris vehicula ves;bulum dictum. Aenean non velit tortor. Nullam adipiscing malesuada aliquam. Mauris dignissim, urna quis iaculis tempus, justo libero por6tor est, nec eleifend est elit vitae ante. Curabitur interdum luctus metus.
Lorem ipsum dolor sit amet, consectetur adipiscing elit. In vel nulla arcu, vitae cursus nunc. Integer semper turpis et enim por6tor iaculis. Nulla facilisi. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Mauris vehicula ves;bulum dictum. Aenean non velit tortor. Nullam adipiscing malesuada aliquam. Mauris dignissim, urna quis iaculis tempus, justo libero por6tor est, nec eleifend est elit vitae ante. Curabitur interdum luctus metus, in pulvinar lectus rutrum sit amet. Duis gravida, metus in dictum eleifend, dolor risus ;ncidunt ligula, non volutpat nulla sapien in elit. Nulla rutrum erat id neque suscipit eu ultricies odio sollicitudin. Aliquam a mi vel eros placerat hendrerit. Phasellus por6tor, augue sit amet vulputate venena;s, dui leo commodo odio, a euismod turpis ligula in elit.
cacheable for 10 seconds
comes from DB (simulated)
cacheable for 5 seconds
comes from DB (simulated)
0
100
200
300
400
500
600
10 30 50 70 90
symfony
Symfony2
requests / second
number of concurrent requests
For 10 concurrent users, Symfony2 is 8 times faster than symfony
For 100 concurrent users, Symfony2 is 85 times faster than symfony
Lorem ipsum dolor sit amet, consectetur adipiscing elit. In vel nulla arcu, vitae cursus nunc. Integer semper turpis et enim por6tor iaculis. Nulla facilisi. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Mauris vehicula ves;bulum dictum. Aenean non velit tortor. Nullam adipiscing malesuada aliquam. Mauris dignissim, urna quis iaculis tempus, justo libero por6tor est, nec eleifend est elit vitae ante. Curabitur interdum luctus metus.
Lorem ipsum dolor sit amet, consectetur adipiscing elit. In vel nulla arcu, vitae cursus nunc. Integer semper turpis et enim por6tor iaculis. Nulla facilisi. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Mauris vehicula ves;bulum dictum. Aenean non velit tortor. Nullam adipiscing malesuada aliquam. Mauris dignissim, urna quis iaculis tempus, justo libero por6tor est, nec eleifend est elit vitae ante. Curabitur interdum luctus metus, in pulvinar lectus rutrum sit amet. Duis gravida, metus in dictum eleifend, dolor risus ;ncidunt ligula, non volutpat nulla sapien in elit. Nulla rutrum erat id neque suscipit eu ultricies odio sollicitudin. Aliquam a mi vel eros placerat hendrerit. Phasellus por6tor, augue sit amet vulputate venena;s, dui leo commodo odio, a euismod turpis ligula in elit.
cacheable for 10 seconds cacheable for 5 seconds
NOT cacheable
main action
component in the layout
layout
<?php $view->extend('...:layout') ?>
<?php $view->slots->start('sidebar') ?>
<?php echo $view->actions->render('...:list') ?>
<?php $view->slots->stop() ?>
Lorem ipsum...
<?php $view->extend('...:layout') ?>
<?php $view->slots->start('sidebar') ?>
<?php echo $view->actions->render('...:list') ?>
<?php $view->slots->stop() ?>
Lorem ipsum...
cacheable for 10 seconds
cacheable for 5 seconds
$view->actions->render('...:list', array( 'standalone' => true, ))
Lorem ipsum dolor sit amet, consectetur adipiscing elit. In vel nulla arcu, vitae cursus nunc. Integer semper turpis et enim por6tor iaculis. Nulla facilisi. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Mauris vehicula ves;bulum dictum. Aenean non velit tortor. Nullam adipiscing malesuada aliquam. Mauris dignissim, urna quis iaculis tempus, justo libero por6tor est, nec eleifend est elit vitae ante. Curabitur interdum luctus metus.
Lorem ipsum dolor sit amet, consectetur adipiscing elit. In vel nulla arcu, vitae cursus nunc. Integer semper turpis et enim por6tor iaculis. Nulla facilisi. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Mauris vehicula ves;bulum dictum. Aenean non velit tortor. Nullam adipiscing malesuada aliquam. Mauris dignissim, urna quis iaculis tempus, justo libero por6tor est, nec eleifend est elit vitae ante. Curabitur interdum luctus metus, in pulvinar lectus rutrum sit amet. Duis gravida, metus in dictum eleifend, dolor risus ;ncidunt ligula, non volutpat nulla sapien in elit. Nulla rutrum erat id neque suscipit eu ultricies odio sollicitudin. Aliquam a mi vel eros placerat hendrerit. Phasellus por6tor, augue sit amet vulputate venena;s, dui leo commodo odio, a euismod turpis ligula in elit.
Lorem ipsum dolor sit amet, consectetur adipiscing elit. In vel nulla arcu, vitae cursus nunc. Integer semper turpis et enim por6tor iaculis. Nulla facilisi. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Mauris vehicula ves;bulum dictum. Aenean non velit tortor. Nullam adipiscing malesuada aliquam. Mauris dignissim, urna quis iaculis tempus, justo libero por6tor est, nec eleifend est elit vitae ante. Curabitur interdum luctus metus, in pulvinar lectus rutrum sit amet. Duis gravida, metus in dictum eleifend, dolor risus ;ncidunt ligula, non volutpat nulla sapien in elit. Nulla rutrum erat id neque suscipit eu ultricies odio sollicitudin. Aliquam a mi vel eros placerat hendrerit. Phasellus por6tor, augue sit amet vulputate venena;s, dui leo commodo odio, a euismod turpis ligula in elit.
<esi:include src="..." />
ESI… or Edge Side Includes
Symf
ony2
Appli
catio
n
Reve
rse Pr
oxy
Clien
t Lorem ipsum dolor sit amet,
Lorem ipsum dolor
Lorem ipsum dolor sit amet,
Lorem ipsum dolor
1
2
3
4
Lorem ipsum dolor sit amet, consectetur adipiscing elit. In vel nulla arcu, vitae cursus nunc. Integer semper turpis et enim por6tor iaculis. Nulla facilisi. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Mauris vehicula ves;bulum dictum. Aenean non velit tortor. Nullam adipiscing malesuada aliquam. Mauris dignissim, urna quis iaculis tempus, justo libero por6tor est, nec eleifend est elit vitae ante. Curabitur interdum luctus metus.
Lorem ipsum dolor sit amet, consectetur adipiscing elit. In vel nulla arcu, vitae cursus nunc. Integer semper turpis et enim por6tor iaculis. Nulla facilisi. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Mauris vehicula ves;bulum dictum. Aenean non velit tortor. Nullam adipiscing malesuada aliquam. Mauris dignissim, urna quis iaculis tempus, justo libero por6tor est, nec eleifend est elit vitae ante. Curabitur interdum luctus metus, in pulvinar lectus rutrum sit amet. Duis gravida, metus in dictum eleifend, dolor risus ;ncidunt ligula, non volutpat nulla sapien in elit. Nulla rutrum erat id neque suscipit eu ultricies odio sollicitudin. Aliquam a mi vel eros placerat hendrerit. Phasellus por6tor, augue sit amet vulputate venena;s, dui leo commodo odio, a euismod turpis ligula in elit.
Lorem ipsum dolor sit amet, consectetur adipiscing elit. In vel nulla arcu, vitae cursus nunc. Integer semper turpis et enim por6tor iaculis. Nulla facilisi. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Mauris vehicula ves;bulum dictum. Aenean non velit tortor. Nullam adipiscing malesuada aliquam.
Lorem ipsum dolor sit amet, consectetur adipiscing elit. In vel nulla arcu, vitae cursus nunc.
main template
layout
base layout
included page included page
included page
Goal Be as dynamic as needed
Hit the application as less as possible
Lorem ipsum dolor sit amet, consectetur adipiscing elit. In vel nulla arcu, vitae cursus nunc. Integer semper turpis et enim por6tor iaculis. Nulla facilisi. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Mauris vehicula ves;bulum dictum. Aenean non velit tortor. Nullam adipiscing malesuada aliquam. Mauris dignissim, urna quis iaculis tempus, justo libero por6tor est, nec eleifend est elit vitae ante. Curabitur interdum luctus metus, in pulvinar lectus rutrum sit amet. Duis gravida, metus in dictum eleifend, dolor risus ;ncidunt ligula, non volutpat nulla sapien in elit. Lorem ipsum dolor sit amet, consectetur adipiscing elit. In vel nulla arcu, vitae cursus nunc. Integer semper turpis et enim por6tor iaculis. Nulla facilisi. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Mauris vehicula ves;bulum dictum. Aenean non velit tortor. Nullam adipiscing malesuada aliquam. Mauris dignissim, urna quis iaculis tempus, justo libero por6tor est, nec eleifend est elit vitae ante. Curabitur interdum luctus metus, in pulvinar lectus rutrum sit amet
Lorem ipsum dolor sit amet, consectetur adipiscing elit. In vel nulla arcu, vitae cursus nunc. Integer semper turpis et enim por6tor iaculis. Nulla facilisi. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Mauris vehicula ves;bulum dictum. Aenean non velit tortor. Nullam adipiscing malesuada aliquam
Lorem ipsum dolor sit amet, consectetur adipiscing elit. In vel nulla arcu, vitae cursus nunc. Integer semper turpis et enim por6tor iaculis. Nulla facilisi. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Mauris vehicula ves;bulum dictum. Aenean non velit tortor. Nullam adipiscing malesuada aliquam. Mauris dignissim, urna quis iaculis tempus, justo libero por6tor est, nec eleifend est elit vitae ante. Curabitur interdum luctus metus, in pulvinar lectus rutrum sit amet. Duis gravida, metus in dictum eleifend, dolor risus ;ncidunt ligula, non volutpat nulla sapien in elit.
P1
P2
10S
10S 5S
Lorem ipsum dolor sit amet, consectetur adipiscing elit. In vel nulla arcu, vitae cursus nunc. Integer semper turpis et enim por6tor iaculis. Nulla facilisi. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Mauris vehicula ves;bulum dictum. Aenean non velit tortor. Nullam adipiscing malesuada aliquam
Lorem ipsum dolor sit amet, consectetur adipiscing elit. In vel nulla arcu, vitae cursus nunc. Integer semper turpis et enim por6tor iaculis. Nulla facilisi. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Mauris vehicula ves;bulum dictum. Aenean non velit tortor. Nullam adipiscing malesuada aliquam. Mauris dignissim, urna quis iaculis tempus, justo libero por6tor est, nec eleifend est elit vitae ante. Curabitur interdum luctus metus, in pulvinar lectus rutrum sit amet. Duis gravida, metus in dictum eleifend, dolor risus ;ncidunt ligula, non volutpat nulla sapien in elit.
P3
10S 5S ETag ETag
Expiration
Expiration
Expiration &
Validation
symfony app
Web Server
Requests
Response
P1 100 P2 100 P3 100
PHP SF 300
symfony app
Web Server
symfony cache
Requests
Response
P1 10 P2 100 P3 100
P1 90
PHP SF 300
symfony app
Web Server
symfony cache
Requests
Response
P1 1 P2 100 P3 100
P1 99 No HTTP management!
PHP SF 201
Symfony2 app
Web Server
Requests
Response
P1 100 P2 100 P3 100
PHP SF2 300
Symfony2 app
Symfony2 HTTP proxy
Web Server
Requests
Response
P1 10 P2 10 + 20 P3 100
P1 90 P2 90
PHP SF2 140 PHP LIGHT 180
Symfony2 app
Web Server
Reverse proxy
Requests
Response
P1 10 P2 10 + 20 P3 100
P1 90 P2 90
PHP SF2 140 PHP LIGHT 0
The power is even bigger than what you think…
$view->actions->render('...:list', array( 'standalone' => true, 'ignore_errors' => true, 'alt' => 'BlogBundle:Post:error' ))
<esi:include src="..." alt="..." on-error="ignore" />
$view->actions->render( 'http://www.google.com/', array( 'standalone' => true, 'ignore_errors' => true, 'alt' => 'BlogBundle:Post:error' ) )
stale-while-revalidate - rfc5861
stale-if-error - rfc5861
There are only two hard things in Computer Science: cache invalidation and naming things. -- Phil Karlton
http://martinfowler.com/bliki/TwoHardThings.html
Code is still experimental and buggy
http://datatracker.ietf.org/wg/httpbis/
Questions?
Sensio S.A. 92-98, boulevard Victor Hugo
92 115 Clichy Cedex FRANCE
Tél. : +33 1 40 99 80 80
Contact Fabien Potencier
fabien.potencier at sensio.com
http://www.sensiolabs.com/
http://www.symfony-project.org/
http://fabien.potencier.org/
http://tomayko.com/writings/things-caches-do
http://www.slideshare.net/rtomayko/https-bestkept-secret-caching
http://content.newrelic.com/railslab/videos/10-ScalingRails-Client-Side-Caching.mp4
http://content.newrelic.com/railslab/videos/11-ScalingRails-Advanced-HTTP-Caching.mp4
// do only what is needed to compute // the ETag and Last-Modified header values
$response = $this->createResponse(); $response->setEtag('post_'.$post->getId()); $response->setLastModified($post->getPublishedAt());
if ($response->isNotModified($this->getRequest())) { return $response; }
// do some heavy stuff here
return $this->render('...:post', $vars, $response);
// from http://varnish-cache.org/wiki/FAQ/Compression // normalize Accept-Encoding HTTP header protected function lookup(Request $request) { if ($ae = $request->headers->get('Accept-Encoding')) { if (preg_match('/\.(jpg|png|gif|gz|tgz|bz2|tbz|mp3|ogg)$/', $request->getRequestUri())) { // no point in compressing these $request->headers->delete('Accept-Encoding'); } elseif (false !== strpos($ae, 'gzip')) { $request->headers->set('Accept-Encoding', 'gzip'); } elseif (false !== strpos($ae, 'deflate')) { $request->headers->set('Accept-Encoding', 'deflate'); } else { // unkown algorithm $request->headers->delete('Accept-Encoding'); } }
return parent::lookup($request); }
Symfony2 app
Symfony2 HTTP proxy
Web Server
Requests
Response
P2 10 + 20 P3 10 + 20
P3 90 P2 90
Symfony2Validation accel.
PHP SF2 60 PHP LIGHT 180
Symfony2 app
Symfony2Validation accel.
Web Server
Reverse proxy
Requests
Response
P2 10 + 20 P3 10 + 20
P3 90
P2 90
PHP SF2 60 PHP LIGHT 90