我正在设计一个基于瘦服务器客户端 MVC 架构的模块化 RIA。目前,该应用程序仅完成了 10%,因此合并设计更改还为时不晚。
该应用程序的设计方式使其最初加载时占用空间非常小,并且根据用户执行的操作异步获取大量数据。这些数据可能包括存储在我的服务器中的数据以及来自第三方网络服务(包括社交网络和微博服务)的数据。
但是我担心的是,是否有可能在后台运行的多个数据量大的 ajax 请求会使浏览器停止运行?我最近在一些社交内容聚合服务中观察到一些严重的延迟问题,在分析客户端代码后,我惊讶地发现客户端的应用程序占用空间非常小,在 300KB 以内。但是,当运行该应用程序时,浏览器(Firefox 和 IE)经常挂起并需要几秒钟才能恢复。在分析异步请求时,应用程序似乎同时从 gmail、facebook 和 twitter 获取用户内容并将它们推送到 DOM 中,并且占用了过多的内存资源。
如果有人能指出一些指导方针/最佳实践来防止此类问题,那就太好了。是否建议编写一个自定义包装脚本,以预先指定的重要性顺序在后台依次加载内容,而不是并行加载所有内容,这最终可能会导致多个回调并行执行。
任何建议将不胜感激。
最佳答案
一个解决方案,嗯,这不是适用于所有情况的 killer 级解决方案,但一个解决方案是在服务器端而不是所有在最终浏览器中委托(delegate)内容聚合。
这可以通过 ESIGates 来完成。其中之一是 Varnish-Esi , 但它并未涵盖整个 ESI specification . This one (esigate.org)也是开源的,可能覆盖面更广(尚未测试)。 ESI 系统意味着您的应用程序布局可以是具有不同缓存策略 (TTL) 和不同提供程序的各种 block 的组合。 ESI 服务器将占用您最初传送到最终浏览器的一部分流量,因此这会花费您更多的带宽,但至少您会获得更多的控制权 在这个软件上比在 HTTP 客户端使用的不同浏览器上。
至少它可以改进服务器上异步数据加载的缓存策略,这样它可以加快最终浏览器的响应时间(更好的响应时间,更少的并行工作)。
现在在浏览器方面,就页面上的优先级而言,您当然应该确定什么是最重要的内容,用户可以开始玩的内容,什么只是“装饰”(好吧,这意味着您的服务具有良好的信息/噪声比,如果您的网站除了社交网络聚合之外什么都没有提供,您就会遇到问题)。
我假设您的应用程序是一个带有大量异步加载数据的小型静态应用程序,因此您使用了大量的 ajax 而不是太多的页面更改。这意味着一旦加载了内容,它将在页面中驻留很长时间。
因此,让社交网络和其他网络服务内容延迟和链接而不是大的并行负载应该不是问题。也许它不会在前 15 秒出现,但如果它在接下来的 15 分钟内停留在页面上,那么这可能不是问题(如果最重要的内容已经存在,用户可能甚至不会注意到装饰性内容不可用)。一个 IE6(有时是 IE7)提示,在任何地方使用 SetTimeouts() js 命令强制重绘页面,您会发现可用内容显示得更快。
最后一个提示,如果您需要对更新的内容进行一些定期的 ajax 检查。如果你真的每分钟对 10 个内容进行这些检查,你将总是遇到并行加载问题和一个大事件,与初始加载中的问题相同,通常你可以使用 2 个东西来解决这个问题,一个是 COMET 家族长期运行的 HTTP 连接(因此您可以改为推送数据和/或获得更快的响应,但前提是您的服务器针对此类 HTTP 流量进行了调整)。第二个是为下一次检查添加一个时间因素,这样第一次检查是在 1 分钟后,下一次是 2 分钟,然后是 3、15、25 等,最后你有一个也许每小时才检查一次。当您检测到来自用户的某些事件(某些用户交互)时,您可以减少下一次检查延迟。这是因为您可以假设用户只有在真正对您的页面执行某些操作时才真正在寻找新数据。您将节省一些用户 CPU,还可以帮助您的服务器加载。
关于javascript - 如何针对后台多个异步请求导致的延迟优化基于 Web 的应用程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6464233/
我正在学习如何使用Nokogiri,根据这段代码我遇到了一些问题:require'rubygems'require'mechanize'post_agent=WWW::Mechanize.newpost_page=post_agent.get('http://www.vbulletin.org/forum/showthread.php?t=230708')puts"\nabsolutepathwithtbodygivesnil"putspost_page.parser.xpath('/html/body/div/div/div/div/div/table/tbody/tr/td/div
总的来说,我对ruby还比较陌生,我正在为我正在创建的对象编写一些rspec测试用例。许多测试用例都非常基础,我只是想确保正确填充和返回值。我想知道是否有办法使用循环结构来执行此操作。不必为我要测试的每个方法都设置一个assertEquals。例如:describeitem,"TestingtheItem"doit"willhaveanullvaluetostart"doitem=Item.new#HereIcoulddotheitem.name.shouldbe_nil#thenIcoulddoitem.category.shouldbe_nilendend但我想要一些方法来使用
关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭4年前。Improvethisquestion我想在固定时间创建一系列低音和高音调的哔哔声。例如:在150毫秒时发出高音调的蜂鸣声在151毫秒时发出低音调的蜂鸣声200毫秒时发出低音调的蜂鸣声250毫秒的高音调蜂鸣声有没有办法在Ruby或Python中做到这一点?我真的不在乎输出编码是什么(.wav、.mp3、.ogg等等),但我确实想创建一个输出文件。
Rails2.3可以选择随时使用RouteSet#add_configuration_file添加更多路由。是否可以在Rails3项目中做同样的事情? 最佳答案 在config/application.rb中:config.paths.config.routes在Rails3.2(也可能是Rails3.1)中,使用:config.paths["config/routes"] 关于ruby-on-rails-Rails3中的多个路由文件,我们在StackOverflow上找到一个类似的问题
给定这段代码defcreate@upgrades=User.update_all(["role=?","upgraded"],:id=>params[:upgrade])redirect_toadmin_upgrades_path,:notice=>"Successfullyupgradeduser."end我如何在该操作中实际验证它们是否已保存或未重定向到适当的页面和消息? 最佳答案 在Rails3中,update_all不返回任何有意义的信息,除了已更新的记录数(这可能取决于您的DBMS是否返回该信息)。http://ar.ru
我在我的项目目录中完成了compasscreate.和compassinitrails。几个问题:我已将我的.sass文件放在public/stylesheets中。这是放置它们的正确位置吗?当我运行compasswatch时,它不会自动编译这些.sass文件。我必须手动指定文件:compasswatchpublic/stylesheets/myfile.sass等。如何让它自动运行?文件ie.css、print.css和screen.css已放在stylesheets/compiled。如何在编译后不让它们重新出现的情况下删除它们?我自己编译的.sass文件编译成compiled/t
我有多个ActiveRecord子类Item的实例数组,我需要根据最早的事件循环打印。在这种情况下,我需要打印付款和维护日期,如下所示:ItemAmaintenancerequiredin5daysItemBpaymentrequiredin6daysItemApaymentrequiredin7daysItemBmaintenancerequiredin8days我目前有两个查询,用于查找maintenance和payment项目(非排他性查询),并输出如下内容:paymentrequiredin...maintenancerequiredin...有什么方法可以改善上述(丑陋的)代
我正在寻找执行以下操作的正确语法(在Perl、Shell或Ruby中):#variabletoaccessthedatalinesappendedasafileEND_OF_SCRIPT_MARKERrawdatastartshereanditcontinues. 最佳答案 Perl用__DATA__做这个:#!/usr/bin/perlusestrict;usewarnings;while(){print;}__DATA__Texttoprintgoeshere 关于ruby-如何将脚
Rackup通过Rack的默认处理程序成功运行任何Rack应用程序。例如:classRackAppdefcall(environment)['200',{'Content-Type'=>'text/html'},["Helloworld"]]endendrunRackApp.new但是当最后一行更改为使用Rack的内置CGI处理程序时,rackup给出“NoMethodErrorat/undefinedmethod`call'fornil:NilClass”:Rack::Handler::CGI.runRackApp.newRack的其他内置处理程序也提出了同样的反对意见。例如Rack
我需要从一个View访问多个模型。以前,我的links_controller仅用于提供以不同方式排序的链接资源。现在我想包括一个部分(我假设)显示按分数排序的顶级用户(@users=User.all.sort_by(&:score))我知道我可以将此代码插入每个链接操作并从View访问它,但这似乎不是“ruby方式”,我将需要在不久的将来访问更多模型。这可能会变得很脏,是否有针对这种情况的任何技术?注意事项:我认为我的应用程序正朝着单一格式和动态页面内容的方向发展,本质上是一个典型的网络应用程序。我知道before_filter但考虑到我希望应用程序进入的方向,这似乎很麻烦。最终从任何