《高性能网站建设进阶指南》阅读笔记 2

大部分Comet服务器或明显地减少每个线程的资源开销,或者使用微线程或进程。如ErlyComet

大多数使用Comet的Php web应用采用分离式(off-board),Php编写的客户端与使用另一门语言编写的服务端通信。

工具包:Dojo Toolkit 或者 js.io

8.2 Transport Techniques

8.2.1 Polling

每x 毫秒发出一个请求,检查是否有更新

setTimeout(function() {xhrRequest( {"foo" : "bar"})}, 2000);

 

function xhrRequest(data) {

           var xhr = new XMLHttpRequest();

            xhr.open("get", "http://localhost/foo.php", true);

            xhr.onreadystatechange = function() {

                      if(xhr.readyState == 4) {

                                //

                      }

           };

           xhr.send(null);

}

8.2.2 Long  polling

Polling 可能会浪费http请求,并且消耗宝贵的CPU时间和带宽。即便数据更新间隔时间已知,polling可能会导致服务器端超负荷。服务器端还没有响应上一个数据请求,第2个或者第3个请求接踵而至,对服务器进行狂轰乱炸。

 

Long polling: 服务器端只有在有可用的新数据时才响应,保持一个所有未响应请求和它们对应连接的大集合。服务端通过: Transfer-Encoding:chunked 或 Connection:close响应来保持这些请求连接。

 

 

function longPoll(url, callback) {

         var xhr = new XMLHttpRequest();

         xhr.onreadystatechange == function() {

              if(xhr.readyState ==4) {

                      callback(xhr.responseText);

                      xhr.open('GET', url, true);

                      xhr.send(null);

              }

           }

 

          xhr.open('POST', url, true);

          xhr.send(null);

}

 

长连接的为您提:每台Apache服务器大约可以处理10 000个并发连接,而一个运行良好的Comet服务器应该有能力处理超过50 000个并发长连接,这在处理实时应用时是非常可取的。

8.2.3 Forever Frame

打开一个隐藏的Iframe,请求一个基于Http1.1 快编码的文档.

8.2.4 XHR Streaming

function xhrStreaming(url, callback) {

       xhr = new XMLHttpRequest();

       xhr.open('POST', url, true);

       var lastSize;

       if(xhr.readyState > 2 ) {

                    newTextReceived = xhr.responseText.substring(lastSize);

                    lastSize = xhr.responseText.length;

                    callback(newTextReceived);

       }

       if(xhr.readyState == 4) {

                    xhrStreaming(url, callback);

       }

8.2.5 websocket html5

8.3 Corss-Domain

Html5 postMessage

callback polling 

JSONP polling

 

function callbackPolling(url, callback) {

      var script = document.createElement("script");

      script.type = "text/javascript";

      script.src = url + "callback=callbackPolling.callback");

      callbackPolling.callback = function(data) {

           callbackPolling(url, callback);

           callback(data);

      };

      document.getElementsByTagName("head")[0].appendChild(script);

}

 

http://bob.pythonmac.org/archives/2005/12/05/remote-json-jsonp/ (八卦:麻球网,被盛大收购)

http://ajaxian.com/archives/jsonp-json-with-padding

http://ajaxpatterns.org/On-Demand_Javascript

8.4.1 Manging connections

FreeBSD/OS X 的 Kqueue

Linux 的 epoll

Windows 的 completions ports

 

主流语言中一些网络库封装成了一致且跨平台的API

C的libevent java.nio, twisted python

 

性能优化在不同情况下也大相径庭,比如聊天程序,有许多连接,但在任何一个特定时间内只有一小部分用户在接收信息。通过服务器端的连接共享管理大量闲置连接是有好处的。http://orbited.org 和 willowchat.org 做了深入的优化

 

实时股票报价监控应用程序,大量的连接不断地更细,很少有闲置连接的存在。Jetty/Lightstreamer/Liberator对这种情况作了优化。

8.4.3 portocols

Comet的连接只允许server -> client 通信或双向通信。

Bayeux Publish-Subscribe(pubsub)模型

 

随着websocket的兴起和处理百万级用户量的解决方案的出现,其复杂性会逐渐降低。

 


 

课后作业:

 

LBS/SNS类网站连接的case 属于哪一种

Jetty的源码阅读

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

FireCoder

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值