2012-03-23 169 views
0

我正在研究一个Web应用程序,并且我正在使用轮询方法来检查是否需要更新。这些轮询请求每隔1或2秒发生一次。如果不需要更新(在这种情况下返回一个空的响应)和大约10 KB(它是内容本身的大小),则响应的大小为240个字节。我的问题是,由于它每秒至少返回240 B,有没有办法通过将边界推得更多来优化这个响应?减少响应大小

当我检查响应的内容时,我看到50个字节对我来说很重要(会话ID和状态码)。但是,头文件中有一些信息,例如连接类型,超时和内容类型。对于这种类型的每个请求,这些设置都是相同的(即它总是要求内容类型为:“text/html; carset = utf-8”)。那么,我可以在客户端假设这些设置,并阻止服务器发送这些头信息吗?

我在服务器端使用django和jQuery发送ajax请求的方式。此外,任何类型的推送技术现在都不存在问题。

回答

1

这种问题的一个解决方案是“长轮询”。轮询客户端将发送请求,Web服务器将检查是否有更新。如果没有,网络服务器会休眠一两秒钟,然后再次循环检查,而不发送响应。只要此循环看到更新,它就会发送一个响应。对于客户端Web浏览器来说,它看起来像服务器拥塞并需要很长时间才能响应,但实际上相关数据正在被及时传输,并且“无数据”响应仅仅被跳过。

我建议在循环中添加一个超时 - 比如30或60秒 - 之后,网络服务器将像往常一样回复“无数据”。即使只有30秒的周期,也会将空载响应负载减少15-30倍。

警告:我已阅读过这种实现,但我没有尝试过。您需要测试与各种Web浏览器的兼容性,以确保这种相当不标准的方法不会在客户端造成问题。

+0

我检查了长轮询。这似乎是合理的。但是,当你一直忙着睡觉时,它不会导致服务器端的超载。我对服务器上的性能问题没有太多的了解。 – Hgeg 2012-03-24 09:30:53

+1

假设你使用time.sleep(2)这样的休眠机制,它的性能不会比普通轮询低。它实际上应该节省CPU时间 - 但它可能会在主机上消耗更多的内存,因为每个请求线程都在内存中的时间更长。这对你的应用程序是否有意义取决于你的具体情况以及你有多少用户。但是,它一定会节省带宽。 – 2012-03-26 17:29:42

2

它确实加起来,但没有你想象的那么多。如果每秒调查一整小时,则只能使用864K,比普通网页所需的缓冲区大一些。即使你做了一整天,你也在谈论大约20M。也许如果你是Twitter这样的人,你可能需要关注这一点,但是我怀疑你会得到任何接近它的流量,因为这实际上是有问题的。尽管如此,您当然也可以自定义请求的标头,但是如果对客户端产生的任何影响将成为测试的问题会发生什么。有些标题可能会被删除,但其他标题可能会让您感到意外,并且它在技术上也可能会因浏览器而异。