如何理解 Tornado ?从 web server、web 框架、和异步 I/O 模型的角度,分别与 Nginx、Django 和 Node.js 对比和区别

tornado 到底是个什么东西呢?

如果它是个webserver ,那么后端如何搭配Django使用 ,又能否搭配Node.js 或 PHP?
如果作为web框架,nginx对于她来说意义在哪里? 在实际使用中是否会影响Tornado本身的异步IO设计?
Tornado与node.js 的实现的目的 ,和设计方式上的不同之处在哪里 ( 不谈语言 )?

—————————–

补充:以下是看官方说明和 Google 了一番后的理解:

它可以作为一个裸 webserver 来使用 ,就是说它的后端可以运行 Django、web.py。
它是一个简单 Python 框架,url 基于正则,有自己的模板实现,但是没有 orm。这部分看起来类似于 web.py。
非阻塞异步 IO,类似于 node.js。
它的前端可以放 Nginx ,感觉类似于 Nginx、Apache 之于 Tomcat。

就是说它作为 web 框架比 Django 简单,又支援异步 IO,且更不需要前端的 webserver ?
我已经混乱了, Tornado是 Nginx、Django、Node.js 的结合体?又或是 Nginx * 20% + Django * 40% + Node.js * 40% ?

Tornado既是一个web server,也是web framework。而它作为web server 采用的是asynchronous IO的网络模型,这是一种很高效的模型。

web framework的定义(http://wiki.python.org/moin/WebFrameworks)

A Web framework is a collection of packages or modules which allow developers to write Web applications or services without having to handle such low-level details as protocols, sockets or process/thread management.

Tornado作为web server,提供了web framework的api,可以来直接构建自己的web程序。同时,Tornado支持WSGI ( http://www.python.org/dev/peps/pep-0333/ ),也就是说它可以有能力其它的一些python的框架一起使用,比如django, bottle, flask等。不妨看下bottle在不同server下的性能评测,其中就有tornado( http://bottlepy.org/page/2009-12-19_Comparing_HelloWorld_Performance )。额外说的是,WSGI的框架是不支持异步的,所以如果有异步调用的逻辑的web程序,Tornado也是选择之一。

没有使用过Node.js,但官网说:

Node.js is a platform built on Chrome’s JavaScript runtime for easily building fast, scalable network applications.

可以把Node.js理解成基于V8的javascript运行环境或工具包,它属于偏底层的抽象,扩展了javascript写服务端程序的能力。所以基于它也会有不同的web framework。从这个角度来看,Node.js和Tornado其实不在一个层次上。
不过相同的是 Node.js 和 Tornado都采用的的单进程单线程异步IO的网络模型。它们都可以写异步非阻塞的程序,不过我觉得因为javascript的语言特性,Node.js对异步回调非阻塞的风格坚持比Tornado更彻底一点。不过通常多进程时,一个进程的短时间阻塞也是可以接受的。

使用Nginx是因为一些单进程服务无法利用多核CPU,同时也会有单机的限制,所以通常会在多个服务器启动多个进程实例,使用Nginx在前端作为反向代理服务器来分发web请求,同时负载均衡。Nginx是C写的,有更好的并发性,可配置性,对静态文件也有更好的支持。当然这是Nginx的常用情景,其实也可以直接使用Nginx来构建web应用,可以参考OpenResty项目( http://openresty.org/ )。

其实网络模型、web server、web framework是三个不同层次,它们之间并不冲突,是选择的关系。理解前,不妨先理清概念:)

首先我觉得web server和web框架这两个功能本身并不冲突,因为http server的功能就是连接接入,业务逻辑处理,返回页面。因此tornado, node.js, django, nginx都可以实现这样的功能,只是使用场景的不同,导致他们或归为web server或归为web框架。
首先说说nginx,主要应用场景是反向代理,负责前端连接接入,继而向后请求后端服务。而nginx本身提供一些负载均衡的功能可以加强web服务的负载能力。但同时nginx也可以作为web框架,只是其c语言开发成本较大,所以用的人比较少而已。不过@agentzh 开发的openresty可以用Lua去写nginx的扩展,这也增强了nginx作为web框架处理业务逻辑的能力。
再说说node.js,node的定位并不完全是web server和web框架,它更多的是实现了一套javascript在服务器上的运行时,但由于其本身异步网络的特点,所以作为一个网络服务框架非常合适,可以看到node实现的httpserver实际上非常简单,这也诞生了express这种目标就是web框架的中间件。
django我只有个大概的了解,感觉它的定位是一个web服务的全套解决方案(如rails),提供了orm,抽象后台管理等web服务常用的功能,因此它的目标定位是web框架,但由于是同步的(很多年没关注了,现在改没改不知道),所以比较影响接入能力,所以前面一般要挂个异步反向代理。
而tornado的定位也更像是轻量级web框架,提供异步能力,但对于业务逻辑处理的支持比django要简单,因此和node一样比较适合做服务中间件。
从业务逻辑处理的角度来说,虽然异步处理能力已经有了比较大的提升,但node和tornado都是单进程的,因此一般要启多个实例,前端再用nginx做接入和负载均衡。
所以从架构选型的角度,nginx做前端接入,后面服务逻辑的选择就看需求了,如果只是最基本的web服务,如cms之类的,django比较方便,可以省下很多开发量。而node和tornado做复杂web系统的中间件比较合适……

Top Down