淺談 Comet PUSH Server 架構 - 轉自日本看板-在日中國人網絡社區

最近有機會碰到 Comet 或是 PUSH Server 這類的技術,剛好一直覺得以前寫的 Comet For Ruby on Rails and Mongrel不夠有感覺,因此再寫一次。這裡先得講一聲,個人認知就是 Comet == Server PUSH ,有錯請告知。html

HTTP 統治網路界ruby

簡單來說,通常的 Socket Programming 都是保持一個雙向的連線,能夠送能夠收。可是 HTTP Design 為瞭如下理由,設計方向為單向的。 socket

  1. 提升 Server 處理效能
  2. 方便做 cache,Proxy 容易融入
  3. 方便做 Server Farm
  4. 網路發展初期,實體硬體狀況不佳,很容易形成 connection lose,單向傳輸能夠有效避免瞬斷

我跟你 request ,你回我 HTML ,交易完成,connection close,This is [HTTP。] ruby-on-rails

若是以 HTTP 當初設計的初衷「文件交換」來看,我們發現到他設計的很是的好,也相當成功的在當初糟糕的網路環境下成功的生存下來。可是就是因為 HTTP 設計太成功了,導致現在網路業者一股腦兒將各式各樣的 App 放在 HTTP 的架構上,想要用當初只是為了文件交換的協定,變成一個包山包海的協定,天然產生不少問題。.net

HTTP 最大的問題在於即時性。xml

要解決 HTTP 的即時性的問題,有 Polling 跟 Server PUSH 這兩種方式。htm

Polling事件

我們想要作到即時傳訊,Server 端觸發 Client 事件等等功能,以現行的 HTTP 架構下,都得利用 Polling 的方式來作到。Polling 其實也就是現在的 RSS Reader 的做法,RSS Reader 會每過半個小時,或是一個小時去問對方 Server 有沒有新文章。用 Polling來做即時性的功能,最大的好處在於容易寫,因為他徹底符合 HTTP 的架構,可是最大的壞處在於不夠即時。以 RSS Reader 來說,每過一個小時去問有沒有新文章,表明的意思就是有一整個小時的空窗期,你得每過一個小時才知道有沒有新文章。ip

以 RSS Reader 的屬性來說,採用 Polling 有不少好處 get

  1. 我其實不須要知道馬上知道有多少新文章,使用者對於 RSS 的即時性需求沒那麼高
  2. Blog 系統多變,與其設定一個各 Blog 系統共通的 Socket 協定,不如設定一個共通的文件交換格式來的簡單

可是若是使用聊天室,即時訊息傳遞,Polling 就不是一個好主意了。聊天最怕不夠即時,因此必須加快 Polling Interval,可是會帶來「提升 Server 負載」的後果。你一分鐘 Polling 一次,跟一小時一次,前者的負載是後者的 60 倍。等於你用負載換來即時性。這個在人一多的情況下會形成相當大的負擔。

因為 Polling 在某些地方不是那麼的好,因此纔有 Server PUSH 機製出現。

Server PUSH

Server PUSH 是建構在創建一個不中斷的 Socket Connection 下面。一個做法是使用 iframe ,送出的header中要把content-type設為」 multipart/x-mixed-replace」,來保持一個不間斷的 HTTP Connection。另一個做法就是用 Flash 來跟 Server 創建一個 xmlsocket。保持一個不中斷的 Connection ,表明 Server 有新訊息就能夠直接傳給 Client,不用等待 Client 過來 request。

這樣能夠帶來的好處就是,Server 有狀態更新才會有網路傳輸,若是沒有狀態更新,就不會浪費資源。而 Polling 是無論有沒有狀態更新,都得花上固定的網路傳輸成本,當然就會比較浪費資源。

舉個例子,考試成績快出來了,你每個小時都從宿舍去公佈欄當作績出來了沒,假設成績沒那麼快出來,你天然會花上許多無意義的時間在宿舍到公佈欄之間的往返上面( Polling )。可是若是老師有你的手機(不斷線的 Connection ),成績公佈老師就打電話給你,告訴你的成績(Server Push)。這樣不是好多了嗎?

可是你會問,假設老師打電話給你,你在收不到訊號的地方怎麼辦?假設班上人數太多,老師不是就會打電話打到手軟?

這剛好講到 Server PUSH 的壞處,第一個壞處是假設 Client 網路很差,connection 形成瞬斷,那麼你的訊息就會消失不見了。另一個壞處就是,持續性的 connection 很難作到 Load Sharing機制,一般你們都只會跟同一臺 PUSH Server 做連接,這臺 PUSH Server 在人一多就會產生大負載度的問題。這當然有辦法解決,只是這就已經要討論到很深的地方了。

雖然 Server PUSH 不是萬能的。不過整體來說,以傳遞「即時性需求高的訊息來說」,PUSH Server 帶來的好處絕對會比 Polling 來的好,這卻是無庸置疑的。

相關文章
相關標籤/搜索