蚌埠三中2015高考成绩:Comet 或是 PUSH Server

来源:百度文库 编辑:九乡新闻网 时间:2024/07/14 03:47:44

最近有机会碰到 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 来的好,这倒是无庸置疑的。