2012-02-13 54 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