Thursday, September 10, 2009

Facebook Open Sources FriendFeed

Interesting developments today in the scalable real time web front. In a rather unexpected move, Facebook has released a project called Tornado -- an open source version of the scalable, non-blocking web server and and tools that power FriendFeed.

In a blog post from Facebook Director of Products, Bret Taylor he describes the project in three parts.
  • All the basic site building blocks - Tornado comes with built-in support for a lot of the most difficult and tedious aspects of web development, including templates, signed cookies, user authentication, localization, aggressive static file caching, cross-site request forgery protection, and third party authentication like Facebook Connect. You only need to use the features you want, and it is easy to mix and match Tornado with other frameworks.

  • Real-time services - Tornado supports large numbers of concurrent connections. It is easy to write real-time services via long polling or HTTP streaming with Tornado. Every active user of FriendFeed maintains an open connection to FriendFeed's servers.

  • High performance - Tornado is pretty fast relative to most Python web frameworks. We ran some simple load tests against some other popular Python frameworks, and Tornado's baseline throughput was over four times higher than the other frameworks:

Also interesting, Tornado comes w/ built-in support for Facebook Connect, Twitter, Google, FriendFeed and OAuth OpenID .

Very cool. Check out the announcement on the Facebook Developer Blog or you can download Tornado at

-- Update --
I also just found this a script called, an implementation of an S3-like storage server based on local files. Useful to test features that will eventually run on S3, or if you want torun something locally that was once running on S3.
It doesn't support all the features of S3, but it does work with the standard S3 client for the most basic semantics.

To use the standard S3 client with this module:
c = S3.AWSAuthConnection("", "", server="localhost", port=8888,
c.put("mybucket", "mykey", "a value")
print c.get("mybucket", "mykey").body

#DigitalNibbles Podcast Sponsored by Intel

If you would like to be a guest on the show, please get in touch.