代码之家  ›  专栏  ›  技术社区  ›  Sampson

通过javascript不断地查询服务器-好主意?

  •  5
  • Sampson  · 技术社区  · 15 年前

    我有一个小网站,大约有5-10个管理员。我设置它来监视每个管理员正在做什么(添加项目、删除项目等)。我在我们的管理小组中有一个列表,显示了前10个由集体管理部门执行的活动。今天,我决定每30秒进行一次自我更新。

    我的问题很简单:这样做有什么问题吗?我在每个请求中调用一小段文本,该请求可能一次只在3或4台计算机上运行(反映登录的并发管理员的数量)。

      $(document).ready(function(){
        setInterval("activity()", 30000);
      });
    
      function activity() {
        $("#recent_activity").load("../home/login #recent_activity .data");
      }
    

    对每个请求生成以下内容(或类似内容-仅10行)。

    <table>
      <tbody>
        <tr>
          <td><p>jsampson</p></td>
          <td><p>logged out</p></td>
          <td><p>28 minutes 27 seconds ago</p></td>
        </tr>
        <tr>
          <td><p>jdoe</p></td>
          <td><p>logged in</p></td>
          <td><p>29 minutes 45 seconds ago</p></td>
        </tr>
      </tbody>
    </table>
    
    13 回复  |  直到 15 年前
        1
  •  4
  •   Community Reversed Engineer    7 年前

    每30秒3-4个用户一次也不算多。即使是300个这样的用户也不会太多。

    您可能需要检查以下问题:

    可以 把这个也存起来,这是明智的 尤其是当生成页面的查询计算量很大时 但是,当然要考虑到您希望在最近显示的内容中出现什么样的延迟。

        2
  •  4
  •   Josh    15 年前

    您应该缓存这个,并且只每隔30秒更新一次缓存。

        3
  •  1
  •   KyleFarris    15 年前

    不,不应该有任何问题。对于我在公司内部网门户上写的通知系统,我每隔1分钟就做同样的事情。任何Web服务器都应该能够诚实地处理这个问题。

    这并没有比他们更糟(事实上,明显更好),比如说,每30秒刷新一次浏览器……考虑到数据传输的规模要小得多,这可能比刷新数据要好10-20倍…或者,大约每隔5-10分钟刷新一次相同的带宽。:-)

        4
  •  1
  •   redsquare    15 年前

    我认为完全没有问题。规模更大的站点(例如Betfair)每分钟对每个连接的客户机使用数百个XHR调用。 显然,他们有更大的硬件基础设施,但浏览器可以应付。

    我的网站使用的间隔较小,可以扩展到几百个从Sinlge Web服务器运行的并发用户。

        5
  •  0
  •   Galwegian    15 年前

    我认为这不会造成问题。

        6
  •  0
  •   Chad Ruppert    15 年前

    我想说,这主要取决于查询的成本。

    虽然现在的用户数量很低,但会一直如此吗?

        7
  •  0
  •   Jonathan Rupp    15 年前

    正如Altcongnito指出的那样——来自这一点的网络流量不太可能是一个问题。

    我要检查的唯一一件事是,是否需要为此加载数据库是一个问题。也就是说,如果这是由运行一个需要一些时间的查询提供的,那么它将导致问题。如果是这种情况,我建议在数据中添加一些缓存,或者在内存中而不是数据库中维护此数据(仅在启动时从数据库加载,并在服务器内存列表中添加这些内容)。

        8
  •  0
  •   Matt Kellogg    15 年前

    将其与备选方案进行权衡。如果每个用户每30秒刷新一次页面,加载整个页面,那么服务器端处理和生成的流量将远远大于仅刷新“感兴趣的部分”。

    这就是Ajax的用途。

        9
  •  0
  •   Arjan    15 年前

    你看到了吗? Google Wave 预览。。。?对于这么小的数字,这不是一个问题,特别是管理员将知道这一点。(这不像是给访问者的CPU或移动互联网连接增加了负担。)

        10
  •  0
  •   Vincent Robert    15 年前

    很多用户不会关闭您的服务器。

    如果您真的关心性能,我会给您两个建议:

    • 使用JSON向客户机发送数据,它将比格式化的HTML轻。
    • 对历史数据使用固定日期并计算客户机上的相对时间,它将允许您缓存历史数据。

      {"user":"jsampson","action":"logged out","date":"20090622T170822"}

        11
  •  0
  •   Branden Hall    15 年前

    是的,这一点也不成问题。

    这就是说,如果您关心发送回的数据量,那么您可以始终让呼叫在有新数据时发送回一个简单的标志,如果是这样的话,您可以去获取数据。

    但是,有那么多的用户,你不应该有任何问题。我经常使用一个自定义的基于ror的消息板,它使用类似的技术来查看在您阅读线程时是否更新了线程,并且它有100多个用户同时点击线程而没有任何问题。

        12
  •  0
  •   Christoph    15 年前

    有几种不同的方法来模拟服务器推送HTTP。这种技术最近得到了一个奇特的名字: Comet .

    如果服务器配置允许无限期地运行脚本,则可以使用iframe来实现面板并使用分块传输(例如,通过php flush() )创建持久的HTTP连接。如果连续消息之间的时间间隔很短,这样的解决方案应该具有最小的开销。对于长时间间隔,最好使用客户端轮询,因为不需要维护TCP连接。

        13
  •  0
  •   Nosredna    15 年前

    我觉得你做的很好。

    如果我在做这个项目,我将从您拥有的东西开始,并添加一个setTimeout()事件来增加每秒显示的分钟数/秒数。

    用户会感觉到显示是实时的,他们可能永远不会点击页面刷新。

    只有每30秒更新一次的危险是,有些人会在每次将注意力转向“最新”时,自动按刷新键。

    还可以考虑特别标记时间少于5分钟的任何内容。和颜色编码登录与注销。人们更容易“扫描”,因为他们可以在不阅读所有文本的情况下选择更改。