|
最近有機(jī)會碰到 Comet 或是 PUSH Server 這類的技術(shù),剛好一直覺得之前寫的 Comet For Ruby on Rails and Mongrel不夠有感覺,所以再寫一次。這里先得講一聲,我的認(rèn)知就是 Comet == Server PUSH ,有錯(cuò)請告知。 HTTP 統(tǒng)治網(wǎng)絡(luò)界 簡單來說,一般的 Socket Programming 都是保持一個(gè)雙向的聯(lián)機(jī),可以送可以收。但是 HTTP Design 為了以下理由,設(shè)計(jì)方向?yàn)閱蜗虻摹?/span>
我跟你 request ,你回我 HTML ,交易完成,connection close,This is [HTTP。] 如果以 HTTP 當(dāng)初設(shè)計(jì)的初衷「文件交換」來看,我們發(fā)現(xiàn)到他設(shè)計(jì)的非常的好,也相當(dāng)成功的在當(dāng)初糟糕的網(wǎng)絡(luò)環(huán)境下成功的生存下來。但是就是因?yàn)?/span> HTTP 設(shè)計(jì)太成功了,導(dǎo)致現(xiàn)在網(wǎng)絡(luò)業(yè)者一股腦兒將各式各樣的 App 放在 HTTP 的架構(gòu)上,想要用當(dāng)初只是為了文件交換的協(xié)議,變成一個(gè)包山包海的協(xié)議,自然產(chǎn)生很多問題。 HTTP 最大的問題在于實(shí)時(shí)性。 要解決 HTTP 的實(shí)時(shí)性的問題,有 Polling 跟 Server PUSH 這兩種方式。 Polling 我們想要做到實(shí)時(shí)傳訊,Server 端觸發(fā) Client 事件等等功能,以現(xiàn)行的 HTTP 架構(gòu)下,都得利用 Polling 的方式來做到。Polling 其實(shí)也就是現(xiàn)在的 RSS Reader 的作法,RSS Reader 會每過半個(gè)小時(shí),或是一個(gè)小時(shí)去問對方 Server 有沒有新文章。用 Polling來作實(shí)時(shí)性的功能,最大的好處在于容易寫,因?yàn)樗耆?/span> HTTP 的架構(gòu),但是最大的壞處在于不夠?qū)崟r(shí)。以 RSS Reader 來說,每過一個(gè)小時(shí)去問有沒有新文章,代表的意思就是有一整個(gè)小時(shí)的空窗期,你得每過一個(gè)小時(shí)才知道有沒有新文章。 以 RSS Reader 的屬性來說,采用 Polling 有很多好處
但是如果使用聊天室,即時(shí)消息傳遞,Polling 就不是一個(gè)好主意了。聊天最怕不夠?qū)崟r(shí),所以必須加快 Polling Interval,但是會帶來「提高 Server 負(fù)載」的后果。你一分鐘 Polling 一次,跟一小時(shí)一次,前者的負(fù)載是后者的 60 倍。等于你用負(fù)載換來實(shí)時(shí)性。這個(gè)在人一多的情況下會造成相當(dāng)大的負(fù)擔(dān)。 因?yàn)?/span> Polling 在某些地方不是那么的好,所以才有 Server PUSH 機(jī)制出現(xiàn)。 Server PUSH Server PUSH 是建構(gòu)在建立一個(gè)不中斷的 Socket Connection 下面。一個(gè)作法是使用 iframe ,送出的header中要把content-type設(shè)為” multipart/x-mixed-replace”,來保持一個(gè)不間斷的 HTTP Connection。另外一個(gè)作法就是用 Flash 來跟 Server 建立一個(gè) xmlsocket。保持一個(gè)不中斷的 Connection ,代表 Server 有新訊息就可以直接傳給 Client,不用等待 Client 過來 request。 這樣可以帶來的好處就是,Server 有狀態(tài)更新才會有網(wǎng)絡(luò)傳輸,如果沒有狀態(tài)更新,就不會浪費(fèi)資源。而 Polling 是不管有沒有狀態(tài)更新,都得花上固定的網(wǎng)絡(luò)傳輸成本,當(dāng)然就會比較浪費(fèi)資源。 舉個(gè)例子,考試成績快出來了,你每個(gè)小時(shí)都從宿舍去公布欄看成績出來了沒,假設(shè)成績沒那么快出來,你自然會花上許多無意義的時(shí)間在宿舍到公布欄之間的往返上面( Polling )。但是如果老師有你的手機(jī)(不斷線的 Connection ),成績公布老師就打電話給你,告訴你的成績(Server Push)。這樣不是好多了嗎? 但是你會問,假設(shè)老師打電話給你,你在收不到訊號的地方怎么辦?假設(shè)班上人數(shù)太多,老師不是就會打電話打到手軟? 這剛好講到 Server PUSH 的壞處,第一個(gè)壞處是假設(shè) Client 網(wǎng)絡(luò)不好,connection 造成瞬斷,那么你的訊息就會消失不見了。另外一個(gè)壞處就是,持續(xù)性的 connection 很難做到 Load Sharing機(jī)制,通常大家都只會跟同一臺 PUSH Server 作連接,這臺 PUSH Server 在人一多就會產(chǎn)生大負(fù)載度的問題。這當(dāng)然有辦法解決,只是這就已經(jīng)要討論到很深的地方了。 雖然 Server PUSH 不是萬能的。不過整體來說,以傳遞「實(shí)時(shí)性需求高的訊息來說」,PUSH Server 帶來的好處絕對會比 Polling 來的好,這倒是無庸置疑的。 |
|
|