Your SlideShare is downloading. ×
Asynchronous Personalization at Groupon - JSConf 2011
Upcoming SlideShare
Loading in...5

Thanks for flagging this SlideShare!

Oops! An error has occurred.

Saving this for later? Get the SlideShare app to save on your phone or tablet. Read anywhere, anytime – even offline.
Text the download link to your phone
Standard text messaging rates apply

Asynchronous Personalization at Groupon - JSConf 2011


Published on

Slides from my talk at JSConf 2011. Covers the usage of asynchronous personalization, CDNs, and A/B testing with Finch.js at Groupon.

Slides from my talk at JSConf 2011. Covers the usage of asynchronous personalization, CDNs, and A/B testing with Finch.js at Groupon.

Published in: Technology
1 Like
  • Be the first to comment

No Downloads
Total Views
On Slideshare
From Embeds
Number of Embeds
Embeds 0
No embeds

Report content
Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

No notes for slide


  • 1. asynchronous personalization [and CDNs and A/B testing and stuff] Jon Pliske Performance Engineering, Groupon @jonpliske
  • 2. You might know me from this leaked photo on TechCrunch Jon PliskePerformance Engineering, Groupon @jonpliske
  • 3. overview background CDN caching async personalization a/b/multivariate testing /w finch.js
  • 4. performance anxiety big rails app performance issues big team === development process hurdles big traffic drinking problems Reaching limit of Rails caching Low-level optimizations too "incremental" Rewriting SQL is boring Improve platform architecture
  • 5. super bowl partyprelude:jan 1. "btw we have pre/post super bowl commercials"jan 15. "scored an in-game spot, we good?"feb 15. offend the world"spike mode": CDN cache it all! disable login offload geocoding/subscriptions/orders to EC2 limited functionality === unhappy users
  • 6. pics or it didnt happen
  • 7. pics or it didnt happen
  • 8. CDNs are neatpros conslow latency dynamic content"edge side nodes" personalizationhigh capacity complexitystatic content overkill? specifically: personalized content (login menu, deals) analytics tracking a/b testing Rails developers
  • 9. async personalizationtarget: deal/division pages (> 50% of traffic)approach:1. cache "anonymous" page in CDN2. hide stuff3. make AJAX request for personalized data/content4. show stuffSee Chris Williams "Rails’ Best Caching Method is JavaScript"from GoRuCo 2010
  • 10. obligatory omnigraffle diagram
  • 11. "Anonymous" userbefore:initial page response time: 0.8 secrendering time (e.g. loading css/js/images): 1 sectotal: 1.8 secafter:initial page response time: 0.1 secrendering time: 1 sectotal: 1.1 seconly a little bit faster...(1.1 vs 1.8 sec)basically no server load => huge capacity increase!
  • 12. Logged-in User / Subscriberbefore:initial page response time: 3 secrendering time (e.g. loading js/css/images): 1 sectotal time: 4 secafter:initial page response time: 0.1 secrendering time (include AJAX call:1 sec): 1 sectotal time: 1.1 secCapacity constant: AJAX call still needs to hit Rails300% faster!
  • 13. [wait for applause]
  • 14. development implicationsless Rails, more JS1 user !== 1 (Rails) requestgoodbye:current_usersessioncookiestesting
  • 15. onCurrentUserReady(callback)callback when personalize API returns (or callback immediatelyfor anonymous user)before:- if logged_in? do stuff for logged-in user- else do stuff for anonymous userafter:Groupon.onCurrentUserReady(function(){ if (Groupon.currentUser.isAuthenticated) { do stuff for logged-in user } else { do stuff for anonymous user }});
  • 16. analyticsProblem: Request loggingSolution: Tracking pixel (hit Nginx only, not Rails)Problem: Content changesSolution: Dynamic tracking pixelProblem: Tracking params (e.g. utm params, affiliate id, etc...)Solution: Store in cookie; append params to API request
  • 17. a/b testing with FinchProblem: Finch uses view/controller logic to choose and trackexperiments and variants- experiment Two vs. Three Step Subscription do |e| - e.variant Original do %h1 Fill out this form to subscribe now - e.variant Two Step do %h4 Follow these two steps to subscribe - e.variant Three Step do %p Subscribe now - it only takes a few seconds
  • 18. Finch.jsFinch.Experiments.DelayedJSExperiment = { defer: function() { var experiment = this; FinchDemo.onCurrentUserReady(function() { experiment.deferedRun(this); }); }, before: function() { $(#delayed).hide(); }, after: function() { $(#delayed).show(); }, variants: { original: function() { $(#delayed .original).show(); }, alternate: function() { $(#delayed .alternate).show();}, }};$(function() {;});
  • 19. Finch.js based on Googles "Overlapping Experiment Infrastructure" written in coffee-script open source soon-ishly ~ 15k of JS doesnt handle tracking/analytics/analysis side of testing (yet?)
  • 20. the futurepure-JSON API requestsclient-side rendering (/w mustache.js)HTML5 storagedecouple from Railsdevelopment practices:front/back-end integrationbetter testingbetter monitoring
  • 21. Thank you!