我有一个非常简单的长轮询 ajax 调用,如下所示:
(function poll(){
$.ajax({ url: "myserver", success: function(data){
//do my stuff here
}, dataType: "json", complete: poll, timeout: 30000 });
})();
我今天下午刚刚拿起这个例子,它看起来效果很好。我正在使用它在我的页面上构建一些 html,据我所知,它几乎是即时的。我有点担心这会让工作线程在我的服务器上保持打开状态,如果服务器上的负载太大,它会完全停止。有人可以阐明这个理论吗?在后端,我有一个 webapi 服务 (.net mvc 4),它调用数据库、构建对象,然后将对象传回。在我看来,为了使其工作,服务器必须不断调用数据库......这不太好,对吗???
我的下一个问题是客户端确定是否需要更新页面上的 html 的最佳方法是什么?目前,我正在使用 JSON.stringify() 将我的对象转换为字符串,并将该字符串与旧字符串进行比较,如果存在增量,它会重写页面上的 html。现在还没有完整的内容对象中的很多东西都下来了,但它可能会变得非常大,我认为进行字符串比较对客户端来说可能是相当资源密集的......特别是如果它几乎不断地这样做的话。
对我来说,底线是这样的:我不确定轮询的工作时间有多长。我只是用谷歌搜索并找到了上面的示例代码并实现了它,从表面上看,它很棒。我只是担心它会让事情陷入困境(在服务器上)并且我将旧结果与新结果进行比较的方式将使事情陷入困境(在客户端上)。
我们非常感谢您提供的任何及所有信息。
TIA.
好的,我的两分钱:
- 正如其他人所说,SignalR 是经过尝试和测试的代码,因此我真的会考虑使用它,而不是编写自己的代码。
- SignalR 确实更改了一些 IIS 设置以针对此类工作优化 IIS。因此,如果您想实现自己的,请查看在 SignalR 中完成的 IIS 设置更改 https://github.com/SignalR/SignalR/wiki/Performance
- 我想您正在进行长轮询,以便您的服务器可以实现某种形式的服务器推送。请记住,这将将无状态 HTTP 机器变成有状态机器如果你想扩展,这不太好。负载均衡器后面的长轮询并不好 :) 对我来说,这是服务器推送最糟糕的事情。
- ASP.NET 使用 ThreadPool 来处理请求。长轮询将占用 ThreadPool 线程。如果你有太多这样的线程,你可能会陷入线程匮乏(和眼泪)的境地。作为一个大概数字,100 并不算太多,但+1000 就已经太多了。
- 甚至 SignalR 团队也表示针对 SingalR 进行了优化的 IIS 框可能并未针对普通 ASP.NET 进行了优化,因此他们建议将这些框分开。所以这意味着成本和开销。
最后,我建议使用长轮询如果您正在解决业务问题(并不是因为它很酷)因为这样就可以支付其成本、管理费用和头痛。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)