2012-02-13 74 views
2

我正在閱讀關於長輪詢,彗星等和在.Net上工作,我讀了關於SignalR和AspComet的所有信息。我是一個對彗星&類似的新手,但在那裏我可以簡單地使用jquery.ajax這是我不清楚什麼是使用SignalR或AspComet優勢/完整:簡單的jquery ajax vs SignalR vs AspComet

(function poll(){ 
    $.ajax({ url: "server", success: function(data){ 
     doSomething();  
    }, dataType: "json", complete: poll, timeout: 30000 }); 
})(); 

但我清楚地失去了一些東西, 你能幫我嗎?

另外,從系統/服務器的角度來看,主要區別是什麼?我知道用$ .ajax打開一個到服務器的連接,並保持打開很長時間(具有太多開放同時連接等缺點),但我認爲SignalR也是如此。或不? 雖然,AspComet表示它將線程釋放回請求池。

我知道,我有點困惑和對優勢的介紹使用SignalR和/或AspComet VS的$。阿賈克斯的東西將不勝感激:)

謝謝!

回答

2

在您的$.ajax示例中,您向服務器發送多個請求,並且您正在爲每個客戶端執行此操作。因此,您的Web服務器不斷受到HTTP請求的攻擊,其中只有少數實際服務於某個目的,因爲客戶訂閱了通知的數據可能不會經常更改。只要一個AJAX請求完成,另一個立即發送。

而通過長時間輪詢,您發送的是單個請求,該請求被服務器阻止並允許寫入響應並通知客戶端。

長輪詢的優點是您限制發送到服務器的HTTP請求數量。

+0

我從[blog](http://techoctave.com/c7/posts/60-simple-long-polling-example-與-javascript和jQuery),他們說只有一個請求被髮送到服務器,直到它完成(遞歸調用輪詢再次)。這個例子應該是long-polling。我誤解了任何內容? – Pietro 2012-02-13 11:56:24

2

COMET應用程序通常需要定製服務器。 IIS保留一個專用的線程來處理每個顯然不能縮放的請求。 IIS中每個CPU有幾千個線程的限制。

AspComet通過提供服務器端解決方案來解決這個問題,以處理線程生命週期(就像你寫的,它將線程返回到池)。 AspComet與Bayeux Protocol兼容,因此您可以使用任何Bayeux JS客戶端。

SignalR是一種客戶端/服務器解決方案,它將異步調用中的底層通信協議封裝起來。 SignalR選擇最好的協議(長輪詢,websockets或其他),所以你不必擔心它。他們有.NET,Silverlight,WP7,JS等客戶端。

+0

謝謝!事情開始變得更加清晰。由於我在多實例環境中託管我們的應用程序,SignalR無法使用,因爲如果應用程序有多個實例,它無法正常工作。我想知道AspComet是否是多實例友好的。有任何想法嗎? – Pietro 2012-02-14 07:46:05

+0

@Pietro對不起,但我從未使用AspComet。我知道SignalR團隊正在努力。 – nmat 2012-02-14 10:44:09

+0

我知道我遲到了,但我想添加我的2美分多實例。由於AspComet將客戶端存儲庫存儲在內存中,因此至少在使用示例配置時,AspComet不支持多實例。您可以通過其他可以跨實例共享的其他方式持久存儲客戶端存儲庫,但性能可能會因延遲或鎖定爭用而降低。我們最終做的是使用負載均衡器將彗星請求引導至特定實例。看起來他們正在爲signalr的redis商店工作,但它可能已被放棄? – 2013-10-09 19:34:07