我正在编写一个webapp(仅与Firefox兼容),它使用长轮询(通过jQuery的ajax功能)从服务器向客户端发送或多或少的持续更新.我很关心长时间运行这种运行的影响,比如说,整天或整夜.基本代码框架是这样的:
function processResults(xml)
{
// do stuff with the xml from the server
}
function fetch()
{
setTimeout(function ()
{
$.ajax({
type: 'GET',
url: 'foo/bar/baz',
dataType: 'xml',
success: function (xml)
{
processResults(xml);
fetch();
},
error: function (xhr, type, exception)
{
if (xhr.status === 0)
{
console.log('XMLHttpRequest cancelled');
}
else
{
console.debug(xhr);
fetch();
}
}
});
}, 500);
}
Run Code Online (Sandbox Code Playgroud)
(半秒"睡眠"是这样的,如果更新快速返回到客户端,客户端不会锤击服务器 - 这通常是他们的.)
在一夜之间离开之后,它往往会让Firefox爬行.我一直在想这可能部分是由于堆栈深度很大,因为我基本上编写了一个无限递归函数.但是,如果我使用Firebug并抛出一个断点fetch,看起来情况并非如此.Firebug向我展示的堆栈只有大约4或5帧深,即使在一小时后也是如此.
我正在考虑的解决方案之一是将递归函数更改为迭代函数,但我无法弄清楚如何在不旋转的情况下在Ajax请求之间插入延迟.我已经查看了JS 1.7"yield"关键字,但我无法完全理解它,以确定它是否是我需要的.
是最好的解决方案,只是定期在页面上进行硬刷新,比如每小时一次?是否有更好/更精简的长轮询设计模式即使在运行8或12小时后也不会对浏览器造成伤害?或者我应该完全跳过长轮询并使用不同的"常量更新"模式,因为我通常知道服务器对我的响应频率如何?
使用iframe进行Comet长轮询有什么好处?为什么不将脚本文件中的异步ajax请求保存到主页面?谢谢.
我正在尝试使用node.js提供60秒的长轮询请求.我面临的问题是,浏览器正在超时.相同的设置工作30秒.任何人都可以建议如何实现这一目标?使用JQuery作为JS框架.
谢谢...
我正在玩一些原始的XmlHttpRequestObjects + Comet Long Polling.(通常,我会让GWT或其他框架为我处理此问题,但我想了解更多信息.)
我写了以下代码:
function longPoll() {
var xhr = createXHR(); // Creates an XmlHttpRequestObject
xhr.open('GET', 'LongPollServlet', true);
xhr.onreadystatechange = function () {
if (xhr.readyState == 4) {
if (xhr.status == 200) {
...
}
if (xhr.status > 0) {
longPoll();
}
}
}
xhr.send(null);
}
...
<body onload="javascript:longPoll()">...
Run Code Online (Sandbox Code Playgroud)
我将longPoll()一个if语句包装起来status > 0,因为我遇到了,当我离开页面时(通过浏览其他地方或重新加载它),最后一个不必要的彗星调用被发送.[在Firefox上,它甚至在进行页面重新加载时会导致严重的问题,由于某些原因我还没有完全理解.]
问题:这是status检查处理此问题的正确方法,还是有更好的解决方案?
我有一个异步队列工作程序在我的服务器上作为Tornado脚本运行 - 它托管了Tornado的PeriodicTask的子类,它使用来自Redis的事件.为了监视队列,我tornado.websocket.WebSocketHandler在URL上设置了一个子类,然后将客户端WebSocket JavaScript封装在一个jQuery插件中(这里是完整的代码).
我们的想法是,您可以在服务器上拥有多个队列,因此您可以使用jQuery模块来设置专门监视该队列的窗口小部件.目前,逻辑很简单 - 小部件仅表示在目标队列中排队了多少个任务.
这是有问题的初始化代码:
/* init: */ function (_options) {
options = $.extend(options, _options);
var self = this;
self.data('recently', [0,0,0,0,0,0,0,0,0]);
self.data('options', options);
self.data('sock', null);
var sock = null;
if ('endpoint' in options && options['endpoint']) {
sock = new WebSocket(options['endpoint']);
sock.onopen = function () {};
sock.onclose = function () {};
sock.onmessage = function (e) {
var d = $.parseJSON(e.data);
if (options.queuename in d) {
var qlen = d[options.queuename]
lastvalues = self.data('recently');
lastvalues.shift();
lastvalues.push(qlen); …Run Code Online (Sandbox Code Playgroud) 我正在开发一个连接到服务器的Web应用程序,我需要服务器在给定时间将一些信息提供给客户端.
因此,我开始阅读有关服务器发送事件(SSE)的信息,因为该网站是在HTML5上开发的,而SSE似乎非常符合我的要求.但是,当我读到SSE真正在做的事情是将客户端的请求发送到服务器而不是相反的方式时,我感到非常惊讶(昨天我认为我理解长轮询是一种推送仿真).因此,我开始阅读有关Web套接字的内容(但它标注了该标准仍然是草案)并且还看了一下Comet.但我认为我不能完全理解我的想法.
有人会突出显示适合我的问题的这些技术(也许还有其他一些技术),哪种情况更适合每一种?
非常感谢,我想我完全迷失在这个领域.
我正在开发一个应用程序,允许用户发布到房间/页面,就像一个论坛或这里(stackoverflow).我已经构建了整个应用程序,但是,我有一个最后的障碍:如何处理更新用户的帖子.
我已经对这个主题做了很多研究,我相信Long Polling是要走的路,至少在我获得大量流量之前(如果发生这种情况,我会弄清楚如何实现websockets).这是因为Long Polling将更容易实现,它得到更广泛的支持,并且考虑到我正在部署到heroku,很容易快速升级我的服务器资源.无论如何,我想知道在用户交互和服务器负载方面长轮询的最佳实践是什么.
我应该自动在页面上放置帖子,还是创建一个警报系统,例如stackoverflow上的那个?
任何和所有输入将不胜感激.无论如何你认为我的逻辑错了,请告诉我!
无法理解为什么我在WCF跟踪日志中收到很多警告:
TraceIdentifier:
http://msdn.microsoft.com/en-GB/library/System.ServiceModel.Activation.WebHostNoCBTSupport.aspx
描述:
此平台不支持或未启用扩展保护.如果您希望使用带有Windows身份验证的https的extendedProtection支持,请安装相应的补丁并启用它.
资源:
System.ServiceModel.Activation.MetabaseSettingsIis6/17653682
据我所知,在我手动强制IIS重启或回收AppPool之后,客户端服务重新连接到服务器,或者客户端最终开始获得404 not found服务器响应,顺便说一下,为什么它在IIS重启后开始获取404并不能清楚从中恢复1-10分钟甚至更长时间.
有关我正在使用的WCF配置的一些信息:
假设我们有一个与Web服务通信的iOS应用程序.某些请求被委托给另一个Web服务,因此在另一侧的操作正在进行时会立即返回HTTP 200状态代码:
|iOS app| |Main service| |Delegate service|
| request | |
|------------------->|_ delegate |_
| | |----------------->| |
| HTTP 200 | | accepted | |
|<-------------------|_|<-----------------| |
| | | |
| | | |
| status? | | |
|------------------->|_ | |
| | | | |
| pending | | | |
|<-------------------|_| | |
| | | |
| | finished | |
| |<-------------------|_|
| | |
| status? | |
|------------------->|_ |
| …Run Code Online (Sandbox Code Playgroud) Amazon SQS支持两种可用消息轮询模式:短轮询和长轮询.使用长轮询时,使用者指定等待可用消息的超时为1-20秒.
根据文件:
默认情况下,Amazon SQS使用短轮询,仅查询其服务器的子集(基于加权随机分布),以确定是否有任何消息可用于响应.
长轮询提供以下好处:
- 通过允许Amazon SQS在发送响应之前等待队列中的消息可用来消除空响应.除非连接超时,否则对
ReceiveMessage请求的响应至少包含一条可用消息,最多为ReceiveMessage操作中指定的最大消息数.- 通过查询所有 - 而不是亚马逊SQS服务器的子集来消除错误的空响应.
- 一旦可用,就立即返回消息.
上述特征使长期民意调查看起来相当不错.那么有一个使用短轮询更好的用例吗?
特别是对于高吞吐量队列,短轮询比长轮询快吗?
long-polling ×10
javascript ×4
ajax ×3
comet ×3
polling ×3
.net ×1
amazon-sqs ×1
heroku ×1
html5 ×1
ios ×1
jquery ×1
node.js ×1
performance ×1
server-side ×1
silverlight ×1
tornado ×1
wcf ×1
web-services ×1
websocket ×1