• Save
Nice performance using Sf2 cache wrapping Sf1 application - Paris
Upcoming SlideShare
Loading in...5
×
 

Nice performance using Sf2 cache wrapping Sf1 application - Paris

on

  • 6,658 views

In collaboration with Emmanuel Cohen. ...

In collaboration with Emmanuel Cohen.

At a key moment for online press in France, a major French news company chooses PHP and Symfony to extend its popular web site. We will present the architecture we designed at Sensio Labs to meet a very good performance requirement. We used Symfony2 kernel wrapping symfony 1.4 and relied on loose-coupled applications serving content from heterogeneous backend sources.

Statistics

Views

Total Views
6,658
Views on SlideShare
3,801
Embed Views
2,857

Actions

Likes
10
Downloads
0
Comments
0

14 Embeds 2,857

http://www.lafermeduweb.net 2507
http://blogdwich.fr 148
http://www.symfony.es 92
http://pocky.github.com 65
http://www.emmanuelpereira.com 16
http://pocky.github.io 8
http://feeds.feedburner.com 7
http://webcache.googleusercontent.com 4
http://translate.googleusercontent.com 3
http://www.sfexception.com 3
http://www.linkedin.com 1
http://m.lafermeduweb.net 1
http://twitter.com 1
https://www.linkedin.com 1
More...

Accessibility

Categories

Upload Details

Uploaded via as Microsoft PowerPoint

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

Nice performance using Sf2 cache wrapping Sf1 application - Paris Nice performance using Sf2 cache wrapping Sf1 application - Paris Presentation Transcript

  • Nice performance using SF2 cache wrapping sf1 application Marc Weistroff Emmanuel Cohen Sf Live SF 2011 Thursday, March 3 2011
  • Who we are
    • Emmanuel Cohen
    • Project manager at Sensio Labs
    • 4 year experience with PHP5
    • 5+ year experience with Java EE
    • Learned Basic on Amstrad CPC 6128
  • Who we are
    • Marc Weistroff
    • Developer at Sensio Labs since 11/2009
    • Lead developer on this project
    • Experiences with C, and PHP from version 3
    • Encountered programming with Amos Basic on Amiga 500
  • This talk
    • Symfony2
    • symfony 1
    • HTTP Cache
    • Edge Side Includes (ESI)
    • Web architecture
    • Online media
  • Our client
    • L’Express Magazine
    • Express-Roularta Group
    • Magazine created in 1953
    • http://www.lexpress.fr
    • Top 3 French online news
    • Need for speed!
  •  
  •  
  •  
  • The project
    • A cultural knowledge base
    • A bridge between hot news and cultural knowledge
    • An extension of www.lexpress.fr
  •  
  •  
  • Technical objectives
    • Performance
    • A full scale Proof-of-Concept for the future
    • Keep it Simple
  • Constraints
    • Heterogeneous XML Sources
    • Solution based on symfony 1
    • Adaptability (for future extensions)
  • How does this app work ?
  • Our symfony 1 application design HTML Renderer XML Server OCARI Culture OCARI Content
    • Stores
    • Normalizes
    • Aggregates
    • Serves XML
    Sources deliver heterogeneous data
    • Renders HTML with XSL
    • Renders static layouts
  • Our symfony 1 application design
    • Highly specialized applications
    • Loose coupling
    • Front dedicated to delivering content fast
  • Addressing performance with Symfony2
  • Addressing performance with Sf2
    • With Symfony2 built-in Gateway :
    • HTTP cache
    • ESI : Edge Side Includes
  • Performance with Symfony2 : HTTP Cache
    • HTTP RFC
    • http://tools.ietf.org/wg/httpbis/
    • http://tools.ietf.org/html/draft-ietf-httpbis-p6-cache-12
  • Performance with Symfony2 : HTTP Cache
    • Symfony2 uses HTTP cache headers to handle cache
    • s-maxage or max-age
    • Etag, Last-Modified, If-Modified-Since
    • http://tools.ietf.org/html/draft-ietf-httpbis-p6-cache-12
  • Performance with Symfony2 : HTTP Cache
    • symfony 1
    • Applicative cache
    • Symfony2
    • Light-weight HttpKernel
    • The application is not hit
    • Supports a standard
    • Find out what’s stale
    • The problem of invalidation
    Performance with Symfony2: Cache issues
    • Selective caching
    • Do not regenerate the whole page when you just need to regenerate small parts of it
    Performance with Symfony2: Cache issues
  • Performance with Symfony2: ESI
    • Edge-Side include: A markup language
    • W3C note from Akamai
    • http:// www.w3.org/TR/esi-lang
    • http:// www.akamai.com/html/support/esi.html
  • ESI : A page in lexpress.fr
  • Performance with Symfony2: ESI
    • Each fragment has its own ttl or validation rule => the fragments are selectively refreshed
  • Performance with Symfony2: ESI
    • Dependance is defined once and for all
    • In expiration: simply set your ttl for each fragment
  • How does ESI work?
  • Performance with Symfony2: ESI
    • Represented by an HTML Tag
      • <esi:include src=“/movie/dogma/critics” />
    • Processed by a proxy
    • Transformed into HTTP Request to the application
    • Response is inserted in place of the esi tag
    • HTTP cache is handled independently for each esi tag
  • /movie/dogma
  • /movie/dogma
  • Html Fragment
    • Pure HTML
    • Inserted in lieu of the <esi /> tag
    • No <html>, <body> or <head> tag in this case
  • What you need
    • Any client!
    • A proxy that handles ESI (ie: Varnish or Symfony2)
    • An application that delivers HTML and HTTP cache headers
    • Serve HTML pages that contain ESI tags
  • First request ever Client Proxy Application /movie/dogma /movie/dogma miss Cache-Control: s-maxage=600 /movie/dogma/casting /movie/dogma/critics Cache-Control: s-maxage=3600 Cache-Control: s-maxage=300
  • Request at t+200 Client Proxy Application /movie/dogma hit
  • The application is never hit! As if the complete page was cached in the reverse proxy
  • Request at t+500 Client Proxy Application /movie/dogma /movie/dogma/critics Cache-Control: s-maxage=300 hit
  • The application is partially hit And has to build only a small fragment of the page
  • Pros
    • You use HTTP cache, not the application one.
    • Performance improvements!
    • Granularity: Different cache strategy or TTL on different parts of your page
  • Cons
    • Your app will be hit n times upon the very first request
    • Your app have to be designed to support the rendering of fragments
  • But our app is symfony 1 right ?
    • What to do with your symfony 1 application when you are dying to use Symfony2?
    Wrap it. Our app is symfony 1
  • Our symfony 1 application design HTML Renderer XML Server OCARI Culture OCARI Content Symfony1 wrapper Edge side Symfony2
    • Stores
    • Normalizes
    • Aggregates
    • Serves XML
    Sources deliver heterogeneous data
    • Renders HTML with XSL
    • Renders static layouts
  • Wrapping symfony 1 with Symfony2
  • Constraint
    • We use the Symfony2 ESI/Cache proxy
    • All the call to our app is done in the same PHP process
  • symfony 1 needs tweaking in order to work around a few obstacles
  • Which ones ?
    • It is not reentrant
      • sfConfig singleton
      • sfContext singleton
    • It sends the response directly to the client
      • Filter chain execution
      • At the end, sfRenderingFilter sends the complete response
  • What about Symfony2?
    • Better architecture: Symfony2 is reentrant
    • Symfony2 is heavily based on interfaces
    • Symfony2 is divided into several components
    • HttpKernelHttpKernelInterface
  • HttpKernelHttpKernelInterface
    • Lightweight (1 method)
    • Forces to implement a “handle” method that accepts a Symfony2 Request object and returns a Symfony2 Response object
    • Used by all the classes that act as a Kernel in Symfony2 (ie: HttpKernelHttpCache)
  • Addressing the issues
    • Reentrance
      • Override the super globals
      • Create a fresh new context each time
    • Filter chain
      • Replace sfRenderingFilter by a noRenderingFilter class
    • Create a Symfony2 Response object and returns it
  • Final app architecture EsiCacheKernel SymfonyWrapperKernel symfony 1 application
  • https://github.com/marcw/sflive-2011
  • Then… You have to design your app to serve HTML fragments!
  • Designing your app
    • Don’t think partials or components, think actions!
    • Actions render HTML fragments
    • Actions MUST define explicitly the response cache headers.
  • And now where happy
  • Or are we ?
  • Our choices
    • The choice of symfony 1
    • The choice of Symfony2
    • The choice to mix
    • Expiration over validation
  • This is symfony1 : DO NOT TRY ANY OF THIS AT HOME!
  • Our results
    • It works!
    • The frontend is scalable and extensible
    • Performance is nice, but we needed to improve the Store.php class
  • What to do next ?
  • Implementing cache validation
    • The application needs to garantee freshness
    • How to avoid hitting the application ?
  • Proxy ESI New response Or 304 URL-> {ETag} ETag-> lastmodified If Etag absent or stale Response with HTTP headers Etag LastModified Client Request with HTTP headers If-None-Match If-Modified-Since App New response Or 304 If cache entry is not fresh enough Cache Validation Optimizer
  • Contact @ L’Express
    • Sébastien Angèle
    • [email_address]
    • Jérôme Macias
    • [email_address]
  • Questions ?
    • Marc Weistroff
    • @futurecat
    • [email_address]
    • http://www.marcw.net
    • Emmanuel Cohen
    • @emmanuelcohen
    • [email_address]
  • Thank you! Please rate this talk at http://joind.in/2749