【问题标题】:Simple jquery ajax vs SignalR vs AspComet简单的 jquery ajax vs SignalR vs AspComet
【发布时间】:2012-03-04 16:25:11
【问题描述】:

我正在阅读有关长轮询、彗星等的信息,并且在 .Net 上工作时,我阅读了有关 SignalR 和 AspComet 的所有信息。我是彗星和类似的新手,但我不清楚使用 SignalR 或 AspComet 有什么优势,我可以简单地使用 jquery.ajax/complete:

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

但我显然在这里遗漏了一些东西,你能帮忙吗?

另外,从系统/服务器的角度来看,主要区别是什么?我知道使用 $.ajax 我打开了与服务器的连接并长时间保持打开状态(具有太多同时打开的连接等的所有缺点),但我认为 SignalR 也是如此。或不? 而在这方面,AspComet 表示它会将线程释放回请求池。

我知道,我有点困惑,非常感谢您介绍一下使用 SignalR 和/或 AspComet 与 $.ajax 的优势:)

谢谢!

【问题讨论】:

    标签: comet long-polling signalr


    【解决方案1】:

    在您的 $.ajax 示例中,您正在向服务器发送多个请求,并且您正在为每个客户端执行此操作。因此,您的 Web 服务器会不断受到 HTTP 请求的冲击,而其中只有少数真正起到了作用,因为客户端订阅通知的数据可能不会经常更改。只要一个 AJAX 请求完成,就会立即发送另一个 AJAX 请求。

    而在长轮询中,您发送的单个请求被服务器阻止并允许它写入响应并因此通知客户端。

    长轮询的优点是可以限制发送到服务器的 HTTP 请求数。

    【讨论】:

    • 我从blog 中举了这个例子,他们说只有一个请求被发送到服务器,直到它完成(再次递归调用轮询)。该示例应该是长轮询。我引错了什么?
    【解决方案2】:

    COMET 应用程序通常需要自定义服务器。 IIS 保留一个专用线程来处理显然无法扩展的每个请求。 IIS 中每个 CPU 有几千个线程的限制。

    AspComet 通过提供服务器端解决方案来处理线程生命周期来解决这个问题(就像您写的那样,它将线程返回到池中)。 AspComet 与Bayeux Protocol 兼容,因此您可以使用任何 Bayeux JS 客户端。

    SignalR 是一种客户端/服务器解决方案,它将底层通信协议封装在异步调用中。 SignalR 选择可用的最佳协议(长轮询、websockets 或其他),因此您无需担心。他们有 .NET、Silverlight、WP7、JS 等的客户端。

    【讨论】:

    • 谢谢!事情开始变得清晰起来。当我在多实例环境中托管我们的应用程序时,还不能使用 SignalR,因为如果应用程序的实例不止一个,它就无法正常工作。我想知道 AspComet 是否对多实例友好。有什么想法吗?
    • @Pietro 抱歉,我从未使用过 AspComet。我知道 SignalR 团队正在努力解决这个问题。
    • 我知道我参加聚会迟到了,但我想为多实例添加我的 2 美分。 AspComet 不支持开箱即用的多实例,至少如果您使用示例配置,因为它将客户端存储库存储在内存中。您可以通过其他可以跨实例共享的方式持久化客户端存储库,但性能可能会由于延迟或锁定争用而降低。我们最终做的是使用负载均衡器将彗星请求定向到特定实例。看起来他们正在为 signalr 开发一个 redis 存储,但它可能已经被放弃了?
    猜你喜欢
    • 1970-01-01
    • 2016-07-20
    • 2014-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-21
    • 1970-01-01
    相关资源
    最近更新 更多