Google 應(yīng)用系統(tǒng)引擎最初是以 Apache Tomcat 作為其 webserver/servlet 容器的,但最終將切換到 Jetty 上。 這個(gè)決定讓許多開發(fā)人員都詫異的想問:為什么要做這樣的改變?Tomcat 有什么問題嗎? 我們獲得的一次訪問 Webtide ——Jetty 背后的公司——里的這個(gè)團(tuán)隊(duì)的機(jī)會(huì),得到了關(guān)于這個(gè)決定背后更詳細(xì)的信息。
記者: 為什么Google選擇Jetty作為其應(yīng)用系統(tǒng)的引擎,而不是 Tomcat 或其他的?
Google選擇Jetty的關(guān)鍵原因是它的體積和靈活性。 在云計(jì)算里,體積的因素是很重要,如果你運(yùn)行幾萬個(gè)Jetty的實(shí)例(Google就是這樣干的),每個(gè)server省1兆,那就會(huì)省10幾個(gè)G的內(nèi)存(或能夠給其他應(yīng)用提供更多的內(nèi)存)。
Jetty 被設(shè)計(jì)成了可插拔和可擴(kuò)展的特性,這樣Google就可以高度的自定義它。 他們?cè)谄渲刑鎿Q了他們自己的HTTP connector,Google認(rèn)證,以及他們自己的session集群。也真是奇怪,這個(gè)特性對(duì)于云計(jì)算來說是非常出色的,但同時(shí)也讓Jetty非常適合嵌入小的設(shè)備中,例如手機(jī)和機(jī)頂盒。
記者: 是什么促使Jetty成為Java里出色的servlet容器?
我們?cè)陂_發(fā)Jetty時(shí),并沒有想著要把它開發(fā)成一個(gè)全功能的應(yīng)用server(盡管它是的)。每一項(xiàng)功能都考慮了可插拔性,所以,如果你不需要他,你就可以不把它加載到內(nèi)存里,把它從request 處理調(diào)用鏈中去掉。如果你不需要sessons,你可以把session處理器拿掉,這樣你就不要浪費(fèi)資源去來回尋找session cookie了。當(dāng)你每秒鐘都有出來上千個(gè)請(qǐng)求時(shí),這些微小的查找動(dòng)作的開銷是非常的大的。
我們也并沒有想當(dāng)然的企圖通過設(shè)計(jì)就可以得到最優(yōu)化的代碼,我們是如同收集沙粒般,每次得到一些人告訴我們?nèi)绾尾拍苡泻玫腏VMs優(yōu)化和垃圾回收辦法。這是真的,已經(jīng)很小心的代碼仍然能被優(yōu)化,最后的效果就是避免創(chuàng)建新的對(duì)象。例如,我們?cè)贘etty里使用并行處理技術(shù),但我們并沒有使用很多標(biāo)準(zhǔn)的并行處理數(shù)據(jù)結(jié)構(gòu),因?yàn)檫@需要?jiǎng)?chuàng)建太多的對(duì)象。所以,只是作為個(gè)例子,我們使用了雙并行鎖循環(huán) arrays,而不是采用并行鏈?zhǔn)?lists,這樣我們就能夠在不創(chuàng)建對(duì)象的情況下,獲得了非阻塞并行效果。
記者: 是什么使Jetty成為開發(fā)人員的一個(gè)有用的server平臺(tái)的(例如:testing)?
Jetty 已經(jīng)在一些流行框架中內(nèi)置了,例如GWT,scala/lift,grails,Jruby等等,還有很多。如果你使用了這些技術(shù),你就直接可以用Jetty了。 Jetty-maven 插件是另外一個(gè)非常優(yōu)秀的開發(fā)工具,它能讓web應(yīng)用在不打包成war文件的情況下運(yùn)行。源文件可以直接編輯,在不需要把它重新放進(jìn)war文件的情況下獲得測(cè)試結(jié)果。 Jetty嵌入式的特征讓我們不再需要寫通過寫那些main方法、通過你的IDE,調(diào)試器或 profiler 來運(yùn)行之類的無聊的事情。
記者: Jetty在處理 client-server 請(qǐng)求時(shí)有什么獨(dú)特的地方嗎?
Jetty 現(xiàn)在是一個(gè)第二代的異步處理server。 過去的兩年里,我們讓Jetty實(shí)現(xiàn)了處理異步請(qǐng)求的功能,這成了它核心架構(gòu)的一部分。就像其他的支持異步serlets容器一樣,我想,他們會(huì)發(fā)現(xiàn)這個(gè)東西并不是看起來的那么簡(jiǎn)單和容易。 我們的異步HTTP引擎被我們復(fù)用在了HTTP client 上,所以我們可以大量的降低request 和 responses 消耗。
同時(shí),就像我之前提到過的,我們的請(qǐng)求處理器是可擴(kuò)展和可插拔的,這讓web application可以被單獨(dú)省略掉,或者是單獨(dú)使用,或者是進(jìn)一步擴(kuò)展的application。
記者: 有沒有其他Jetty使用的案例,大的或小的?
使用Jetty的公司有像Zimbra/Yahoo,這意味著Jetty正作為web mail 服務(wù)器,為百萬級(jí)的用戶提供服務(wù)。 Eclipse IDE把它內(nèi)置了進(jìn)去,這意味著有成百萬的開發(fā)者在桌面運(yùn)行Jetty。 Jetty被 hadoop map/reduce cluster使用,在其上有幾千個(gè)點(diǎn)的集群,處理著世界最大的TB級(jí)別的數(shù)據(jù)分類排序工作。 我們也有 J2ME 的接口,有本地編譯器,所以我們可以在手機(jī)上,家用路由器和 Java cards 上運(yùn)行。 更多的Jetty使用的例子可以參考 http://docs.codehaus.org/display/JETTY/Jetty+Powered
記者: Jetty的將來或藍(lán)圖是怎樣的?
Jetty 最近的計(jì)劃是發(fā)布 7.0.0 版本,這將會(huì)完全的遷移到eclipse foundation 下。 Jetty 7 將會(huì)支持很多 servlet 3.0 的特征,但是并不會(huì)使用新的API 和 不會(huì)依賴Java 1.6 。 Jetty 7后,很快我們會(huì)發(fā)布Jetty 8,這將會(huì)完全支持 servlet 3.0 和 Java 1.6,Jetty 會(huì)繼續(xù)的創(chuàng)新 和跟蹤各種web 2.0 里的其他的新成果。 我們現(xiàn)在已經(jīng)能支持 Firefox 3.5 里的跨域Ajax功能,我們可以在cometd版本里使用這個(gè)。 我們很快就會(huì)增加對(duì) WebSocket 和 BWTP 的支持。 對(duì) Google wave 以及相關(guān)協(xié)議的支持的問題已經(jīng)優(yōu)先排到了我們的議事日程上了。
記者: Google/Jetty 還有其他的計(jì)劃嗎?
Google有他們自己下棋的棋局,我們并不清楚。 我們?cè)贘avaOne大會(huì)上曾經(jīng)和App Engine開發(fā)者們有個(gè)簡(jiǎn)單的對(duì)話,我們?cè)敢饴犓麄內(nèi)魏蔚姆答伜鸵庖姡脕砀倪M(jìn)Jetty的可嵌入性和可擴(kuò)展性。
下面的跟Webtide團(tuán)隊(duì)的討論中,我們?cè)儐柫薙pringSource 從Jetty轉(zhuǎn)換到Tomcat的事情。
記者: 你們?nèi)绾慰创?SpringSource 把 Grails 從本來作為缺省容器的Jetty換成了Tomcat的事情?
原因是grails開發(fā)的領(lǐng)導(dǎo)感覺使用Tomcat能從內(nèi)部的Tomcat開發(fā)人員哪里獲得更好的”服務(wù)“。我猜測(cè),他們把Grails的用戶驅(qū)趕到某一個(gè)平臺(tái),以讓SpringSource能更好的銷售他們的技術(shù)支持服務(wù)。幾年前我們看到了相同的事情,JBoss 雇傭了一下tomcat開發(fā)人員后把Jetty提出成了Tomcat,并最終和Mort Bay達(dá)成了商業(yè)合同。 很遺憾,這些商業(yè)協(xié)議對(duì)技術(shù)選擇有如此大的影響,當(dāng)相同的是,一些基礎(chǔ)結(jié)構(gòu)的工程也正聚集到也application server 為中心的隊(duì)伍里來。
Grails將會(huì)繼續(xù)同時(shí)支持對(duì)Jetty和Tomcat的集成,但會(huì)改成Tomcat為缺省服務(wù)。
這看起來是 SpringSource使用/攀附 Tomcat 的一個(gè)特別合適的論斷。
本篇文章原地址:http://lifeside.javaeye.com/blog/452361