一. Tornado簡介
- Tornado全稱Tornado Web Server,是一個用Python語言寫成的Web服務器兼Web應用框架,由FriendFeed公司在自己的網站FriendFeed中使用,被Facebook收購以後框架在2009年9月以開源軟件形式開放給大衆。
特點:
- 作爲Web框架,是一個輕量級的Web框架,類似於另一個Python web框架Web.py,其擁有異步非阻塞IO的處理方式。
- 作爲Web服務器,Tornado有較爲出色的抗負載能力,官方用nginx反向代理的方式部署Tornado和其它Python web應用框架進行對比,結果最大瀏覽量超過第二名近40%。
二. Tornado的特性
1.HTTP服務器
- Tornado爲了高效實現Comet/後端異步調用HTTP接口,是直接內嵌了HTTP服務器。
- 前端無需加apache / lighttpd / nginx等也可以供瀏覽器訪問;但它並沒有完整實現HTTP1.1的協議,所以官方文檔是推薦用戶在生產環境下在前端使用nginx,後端反向代理到多個Tornado實例。
- Tornado本身是單線程的異步網絡程序,它默認啓動時,會根據CPU數量運行多個實例;充分利用CPU多核的優勢。
2.單線程異步
- 網站基本都會有數據庫操作,而Tornado是單線程的,這意味着如果數據庫查詢返回過慢,整個服務器響應會被堵塞。
- 數據庫查詢,實質上也是遠程的網絡調用;理想情況下,是將這些操作也封裝成爲異步的;但Tornado對此並沒有提供任何支持。
- 這是Tornado的設計,而不是缺陷。一個系統,要滿足高流量;是必須解決數據庫查詢速度問題的!
- 數據庫若存在查詢性能問題,整個系統無論如何優化,數據庫都會是瓶頸,拖慢整個系統!
- 異步並不能從本質上提到系統的性能;它僅僅是避免多餘的網絡響應等待,以及切換線程的CPU耗費。
- 如果數據庫查詢響應太慢,需要解決的是數據庫的性能問題;而不是調用數據庫的前端Web應用。
- 對於實時返回的數據查詢,理想情況下需要確保所有數據都在內存中,數據庫硬盤IO應該爲0;這樣的查詢才能足夠快;而如果數據庫查詢足夠快,那麼前端web應用也就無將數據查詢封裝爲異步的必要。
- 就算是使用協程,異步程序對於同步程序始終還是會提高複雜性;需要衡量的是處理這些額外複雜性是否值得。
- 如果後端有查詢實在是太慢,無法繞過,Tornaod的建議是將這些查詢在後端封裝獨立封裝成爲HTTP接口,然後使用Tornado內置的異步HTTP客戶端進行調用。