iPhone學(xué)習(xí)之路 基于HTTP長(zhǎng)連接Server PUSH
iPhone學(xué)習(xí)之路 基于HTTP長(zhǎng)連接Server PUSH是本文要介紹的內(nèi)容,本文主要是圍繞長(zhǎng)連接Server PUSH介紹,不多說(shuō),我們來(lái)看內(nèi)容。
服務(wù)器推實(shí)現(xiàn)的相關(guān)資料
有個(gè)不錯(cuò)的文章《Comet:基于 HTTP 長(zhǎng)連接的“服務(wù)器推”技術(shù)》。文章提到Comet現(xiàn)實(shí)應(yīng)用的需求:
監(jiān)控系統(tǒng):后臺(tái)硬件熱插拔、LED、溫度、電壓發(fā)生變化;
即時(shí)通信系統(tǒng):其它用戶登錄、發(fā)送信息;
即時(shí)報(bào)價(jià)系統(tǒng):后臺(tái)數(shù)據(jù)庫(kù)內(nèi)容發(fā)生變化;
也提到多種技術(shù)實(shí)現(xiàn)服務(wù)器推送。
我現(xiàn)在比較同意這個(gè),介紹了選擇要注意的事項(xiàng),比如服務(wù)器對(duì)long-polling的支持。現(xiàn)在主要關(guān)心:
如果數(shù)據(jù)推送頻率不高,并發(fā)壓力不大,可以用基于 AJAX 的長(zhǎng)輪詢(long-polling)方式,實(shí)現(xiàn)比較簡(jiǎn)單。nginx有個(gè)Module可以支持long-polling,可能以后還支持Streaming。long-polling每次返回?cái)?shù)據(jù)后是要再次請(qǐng)求。
如果數(shù)據(jù)變化快,想以推送為主,可以用基于 Iframe 及 htmlfile 的流(streaming)方式。這里有比較不錯(cuò)的介紹,里邊還介紹了APE等一些服務(wù)器實(shí)現(xiàn),要根據(jù)具體情況來(lái)選擇。比如APE是C實(shí)現(xiàn)的,我是用java的,對(duì)我來(lái)說(shuō)它不容易擴(kuò)展(基本javascript的擴(kuò)展性能可靠性能實(shí)現(xiàn)的功能要測(cè)試,對(duì)于實(shí)在想走80端口,這個(gè)是我目前找到的功能全,而且官方說(shuō)支持100K+并發(fā),但是目前資料少,說(shuō)明用的人不多啊)。
APE1.0主要還是long-polling,流方式使用XHRStreaming在IE上不行;相比而言streamHub流是使用寫<script>標(biāo)簽實(shí)現(xiàn)的,可以跨瀏覽器。那些不開源的不要說(shuō)了,python也不熟悉,Jetty 6 和 Tomcat 6已經(jīng)支持Comet,一般情況可以滿足,并發(fā)太大了也要做選擇,有人用netty自己實(shí)現(xiàn),支持10萬(wàn)以上。想自己寫服務(wù)器看這個(gè)用xsocket實(shí)現(xiàn)了。
2010.5補(bǔ)充:以前對(duì)長(zhǎng)連接和http persistent connection沒有太清晰的概念,在腦子里老是把請(qǐng)求和tcp連接混在一塊想。long-polling方式在firebug里能看到一個(gè)請(qǐng)求及數(shù)據(jù)返回響應(yīng),然后再請(qǐng)求,但都是同一tcp連接(支持http1.1的服務(wù)器)。像streamHub那樣用流方式的,我們看到一個(gè)返回響應(yīng)數(shù)據(jù)不斷漲,可通過(guò)其它請(qǐng)求,改變這一響應(yīng)數(shù)據(jù)內(nèi)容。以前錯(cuò)誤的認(rèn)為:這樣一個(gè)響應(yīng)才是同一連接,long-polling會(huì)重新建立tcp連接。
出于性能或其它原因,有些應(yīng)用比較適合用socket。B/S結(jié)構(gòu)客戶端可以用flash,以后HTML5,也是不錯(cuò)的選擇。看這里文章中提到:
自己實(shí)現(xiàn)的server通常存在性能及可擴(kuò)展性的問題,因此實(shí)現(xiàn)全部功能需要投入大量的開發(fā)精力。Hemlock通過(guò)flash長(zhǎng)連到XMPP Server上。由于XMPP Server(如openfire, ejabberd等)本身就支持多服務(wù)器,因此使用默認(rèn)的版本就可以支持上十萬(wàn)的并發(fā),如果稍加優(yōu)化,同時(shí)支持上百萬(wàn)用戶也不會(huì)有太大問題。
openfire開源的,基于mina實(shí)現(xiàn) (喜歡java代碼的也可以看看red5或者h(yuǎn)ttp://code.google.com/p/gfs-server/)
再加幾個(gè)基于netty的開源項(xiàng)目:
http://openr66.free.fr/GoldenGateFTP.html
http://code.google.com/p/jmemcache-daemon/
http://kevwil.github.com/aspen/
http://code.google.com/p/sensei-search/
(看到過(guò)的資料單機(jī)2*4core 16GB實(shí)現(xiàn)近50萬(wàn)在線連接,每秒處理近10萬(wàn)請(qǐng)求,c實(shí)現(xiàn),內(nèi)核,網(wǎng)卡等都經(jīng)過(guò)優(yōu)化;看過(guò)java***的就是Using Netty we have comet running on 100.000+ open connections - this uses some GB of memory and 20% of CPU on a quad core server.一個(gè)四核服務(wù)器10萬(wàn)以上連接)
小結(jié):詳解基于HTTP長(zhǎng)連接Server PUSH的內(nèi)容介紹完了,希望本文對(duì)你有所幫助!