KEMBAR78
Evented I/O based web servers, explained using bunnies | PDF
Evented I/O based web servers,
   explained using bunnies
                 Simon Willison
    Part of a talk given at Full Frontal 2009
Your Web Server
 (using a bunny)
Your Web Server
                            (using a bunny)




                Single threaded (one bunny), so can only
                      handle one request at a time


Happy hamster
Your Web Server
                                        (using a bunny)
       (The hamsters are using web
        browsers to visit your site)




Impatient hamsters
Your Web Server
5 bunnies = can handle 5 requests at
           the same time                (using threads,
                                         aka bunnies)




        Happy hamsters
fetching a web API
                                           (2 seconds)

  Long running operations cause a
thread to block, causing requests to
        build up in a queue



                                       Your Web Server
                                        (using threads,
                                         aka bunnies)
fetching a web API
                         (2 seconds)


                     uploading an image
                        (3 seconds)


                     fetching a web API
                         (2 seconds)


                     fetching a web API
                         (2 seconds)


                     comet long polling
                       (10 seconds)

Impatient hamsters
Replace the bunnies with a single
 hyperactive squid. The squid runs up
and down as fast as it can dealing with
 each hamster in turn. It res off any
                                          Your Web Server
long running I/O operations and then
moves on to the next hamster. When
                                           (event loop, aka
the I/O operation reports progress, it    hyperactive squid)
 does a little more work on behalf of
      the corresponding hamster.
Bad code

• rows = database.fetch(category = 'news')
• template = read_file('homepage.html')
• json = fetch_url('http://.../')
               These functions block and wait for
             results - blocking the squid and causing
            the entire event loop (and hence server)
                  to pause until they complete
Good code

• database.fetch(category = 'news', callback)
• read_file('homepage.html', callback)
• fetch_url('http://.../', callback)
             These functions specify a callback to be
             executed as soon as the I/O operation
                           completes

Evented I/O based web servers, explained using bunnies

  • 1.
    Evented I/O basedweb servers, explained using bunnies Simon Willison Part of a talk given at Full Frontal 2009
  • 2.
    Your Web Server (using a bunny)
  • 3.
    Your Web Server (using a bunny) Single threaded (one bunny), so can only handle one request at a time Happy hamster
  • 4.
    Your Web Server (using a bunny) (The hamsters are using web browsers to visit your site) Impatient hamsters
  • 5.
    Your Web Server 5bunnies = can handle 5 requests at the same time (using threads, aka bunnies) Happy hamsters
  • 6.
    fetching a webAPI (2 seconds) Long running operations cause a thread to block, causing requests to build up in a queue Your Web Server (using threads, aka bunnies)
  • 7.
    fetching a webAPI (2 seconds) uploading an image (3 seconds) fetching a web API (2 seconds) fetching a web API (2 seconds) comet long polling (10 seconds) Impatient hamsters
  • 8.
    Replace the bunnieswith a single hyperactive squid. The squid runs up and down as fast as it can dealing with each hamster in turn. It res off any Your Web Server long running I/O operations and then moves on to the next hamster. When (event loop, aka the I/O operation reports progress, it hyperactive squid) does a little more work on behalf of the corresponding hamster.
  • 9.
    Bad code • rows= database.fetch(category = 'news') • template = read_file('homepage.html') • json = fetch_url('http://.../') These functions block and wait for results - blocking the squid and causing the entire event loop (and hence server) to pause until they complete
  • 10.
    Good code • database.fetch(category= 'news', callback) • read_file('homepage.html', callback) • fetch_url('http://.../', callback) These functions specify a callback to be executed as soon as the I/O operation completes