5

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

13 回答 13

4

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

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

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

于 2009-06-22T15:03:03.520 回答
4

您应该缓存它并且仅每 30 秒更新一次缓存。

于 2009-06-22T15:04:12.860 回答
1

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

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

于 2009-06-22T15:03:28.917 回答
1

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

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

于 2009-06-22T15:05:07.540 回答
0

我不认为这会造成问题。

于 2009-06-22T15:03:18.620 回答
0

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

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

于 2009-06-22T15:05:13.110 回答
0

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

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

于 2009-06-22T15:05:25.433 回答
0

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

这就是 AJAX 的用途。

于 2009-06-22T15:06:11.670 回答
0

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

于 2009-06-22T15:08:06.333 回答
0

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

如果你真的很关心性能,我会给你2个建议:

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

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

于 2009-06-22T15:10:51.070 回答
0

是的,这根本不应该是一个问题。

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

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

于 2009-06-22T15:14:12.200 回答
0

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

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

于 2009-06-22T15:37:14.353 回答
0

我觉得你做的很棒。

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

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

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

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

于 2009-06-22T15:47:51.463 回答