来自知乎:知乎为什么选择 Tornado 作为 Web 开发框架?

来自知乎:知乎为什么选择 Tornado 作为 Web 开发框架?

Python的web开发框架这么多,实在眼花缭乱,Tornado相比来说还算个新东西,文档也很少,是哪些特性吸引了知乎工程师呢?

孙大同,freshman @ …:

Tornado异步非阻塞的I/O模型的确让人耳目一新,Tornado的优势主要在于对大量Comet长轮询连接的维护上。这也是FriendFeed开发Tornado的原因—–因为FriendFeed需要实时更新Timeline,而Comet又是目前最好,最流行的方法。由于知乎也有大量长轮询连接需要维护,所以选择Tornado也就在情理之中了。
但是我们也要看到,Tornado不是万金油,由于Tornado的WEB服务器为单线程,一个Request如果阻塞了I/O,那么这个进程将一直挂起,既无法接受新的Request,也无法Finish正在阻塞的其它Request。虽然可以Spawn多个Tornado进程,但是进程这种重量级的东西,Spawn太多会消耗大量的内存资源。这种感觉很像PHP的FastCGI进程那种味道。所以如果是会阻塞I/O的Request一般都是利用Tornado内置的异步HTTP Client交给其它动态后端来做。
所以Tornado在生产中一般前面都要包一层nginx做反向代理,用nginx来做静态文件等大数据量的I/O操作。Tornado的I/O时间实在是太金贵了,在这上面耗不起。
@刘连响 提到的那个测试(http://kb.cnblogs.com/a/1591500/)在实际应用中并没有什么价值。因为实际应用中必然有逻辑处理,逻辑处理必然要阻塞I/O,这会使Tornado的性能大幅下降。测试可在网页代码self.write(“hello world”)前加一句time.sleep(0.01),假设每个Request阻塞I/O 10毫秒,再测试一下性能。
至于你提到的Tornado文档少的问题,我觉得你可以抽空阅读一下Tornado的代码,毕竟是个轻量级框架,代码不多,但是注释却很详细,很容易看懂。请记住,代码永远是最好的文档!

各位,别忘了,只有原生异步才能发挥出Tornado的最大优势,比如Tornado自带的mysql库就不是异步的(实际上这个库就是MySQLdb的包装),一旦SQL调用阻塞,整个Tornado进程也会阻塞,这种情况下gen也是帮不了你的。gen只是为了让异步调用更简单,没办法把一个同步函数变为异步函数。

董诣少谈些主义,多研究些问题

tornado有性能优势吧  异步非阻塞

看了一下quora,正常的请求是pylons,一些实时性的内容用的也是tornado

Jonas一个喜欢coding 的架构师, 一…

自己也做了一个与java netty 的性能测试对吧,每次访问都涉及到操作数据库,对比结果,tornado 性能和服务器的负载都比java netty 好很多,具体: http://user.qzone.qq.com/406144836/blog/1304090243

notedit干代码 也干点产品

tornado 性能非常强悍的  具体的看这里http://kb.cnblogs.com/a/1591500/
知乎使用了哪些框架和开源库?
整理一下已经有的答案吧:

  • Tornado 知乎使用这个构建自己的网站,来自@李申申 (知乎首席技术官)的回答。根据之前的知乎是可以看到直接返回的 Server:TornadoServer 但现在放在Nginx背后,就看不到这个啦。测试一个网站是否为Tornado实现(不绝对,但可以作为参考),也可以查看其Cookie,如果不是刻意实现(Tornado的需要配置,不过一般都会开启这个防止XSRF攻击和防止Cookie被伪造的设置选项),那么其Cookie里面会有个key为_xsrf 的Cookie,然后所有的value都会经过HMAC的HASH过。
  • MySQL 知乎使用这个作为自己的主要的储存, 来自@李申申 (知乎首席技术官)的回答。 使用SqlAlchemy 为ORM进行数据库的建模或者映射,同样来自@李申申 (知乎首席技术官)的回答。
  • Redis 使用这个用于缓存、队列、计数或者任务,使用 Redis-Py 为其连接客户端, 同样来自@李申申 (知乎首席技术官)的回答。
  • Closure 知乎使用Google的Closure Library作为前端的JavaScript 框架,这个大家可以自行抄起家伙查看Javascript代码,或者在其Js源代码里面直接搜索goog,即可看到。
  • Nginx 现在可以在HTTP HEADER中直接看到这个。

以前用到的Upyun,现在已经迁移到知乎自己建的图片服务上,特别在这里提出更正。知乎的主要语言是Python,其实只要网站用到Python,很多的包或者技术都是可以预测的,比如需要 Virtualenv来解决纯净的包环境问题,需要 Pythonbrew 来切换Python的版本环境(开发环境常用,生产环境很少),需要 使用 Fabric 来加速部署。看看知乎这样的流量,肯定也会有负载均衡啦,硬的就来个牛逼的F5,软的就玩个Nginx或者HAProxy吧。

作为一个非知乎的员工,似乎谈起别人的技术实现,实在是有些技术猎奇的心态。架构有很多,但其实只有那么三两个是适合你自己的。所以,以上这些权当娱乐,大家看看就好。如有雷同,纯属巧合。

希望对大家有用。

李申申知乎构造者

  • Tornado  我们的基础开发框架,稍做修改
  • Sqlalchemy  SQL toolkit and Object Relational Mapper for Python
  • Redis-Py  Redis Python Client

发表评论

电子邮件地址不会被公开。 必填项已用*标注