【问题标题】:Going from setTimeout AJAX call to Long Polling with timeout从 setTimeout AJAX 调用到超时的长轮询
【发布时间】:2012-01-23 17:49:30
【问题描述】:

我创建了一个网站,它使用timeOut 每 15 秒自动刷新一次DIV。 这非常有效,但实际上更新 DIV 可能需要 5 分钟,这意味着脚本将在更改发生之前执行 20 次 调用。很好地浪费了昂贵的带宽和服务器性能:)

我已经阅读了很多关于做 Long Polling 的文章,并且一直在尝试。

我的 AJAX 调用是:

intval = window.setTimeout(function() {
  $.ajax({
    type: 'GET',
    cache: false,
    url: 'url',
    beforeSend: function() { $('#timerimg').attr('src', 'img/icons/loading.gif'); },
    success: function(data) { $('#ajaxcontent').html(data); },
    complete: function() { $('#timerimg').attr('src', 'img/icons/stop.gif'); }
  });
}, 15000);

这个函数被放置在一直刷新的页面中,使得timeout-function不断重复。

现在我已经尝试关注http://techoctave.com/c7/posts/60-simple-long-polling-example-with-javascript-and-jquery 来创建一个简单的长轮询函数

(function poll() { 
  $.ajax({ 
    type: 'GET',
    cache: false,
    url: 'url',
    success: function(data) { $('#ajaxcontent').html(data); },
    complete: poll,
    timeout: 30000
  });
})();

如果我将 url 设置为 hi.txt 并使其写入 Hello World! 那么它会不断完成并进行新的投票。这显然意味着大量同时进行的民意调查。

我该如何纠正这个问题?

与:

自动刷新DIV 是一个大图表,其中包含来自巨大SQL-Server 查询的计算。所以也许它应该只检查 SQL 查询后.getRows()(与原始相比)是否有最轻微的变化?

我在 jQuery 和 ASP-Classic 中做所有事情。

【问题讨论】:

    标签: sql-server-2008 jquery asp-classic long-polling


    【解决方案1】:

    长轮询不是客户端唯一的解决方案。长轮询要求服务器保持呼叫直到发生变化。这意味着您将为每个登录的客户端使用一个并发连接。这可能是一些限制并发的服务提供商的问题,因此请在收到 503 之前检查您的 ISP 政策。

    此外,您在这里解决的问题不止一个。服务器应该跟踪最后一个请求是否需要更新,或者只是将缓存的响应发回给你。如果您使用长轮询,则服务器将保持您的连接,直到它发生变化。

    之前您使用的是间隔轮询。我建议继续该路由(使用服务器端缓存),而不是将一半的 IE 带宽(最大 2 个并发)用于不经常更新。如果情况没有改变,只需让服务器对您的查询做出“错误”响应即可。

    【讨论】:

    • 这是我自己的机架服务器放置在一个非常大的主干互联网连接上,所以我不相信并发连接限制会有任何问题。目前的问题是数据库在更新时屏幕不会立即更新。。我在网上看了几个博客:在调用的.asp文件中进行SQL查询时,它会先从数据库中获取原始数据,然后然后一直循环,一次又一次地获取相同的数据,直到数据发生变化,然后将新数据发送回浏览器......但这不会产生巨大的带宽吗?!
    • 关于数据库后端,每当数据更新时,都应该有一个时间戳,或者要求您的 DBA 提供它。使用该时间戳,您可以对照它检查您的最后一个时间戳。如果它大于您的上次民意调查,则拉一次较大的查询。每次你拉,用新的时间更新你的民意调查。此外,您的长民意调查不应该对数据库造成影响。告诉它在上面睡一秒钟,或者任何你的用例用于响应。
    • 所以最好的办法是在数据库中的每一行添加一个“最后修改”的时间戳..然后选择前1个时间戳降序保留请求的时间戳..如果有的话当前拉取更大,然后从数据库中选择所有内容,进行数学运算并推送给用户..这仍然是每 2 秒从数据库中提取一次..但那是内部流量,这不是金钱问题.. 所以这可能是一个很好的解决方案?
    • 从外面看,我无法回答这个问题。如果没有索引,对时间戳运行查询会很慢,请考虑设置更新触发器以在数据更改时更新内存表上的单个值。查看内存中的一个值会减轻您的工作量,然后将一个值放在更大表中的每一行上。您需要每个项目时间戳的唯一原因是您只提取特定行。
    • 啊,我明白了。然后我会调查触发事件 :) 谢谢你的帮助。
    猜你喜欢
    • 2011-02-06
    • 2019-05-28
    • 1970-01-01
    • 2012-02-24
    • 1970-01-01
    • 1970-01-01
    • 2011-04-20
    • 2021-10-13
    • 2012-08-16
    相关资源
    最近更新 更多