【问题标题】:Constantly Querying Server via Javascript - Good Idea?不断通过 Javascript 查询服务器 - 好主意?
【发布时间】:2009-06-22 15:00:47
【问题描述】:

我有一个大约有 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>

【问题讨论】:

    标签: javascript jquery design-patterns auto-update


    【解决方案1】:

    每 30 秒 3-4 个用户根本不算多。即使是 300 个用户,以这样的速度也不会太多。

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

    也可以缓存它,这将是可取的特别是如果生成页面的查询计算量很大,但当然要考虑什么样的您希望在显示的最新内容中出现延迟。

    【讨论】:

      【解决方案2】:

      你应该缓存这个并且每 30 秒更新一次缓存。

      【讨论】:

      • 由于您为所有管理员提供相同的列表,因此请将此缓存集中化,以便每个人都提取相同的列表。也许有数据库触发器驱动内容更改
      【解决方案3】:

      不,应该没有任何问题。我每隔 1 分钟对我在公司的 Intranet 门户上编写的通知系统执行相同的操作。老实说,任何网络服务器都应该能够处理这个问题。

      这确实不比他们差(事实上,明显好得多),例如,每 30 秒刷新一次浏览器......考虑到数据传输量要小得多,它可能会比他们好 10-20 倍刷新它...或者,大约每 5-10 分钟刷新一次的带宽相同。 :-)

      【讨论】:

        【解决方案4】:

        在我看来完全没有问题。运行规模更大的站点(例如 Betfair)每个连接的客户端每分钟使用数百个 xhr 调用。 显然他们有更大的硬件基础设施,但浏览器可以应付得很好。

        我的网站使用的时间间隔更小,并且它们可以扩展到数百个从单一网络服务器运行的并发用户。

        【讨论】:

          【解决方案5】:

          我认为这不会造成问题。

          【讨论】:

            【解决方案6】:

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

            虽然现在用户少了,但会一直这样吗?

            【讨论】:

              【解决方案7】:

              正如 altCognito 指出的那样——由此产生的网络流量不太可能成为问题。

              我唯一要检查的是为此所需的数据库负载是否会成为问题。 IE。如果这是由需要一些时间运行的查询提供的,则会导致问题。如果是这种情况,我建议向数据添加一些缓存,或者在内存而不是数据库中维护此数据(仅在启动时从数据库加载,并将内容添加到此服务器内存列表中它们发生了)。

              【讨论】:

                【解决方案8】:

                与替代方案权衡。如果每个用户每 30 秒刷新一次页面,加载整个页面,那么服务器端的处理量和产生的流量将远远大于仅刷新“有趣的部分”。

                这就是 AJAX 的用途。

                【讨论】:

                  【解决方案9】:

                  您看到Google Wave 预览了吗...?对于这么小的数量,这不是问题,尤其是管理员会知道这一点。 (这不像是你给某些访问者的 CPU 或移动互联网连接带来了一些负担。)

                  【讨论】:

                    【解决方案10】:

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

                    如果你真的很在意性能,我给你2条建议:

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

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

                    【讨论】:

                      【解决方案11】:

                      是的,这应该不是问题。

                      话虽如此,如果您担心发回的数据量,您总是可以让调用在有新数据时发回一个简单的标志,然后在出现这种情况时去获取数据。

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

                      【讨论】:

                        【解决方案12】:

                        有几种不同的方法可以模拟通过 HTTP 的服务器推送。这种技术最近有了一个花哨的名字:Comet

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

                        【讨论】:

                          【解决方案13】:

                          我觉得你做的很棒。

                          如果我在做这个项目,我会从你所拥有的开始,然后添加一个 setTimeout() 事件来增加每秒显示的分钟/秒。

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

                          每 30 秒更新一次的危险在于,有些人每次将注意力转向“最新”时都会条件反射地点击刷新。

                          还可以考虑特别标记时间少于五分钟的任何内容。登录与注销的颜色编码。人们可以更轻松地“扫描”,因为他们无需阅读所有文本即可挑选出更改。

                          【讨论】:

                          • 我实际上刚刚完成了各种不同事件的颜色编码 :) 感谢您的输入!
                          猜你喜欢
                          • 1970-01-01
                          • 1970-01-01
                          • 1970-01-01
                          • 2016-02-24
                          • 1970-01-01
                          • 1970-01-01
                          • 1970-01-01
                          • 1970-01-01
                          • 1970-01-01
                          相关资源
                          最近更新 更多