JGW Maxwell在2011年末作了一個 Ruby Web框架的併發處理能力測試 ,還作了node.js的對比測試。用250個併發去作壓力測試,後端使用MongoDB數據庫,總共跑完10萬個請求,測試結果以下:html
Web框架 | 併發模型 | 吞吐量 |
---|---|---|
Rails | 多進程 | 531 request/s |
Sinatra | 多進程 | 576 request/s |
Sinatra::Synchrony | 纖程 | 1692 request/s |
Goliath | 纖程 | 1924 request/s |
Cramp | Event IO | 3516 request/s |
node.js | Event IO | 3100 request/s |
纖程IO模型的性能是傳統多進程模型的3-4倍,而Event IO則是多進程的6-7倍。值得一提的是Ruby的Event IO框架Cramp甚至性能超過了node.js。看來併發性能差的緣由並不在Ruby。node
咱們看一個 Ruby web框架請求處理性能評測 ,這個評測不訪問數據庫,也不測試併發性能,主要是測試框架處理URL請求路由,渲染文本,返回結果的處理速度。git
Web框架 | 處理速度 |
---|---|
Rack | 1570.43 request/s |
Camping | 1166.16 request/s |
Sinatra | 912.81 request/s |
Padrino | 648.68 request/s |
Rails | 291.27 request/s |
這裏我想簡單介紹3個Ruby輕量級框架,性能都遠遠超過Rails,很適合作Web Service:github
Sinatraweb
Sinatra自己也是Ruby社區很是流行和著名的輕量級Web框架,核心源代碼不超過1000行,文檔只有1頁。對於Rails開發者來講,花了幾個小時,就能夠快速使用Sinatra開發Web Service了。Sinatra對多線程支持的很是好,能夠用rainbows 來跑多線程Sinatra,IO併發處理能力很好。Github也是用它來提供開放API服務的。我本身寫了一個 Sinatra的項目模版 ,若是你用Sinatra開發Web Service,能夠參考。數據庫
Padrinojson
Padrino是一個基於Sinatra之上的輕量級Web框架,在Sinatra基礎之上提供了命名路由,模塊化項目組織,頁面helpers和generators等等。Padrino是一個高度模仿Rails的框架,API的命名和Rails很像,Rails開發者花1-2天看看文檔就能夠快速上手開發了。Padrino相比Rails易學易用,多線程支持良好,性能比Rails好不少,開發Website推薦使用。我本身的網站也是用Padrino開發的,源代碼在: robbin_site後端
Goliathapi
Goliath是一個Ruby的纖程開發框架,性能很是好,做者自己是在開發PostRank產品過程當中開發的Goliath。PostRank是一個用戶社交行爲實時跟蹤工具,須要很高的性能來支撐,PostRank被Google收購了,做者如今在Google工做。Goliath適合用來開發對性能很是敏感的Web Service或者real-time的應用,但使用Goliath有一些門檻,你不能使用普通的阻塞IO庫,必須使用做者封裝的一些纖程的庫。http://tech.vonstark.co/post/20053649068/ruby-non-blocking-goliath ruby
比較適合寫Web服務接口的輕量級Web框架我推薦兩個:Grape和Sinatra,兩個的區別主要是:
Grape是個純粹的寫API的框架,提供了不少寫API很方便的功能,用Grape寫API很爽,應該是首選,他只提供json/xml/txt格式輸出。
Sinatra是個相對完善點的Web框架,帶有模板渲染功能,但單純寫API的話,沒有Grape爽。不過若是你的API Server有可能輸出HTML頁面片斷,須要模板功能的話,仍是Sinatra更合適,不然用Grape在代碼裏面拼字符串仍是很麻煩的事情。
Grape和Sinatra都是基於Rack之上很輕量級的封裝,我作了框架處理請求速度的測試,以及多線程併發的簡單測試,基本上性能差別很是小,Grape稍微快一點點,但不超過5%。