`

淺談 Comet PUSH Server 架構

    博客分类:
  • push
阅读更多
最近有機會碰到 Comet 或是 PUSH Server 這類的技術,剛好一直覺得之前寫的 Comet For Ruby on Rails and Mongrel不夠有感覺,所以再寫一次。這裡先得講一聲,我的認知就是 Comet == Server PUSH ,有錯請告知。

HTTP 統治網路界

簡單來說,一般的 Socket Programming 都是保持一個雙向的連線,可以送可以收。但是 HTTP Design 為了以下理由,設計方向為單向的。
  1. 提高 Server 處理效能
  2. 方便作 cache,Proxy 容易融入
  3. 方便作 Server Farm
  4. 網路發展初期,實體硬體狀況不佳,很容易造成 connection lose,單向傳輸可以有效避免瞬斷
我跟你 request ,你回我 HTML ,交易完成,connection close,This is HTTP。

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

HTTP 最大的問題在於即時性

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

Polling

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

以 RSS Reader 的屬性來說,採用 Polling 有很多好處
  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 來的好,這倒是無庸置疑的。
分享到:
评论

相关推荐

    server push

    "Server Push"是一种网络通信技术,它允许服务器主动地向客户端发送数据,而不仅仅是响应客户端的请求。在传统的HTTP协议中,服务器仅在接收到客户端请求时才会返回数据,但Server Push打破了这种单向通信模式,提高...

    ajax pushserver

    【标题】"Ajax PushServer" 是一个基于C#开发的实时数据推送服务示例,它利用Ajax技术实现Web端的即时通信。在传统的HTTP协议中,客户端与服务器之间的交互是基于请求-响应模型的,而Ajax Push(也称为Comet技术)...

    comet4j开发指南

    Comet4J开发指南 Comet4J是一个专为Java平台设计的服务器推送技术框架,它充分利用了AJAX(XMLHttpRequest)技术,实现了一种高效、实时的双向通信机制。在传统的HTTP协议中,服务器与客户端的交互是基于请求-响应...

    comet pushlet 例子

    Comet技术是一种优化Web应用程序实时通信的技术,它允许服务器向客户端推送数据,而不仅仅是响应客户端的请求。在传统的HTTP协议中,服务器只能在客户端发起请求时返回数据,但Comet打破了这种模式,通过长时间保持...

    Simple-Comet-Server:极简HTTP长轮询服务器和javascript客户端库

    一个简单的COMET服务器 ...cd Simple-Comet-Server sudo python setup.py install 强烈建议将simple_comet用作Nginx等前端服务器的后端。 服务器交换机 simple_comet --http-port=<HTTP> (default=none) 更改服务器

    Comet, 下一代反向AJAX(即服务器推送技术- Server-side push)

    Comet 有时也称反向 Ajax 或服务器端推技术(server-side push)。其思想很简单:将数据直接从服务器推到浏览器,而不必等到浏览器请求数据。听起来简单,但是如果熟悉 Web 应用程序,尤其是 HTTP 协议,那么您就会...

    Comet基于iframe的服务器推送(Server Push)例子

    NULL 博文链接:https://packecho.iteye.com/blog/857027

    web聊天 serverpush servlet实现

    【标题】:“Web聊天...总的来说,Servlet实现的Server Push技术,无论是基于Comet还是WebSocket,都是解决Web实时通信问题的有效手段。理解其工作原理和实践中的注意事项,对于构建高性能的实时Web应用至关重要。

    服务端推技术 - Server-side Push 多示例

    服务端推技术,也称为Server-side Push,是一种网络通信模式,允许服务器主动向客户端推送数据,而无需客户端发起请求。这种技术在实时性要求较高的应用中尤为重要,如在线聊天、实时股票更新、游戏同步等。在传统的...

    web推送 comet技术

    配置Tomcat7以支持Comet技术,通常需要修改服务器的配置文件,如`server.xml`,设置`Connector`元素的`asyncTimeout`属性来支持长时间的HTTP连接,并开启异步处理。这允许服务器在处理完一个请求后不立即关闭连接,...

    comet demo

    Comet技术通常有几种实现方式,包括长轮询(Long Polling)、iframe、流(Streaming)和HTTP/2 Server Push等。长轮询是最早的Comet实现,它延长了HTTP请求的生命周期,直到服务器有新消息才返回响应;iframe则是在...

    catalina-comet.jar

    Catalina-Comet.jar的兼容性使得开发者能够轻松地在现有的应用架构中集成Comet功能。 在实际开发中,理解并熟练运用Catalina-Comet.jar中的这些知识点至关重要,它将帮助开发者创建高性能、实时的Web应用程序,满足...

    comet4j 所需js以及comet4j-tomcat6.jar、comet4j-tomcat7.jar包

    综上所述,这个压缩包包含的`comet4j.js`、`comet4j-tomcat6.jar`和`comet4j-tomcat7.jar`是实现基于Java的Comet4j实时通信框架的关键组件。它们分别负责客户端的JavaScript交互、在Tomcat服务器上的集成和支持,为...

    Flex与java Server Push数据

    标题中的“Flex与Java Server Push数据”涉及到的技术是基于Adobe Flex客户端和Java服务器端的数据实时推送技术。在Web开发中,传统的HTTP协议是基于请求-响应模型的,但这种模式无法实现服务器主动向客户端推送数据...

    comet demo 向客户端推送例子

    这个"comet demo"是一个展示如何在Java环境下利用Tomcat服务器实现Comet技术的实例。Tomcat 6.0是Apache软件基金会开发的开源Servlet容器,支持各种Java Web应用的部署,包括Comet技术。 首先,Comet的核心在于保持...

    comet4j完整资源

    4. **事件驱动(Event-driven)**:Comet4j可能采用事件驱动架构,当服务器端有新数据时,会触发相应的事件,客户端通过监听这些事件来获取和处理数据。 5. **异步处理(Asynchronous Processing)**:为了处理大量并发...

    配置tomcat支持comet

    总结起来,配置Tomcat支持Comet涉及修改`server.xml`,启用APR库,配置Executor线程池,以及创建处理Comet请求的Servlet。通过这种方式,我们可以实现服务器主动向客户端推送数据,满足实时性较高的应用场景。

    comet4j.jar

    Comet4j是一个Java库,专门用于实现Comet技术,这是一种服务器向客户端推送数据的Web应用程序设计模式。Comet技术打破了传统的HTTP请求-响应模型,允许服务器在客户端保持持久连接,从而实现实时数据更新。这在需要...

    comet4j完整包

    - **Comet**:Comet是一种Web应用架构,用于实现实时Web服务。它通过在服务器和客户端之间长时间保持HTTP连接来实现双向通信,使得服务器可以在数据准备好时立即推送给客户端,而不仅仅是响应客户端的请求。 - **长...

Global site tag (gtag.js) - Google Analytics