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

通过Javascript不断查询服务器-好主意?,javascript,jquery,design-patterns,auto-update,Javascript,Jquery,Design Patterns,Auto Update,我有一个小网站,大约有5-10名管理员。我将其设置为监视每个管理员正在做什么(添加项目、删除项目等)。我在我们的管理面板中有一个列表,显示了集体管理执行的前10项活动。今天,我决定每30秒进行一次自我更新 我的问题很简单:这样做有问题吗?我在每个请求中调用一小部分文本,请求可能一次只在3或4台计算机上运行(反映了并发管理员登录的数量) 在每个请求中生成以下内容(或类似内容-仅包含10行) <table> <tbody> <tr> <

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

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

在每个请求中生成以下内容(或类似内容-仅包含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>

杰坎普森

注销

28分27秒前

jdoe

登录

29分45秒前


30秒3-4个用户根本不算什么。即使是300个用户以这样的速度,也不会有多大影响

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


您也可以缓存这些内容,尤其是在生成页面的查询计算量很大的情况下,这样做是明智的,但当然要考虑到您希望在显示的最新内容中出现什么样的延迟。

我认为这不会造成问题。

不,应该没有任何问题。我每隔1分钟为我在公司内部网门户上编写的通知系统做同样的事情。老实说,任何web服务器都应该能够处理这个问题


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

您应该缓存此内容,并且仅每30秒更新一次缓存。

我认为根本没有问题。规模更大的站点(例如Betfair)在每个连接的客户端上每分钟使用数百个xhr调用。 显然,他们有更大的硬件基础设施,但浏览器处理得很好


我有一些站点使用较小的时间间隔,它们可以从sinlge Web服务器扩展到数百个并发用户。

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


尽管现在的用户数量很少,但会一直如此吗?

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


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

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


这就是AJAX的用途。

您看到预览了吗。。。?对于这样一小部分人来说,这不是一个问题,尤其是管理员会知道这一点。(这并不是说你给访问者的CPU或移动互联网连接增加了负担。)

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

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

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

    {“用户”:“jsampson”,“操作”:“注销”,“日期”:“20090622T170822”}


    • 是的,这一点都不是问题

      也就是说,如果您关心发送回的数据量,那么如果有新数据,您可以始终使调用发送回一个简单的标志,然后在这种情况下获取数据


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

      有几种不同的方法来模拟HTTP上的服务器推送。这种技术最近有了一个别致的名字:


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

      我认为您所做的非常好

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

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

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


      也要考虑用少于五分钟的时间专门标记任何东西。和颜色编码登录与注销。人们可以更容易地“扫描”,因为他们可以在不阅读所有文本的情况下挑出更改。

      因为您向所有管理员提供相同的列表,所以请将此缓存集中化,以便每个人都获取相同的列表。可能有DB触发器驱动内容更改
      <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>