《高性能網站建設進階指南》閱讀筆記 2
發布時間:2013-11-22 瀏覽:377打印字號:大中小
大部分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的興起和處理百萬級用戶量的解決方案的出現,其復雜性會逐漸降低。