Asynq: Asynchronous Programming @ Quora What is Quora? Share & Grow the World’s Knowledge Everyone Has Knowledge 1. Asynq a. Motivation b. Design c. Applications d. Side Notes 2. Q & A Today’s Talk Motivation ● Most of our data is stored in MySQL or HBase ● These services are reliable but they are also slow ● Solution: Caching ● We extensively use memcache, an in-memory cache store Most of our data fetches look like: webserver memcache MySQL quora.com 1-2ms 10-100ms ● Only go to MySQL in case of cache miss ● Miss rate: < 5% Next Optimization: Network Requests Image URL Name Short Bio Follower Count def render_profile(uid): name = render_name(uid) photo = render_profile_photo(uid) short_bio = render_short_bio(uid) follow_button = render_follow_button(uid) ... def render_name(uid): name = mc.get(‘user-name:’ + uid) return ‘<b>’ + name + ‘</b>’ render_profile(uid) render_name(uid) render_photo(uid) render_follow(uid) mc.get(...) mc.get(...) mc.get(...) webserver memcache ‘user-name’ ‘image-url’ Serial gets 1ms 1ms 1μs render_profile(uid) render_photo(uid) render_name(uid) render_short_bio(uid) mc.get(‘image-url’) mc.get(‘name’) mc.get(‘short-bio’) webserver memcache Batched get multi-get( ‘user-name’, ‘image-url’, ... , ‘short-bio’ ) 1ms 1ms 10μs def prime_render_profile(uid): mc.multiget([ ‘user-name’, ‘short-bio’, ‘image-url’, ‘follow-count’, ... ]) def render_profile(uid): name = render_name(uid) photo = render_profile_photo(uid) short_bio = render_short_bio(uid) follow_button = render_follow_button(uid) ... What do we have now?