简介
Tornado龙卷风是一个开源的网络服务器框架,它是基于社交聚合网站FriendFeed的实时信息服务开发而来的。2007年由4名Google前软件工程师一起创办了FriendFeed,旨在使用户能够方便地跟踪好友在Facebook和Twitter等多个社交网站上的活动。结果两年后,Facebook宣布收购FriendFeed,交易价格约为5000万美元。而此时FriendFeed只有12名员工。据说这帮人后来又到了Google,搞出了现在的Google App Engine...
我们开发这个Web服务器的主要目的就是为了处理FriendFeed的实时功能 -- 在FriendFeed的应用里每个活动用户都会保持着一个服务器连接。
Tornado使FriendFeed使用的可扩展的非阻塞Web服务器及其相关工具的开源版本,这个Web框架看起来有些像web.py或 Google的webapp,不过为了更加有效地利用非阻塞服务器环境,Tornado这个Web框架还包含了一些相关的有用工具和优化。
区别
Tornado与现代主流的Web服务器框架有着明显的区别:它使非阻塞式的服务器,速度相当快。这得益于其非阻塞的方式和对epoll的运用。Tornado每秒可以处理数以千计的连接,对于实时Web服务来说Tornado确实是一个理想的Web框架。
与Node.js相同的是,Tornado也采用的是单进程单线程异步IO的网络模型,它们都可以编写异步非阻塞的程序。但由于Node.js是Google Chrome V8引擎的JS运行环境或工具包,它属于偏底层的抽象,扩展了JS编写服务器程序的能力,所以基于Node.js会由不同的Web框架。从这个角度来看Node.js和Tornado其实并不在一个层次上。
Tornado是使用Python编写的Web服务器兼Web应用框架,与主流Web服务器框架不同的是,Tornado是异步非阻塞式服务器,得益于非阻塞式和对epoll模型的运用,Tornado是实时Web服务的一个理想框架,它非常适合开发长轮询、WebSocket和需要与每个用户建立持久连接的应用。
特点
轻量级Web框架
异步非阻塞IO处理方式
Tornado采用的单进程单线程异步IO的网络模式,其高性能源于Tornado基于Linux的Epoll(UNIX为kqueue)的异步网络IO。
出色的抗负载能力
不依赖多进程或多线程
WSGI全栈替代产品
WSGI把应用(Application)和服务器(Server)结合起来,Tornado既可以是WSGI应用也可以是WSGI服务。
既是WebServer也是WebFramework
Tornado是基于Bret Taylor和其他人员为FrientFeed所开发的网络服务框架,当FriendFeed被Facebook收购后得以开源。不同于那些最多只能达到1w并发连接的传统网络服务器。Tornado在设计之初就考虑到了性能因素,旨在解决C10K问题,这样的设计使其成为一个拥有高性能的框架。
结构
Web框架
主要包括RequestHandler用于创建Web应用程序和各种支持类的子类
HTTP服务器与客户端
主要包括HTTPServer和AsyncHTTPClient
异步网络库
主要包括IOLoop和IOStream作为HTTP组件的构建块
协程库
Tornado的Web框架和HTTP服务器一起提供了完整的堆栈替代方案WSGI
模块
Tornado是一个轻量级框架,它的模块不多最重要的模块是web,web模块包含了Tornado大部分主要功能的Web框架,其他模块都是工具性质的,以便让Web模块更加有用。
Core Web Framework 核心Web框架
tornado.web 包括Web框架大部分主要功能,包括RequestHandler和Application类。
tornado.httpserver一个无阻塞HTTP服务器的实现
tornado.template模板系统
tornado.escape HTML、JSON、URLs等编码解码和字符串操作
tornado.locale国际化支持
Asynchronous Networking 异步网络底层模块
tornado.ioloop 核心IO循环
tornado.iostream对非阻塞的Socket的简单封装以方便常用读写操作
tornado.httpclient无阻塞的HTTP服务器实现
tornado.netutil网络应用的实现主要是TCPServer类
Integration With Other Services 系统集成服务
tornado.auth 使用OpenId和OAuth进行第三方登录
tornado.databaseMySQL服务端封装
tornado.platform.twisted在Tornado上运行Twisted实现的代码
tornado.websocket实现和浏览器的双向通信
tornado.wsgi其他Python网络框架或服务器的相互操作
Utilities 应用模块
tornado.autoload产生环境中自动检查代码更新
tornado.gen基于生成器的接口,使用该模块 保证代码异步运行。
tornado.httputil分析HTTP请求内容
tornado.options解析终端参数
tornado.process多进程实现的封装
tornado.stack_context异步环境中对回调函数上下文保存、异常处理
tornado.testing单元测试
Tornado服务器的三个底层核心模块
httpserver 服务于web模块的一个简单的HTTP服务器的实现
Tornado的HTTPConnection类用来处理HTTP请求,包括读取HTTP请求头、读取POST传递的数据,调用用户自定义的处理方法,以及把响应数据写给客户端的socket。
iostream 对非阻塞式的socket的封装以便于常见读写操作
为了在处理请求时实现对socket的异步读写,Tornado实现了IOStream类用来处理socket的异步读写。
ioloop 核心的I/O循环
Tornado为了实现高并发和高性能,使用了一个IOLoop事件循环来处理socket的读写事件,IOLoop事件循环是基于Linux的epoll模型,可以高效地响应网络事件,这是Tornado高效的基础保证。
Tornado核心模块
设计模型
Tornado不仅仅是一个Web框架,它完整地实现了HTTP服务器和客户端,再此基础上提供了Web服务,它可分为四层:
Web框架:最上层,包括处理器、模板、数据库连接、认证、本地化等Web框架所需功能。
HTTP/HTTPS层:基于HTTP协议实现了HTTP服务器和客户端
TCP层:实现TCP服务器负责数据传输
Event层:最底层、处理IO事件
设计模型
使用Tornado可以方便地架构出各种类型的web服务器,以HTTP服务器为例来分析下web服务器的工作方式。
服务器工作方式
一个请求处理的处理过程
服务器绑定bind到特定端口port,然后开始监听listen客户端的请求。
当客户端连接connect到来时,会将请求发送给服务器。
服务器处理请求完毕后返回响应结果给客户端
当需要处理成千上万的连接的时候,就会遇到典型的The C10K Program问题,常见的解决方案有
一个线程服务多个客户端,使用非阻塞I/O和水平触发的就绪通知。
一个线程服务多个客户端,使用非阻塞I/O和就绪改变时通知。
一个服务线程服务于多个客户端,使用异步I/O。
一个服务线程服务于一个客户端,使用阻塞I/O。
将服务代码编译进内核
Tornado采用的方式是“多进程 + 非阻塞 + epoll模式”