如何优化基于Web的应用程序以防止由于后台多个异步请求导致的延迟?

lor*_*non 6 javascript ajax optimization ria

我正在设计基于瘦服务器客户端MVC架构的模块化RIA.目前,该应用程序仅完成了10%的范围,因此合并设计更改还为时不晚.

应用程序的设计方式使其最初以非常小的占用空间加载,并且根据用户执行的操作,异步提取大量数据.这些数据可能包括存储在我的服务器中的数据以及来自第三方Web服务的数据,包括社交网络和微博服务.

但是我担心的是,在后台运行的多个数据重ajax请求是否可能使浏览器失效?我最近在一些社交内容聚合服务中发现了一些严重的延迟问题,并且在分析客户端代码时,我很惊讶客户端的应用程序占用空间很小,在300KB以内.但是,当经常运行应用程序时,浏览器(包括Firefox和IE)都会挂起并花费几秒钟来恢复.在分析异步请求时,似乎应用程序同时从gmail,facebook和twitter获取用户内容并将它们推入DOM并占用了大量内存资源.

如果有人能指出一些指导方针/最佳做法来防止此类问题,那就太好了.编写一个自定义包装器脚本是可取的,该脚本以预先指定的重要性顺序依次加载后台内容,而不是并行加载它们,这最终可能导致多个回调并行执行.

任何建议都会非常感激.

reg*_*ero 2

一种解决方案,这并不是所有情况下的杀手级解决方案,但一种解决方案是将内容聚合委托在服务器端,而不是全部在最终浏览器中。

这可以通过ESIGates来完成。其中之一是Varnish-Esi,但它并没有涵盖整个ESI 规范这个(esigate.org)也是开源的,并且可能具有更好的覆盖范围(尚未测试)。ESI 系统意味着您的应用程序布局可以是具有不同缓存策略 (TTL) 和不同提供商的各种块的组合。ESI 服务器将占用您最初驱逐到最终浏览器的一部分流量,因此这将花费您更多的带宽,但至少您将比在其他浏览器使用的不同浏览器上获得更多的控制权。 HTTP 客户端。

至少它可以改进服务器上异步数据加载的缓存策略,这样就可以加快最终浏览器的响应时间(更好的响应时间,更少的并行工作)。

现在在浏览器方面,根据页面的优先级,您当然应该确定什么是最重要的内容,用户可以开始玩的内容,以及什么只是“装饰(嗯,这意味着您的服务作为一个良好的信息/噪音比,如果您的网站除了社交网络聚合之外什么都不提供,您就会遇到问题)。

我假设您的应用程序是一个小型静态应用程序,具有大量异步加载的数据,因此您使用了大量的 ajax,并且没有太多的页面更改。这意味着一旦加载内容,它将在页面中驻留很长时间。

因此,延迟链接社交网络和其他网络服务内容而不是大的并行负载应该不是问题。也许它不会在前 15 秒出现,但如果它在接下来的 15 分钟内停留在页面上,那么这可能不是问题(如果最重要的内容已经存在,用户可能甚至不会注意到装饰性内容)不可用)。这里有一个 IE6(有时还有 IE7)提示,SetTimeouts()在任何地方使用 js 命令强制重新绘制页面,您会发现可用内容显示得更快。

最后一个提示,如果您需要定期进行 ajax 检查以获取更新的内容。如果你真的每分钟检查 10 个内容,你总是会遇到并行加载问题和一个大活动,与初始加载中的问题相同,通常你可以使用 2 个东西来解决这个问题,一个是COMET系列长时间运行HTTP 连接(因此您可以推送数据和/或获得更快的响应,但前提是您的服务器针对此类 HTTP 流量进行了调整)。第二个是为下一次检查添加时间因素,这样第一次检查是在 1 分钟后,下一次检查是 2 分钟后,然后是 3 分钟、15 分钟、25 分钟等,最后可能每小时都会有一次新检查。当您检测到用户的某些活动(某些用户交互)时,您可以减少下一次检查延迟。这是因为您可以假设用户只有在真正对您的页面执行某些操作时才真正在寻找新数据。您将节省一些用户CPU,并且还将帮助您的服务器加载。