InfoQ

InfoQ

新闻

我的书签

登录注册 以永久保存书签。

该内容已经被标记书签!

标记书签错误,请重试!

在REST/Ajax架构中减少服务器负载和网络流量

作者 Mark Figley 译者 戴垚 发布于 2007年11月26日

领域
架构 & 设计,
企业架构,
语言 & 开发
主题
架构 ,
SOA ,
REST ,
JavaScript
标签
AJAX

有一些简单、基础性的工具是构建我们的软件基础设施的基础,当我发现那些能有效利用这些工具的解决方案的时候,对我来说总是件快事。与在现有复杂层次上再去创建另一个更多复杂层次不同,我们寻找使用软件架构栈中的核心构件来解决问题的方法。我认为像RESTful和POJO编程模型这类架构风格之所以能够与开发者产生如此多共鸣的原因就在于那种发现意外之财的幸福时刻。这里有一篇发表在developerWorks上的一篇短文,它向我们展示了如何为Ajax/REST架构减少网络流量和服务器处理,但是本文的可贵之处在于,他们有效利用了HTTP 304状态码,而不是推荐使用一些更加复杂的解决方案。这篇文章一开始就为Ajax/REST结构面临的一些挑战设定了上下文:

HTTP的一个简单事实是:HTTP是一个无状态的协议,它既是HTTP的最大优点也是其主要缺点。每一个对于HTTP服务器资源的请求都是幂等的,也就是说在每次调用相同的请求应该返回相同的结果。幂等是REST的中心思想:不管在什么时候发送相同的请求——也许编码了客户信息——都应该返回同样的数据。……[但] 如何理解“同样的数据”并不想看起来那么容易。同样的URI总是返回一样的数据只是一个粗糙的理解。毕竟,即使一个静态页面的内容也会改变(比如修正了一些拼写错误)。幂等背后的含义仅指相关的改变不应该对GET请求本身产生直接的影响。于是像这样一个总是变化的资源是一个完全合理的方法:

http://myserver.example.com/latest_data/

这里的问题只不过是“最新数据(latest_data)”并不仅仅依赖于谁在什么时候以何种方式获取过。一个服务器可以完全是RESTful,并仍然反映“世界的现状”。

他们正在试图解决的问题有两个方面:减少网络流量和减少服务器对重复请求的处理。这当然不是一个新的问题。可以预料到他们解决服务器处理的方法:缓冲。RESTful架构的好处之一就是它可以被缓存。但这只解决了服务器处理的问题;即使数据没有任何改变,你还是不断的在网络上为每一个请求发送完整的数据集。而这正是HTTP 304状态码可以派上用场的地方:

事实上,“Not Modified”在HTTP协议中已经有合适的处理了,尽管这个正确的解决方案没有得到充分的使用。我们可以并需要做的是简单的返回一个HTTP 304状态码。然后由我们的Ajax代码来检查,如果发现了,就简单地根据服务器响应(缺乏)数据(译注:此处应指响应请求的状态码),不对客户应用状态进行更新。

他们还非常周到的提供了一些示例代码,包括在javascript里如何调用ajax方法并如何正确处理304状态码:

var r = new XMLHttpRequest();
r.onreadystatechange=function() {
if (r.readyState==4) {
if (r.status==200) { // "OK status"
displayData(r.responseText);
}
else if (r.status==304) {
// "Not Modified": No change to display
}
else {
alertProblem(r);
}
}
}
r.open("GET",'http://myserver.example.com/latest_data/',true)
r.send(null);
查看英文原文:Reducing Server Load and Network Traffic in REST/Ajax Architectures
译者简介:戴垚,2000年计算机硕士毕业后一直从事软件开发管理工作,目前在一家大型外企担任开发部门经理。关心软件技术和相关工具的动态,深信技术的使用应以创造价值为根本。目前致力于SOA的研究,希望能对业以复杂的企业环境有所帮助。参与InfoQ中文站内容建设,请邮件至china-editorial@infoq.com,加入InfoQ中文站用户讨论组,请点击ICUG,InfoQ China User Group
翻译的太不像中文了 发表人 Xing Hong 发表于
Re: 翻译的太不像中文了 发表人 小刀 凉粉 发表于
还不错 发表人 shinichi kudo 发表于
如果服务器没有提供缓存的话? 发表人 wu cao 发表于
Re: 如果服务器没有提供缓存的话? 发表人 Quon Rah 发表于
Re: 如果服务器没有提供缓存的话? 发表人 Xu Alex 发表于
  1. 返回顶部

    翻译的太不像中文了

    发表人 Xing Hong

    晦涩

  2. 返回顶部

    Re: 翻译的太不像中文了

    发表人 小刀 凉粉

    非常感谢Hong Xing同学的意见,我们会对该文进行进一步审校,对文字进行处理以后重新发布。

  3. 返回顶部

    还不错

    发表人 shinichi kudo

    可能是直译的过吧,不过中心思想表达的非常明确了,感谢译者的贡献!

  4. 返回顶部

    如果服务器没有提供缓存的话?

    发表人 wu cao

    如果服务器没有提供缓存的话?那是不是r.status就永远不可能是304了

  5. 返回顶部

    Re: 如果服务器没有提供缓存的话?

    发表人 Quon Rah

    这不是笑话么...缓存是提高性能的必备机制

  6. 返回顶部

    Re: 如果服务器没有提供缓存的话?

    发表人 Xu Alex

    304是给客户端看的。浏览器收到304状态,就用本地缓存来刷新页面。Ajax需要自己处理一下。文中已经给出了代码。

    服务端判断什么时候发304是需要好好设计的,跟访问策略和具体业务逻辑有关。

深度内容

大规模视频网站的计费与流量管理

本次分享将会就大规模视频网站的计费与流量管理这个话题,从操作层面细细进行讲解和分析,为系统工程师们揭示平日里我们没有关心的另一些内容。同时也希望本次分享能揭示行业中的一些“潜规则”,让互联网行业的流量与带宽管理更为开放与简洁。
本次演讲视频录制于QCon杭州2011

专访Jeffrey Richter:Windows 8是微软的重中之重

Jeffrey Richter以其多本Windows核心技术的经典著作而闻名,同时,他深入掌握微软的.NET等一系列核心技术,2012年1月,Jeffrey Richter在北京接受了InfoQ中文站的专访,谈到Windows 8和WinRT编程,并就异步编程、Windows编程中的可扩展性、性能和安全性方面给出自己的建议。

应用云平台的可用性——从新浪SAE看云平台设计

云计算平台的可用性,相比传统互联网服务而言,更加复杂和困难,也更具有挑战性。本文借助新浪SAE云平台为读者讲述了云平台可用性的定义、如何打造高可用的平台,以及对云计算的用户提出了建议。

JVM定制改进 @ 淘宝

淘宝高度重视Java平台的健康发展,组建了一个团队专注于Java平台的底层部分的性能、功能与稳定性改进;工作主要基于OpenJDK中的HotSpot VM开展,其中一些通用的功能随后也会逐渐反馈给OpenJDK社区。希望能与使用Java平台开发应用的大家交流经验。
本次演讲视频录制于QCon杭州2011

"伤得起"的云计算应用——对云端应用之架构的思考

2011年4月21日至22日是值得云计算从业者纪念的日子。Amazon的IaaS服务出现故障,导致许多商业网站的服务中断,影响非常严重。作为云计算用户,我们需要思考的是,如何保证即便在云服务不可用的情况,我们的应用架构仍然能够屹立不倒?本文正是站在云计算用户的角度试图探讨这一问题。

让交付的速度跟上思考的速度

12人的技术团队,4组刀片服务器,每月20亿的访问量,每日1次准时部署,99.9%的可用性。这可能吗?当然。想知道如何做的吗?百姓网将与您分享他们在DevOps实践过程中的经验和技巧。
本次演讲视频录制于QCon杭州2011

架构之路——穿行在产品和业务之间

篱笆作为一家起源于社区的电子商务公司,反映到技术层面就是同时要面对产品和业务,以及经营战略的变化调整。如何在产品和业务的夹缝之间完成技术架构的抽象与平衡,寻找更有效的价值定位,这当中有些经验教训和个人感悟愿与众人分享。
本次演讲视频录制于QCon杭州2011

特性注入:成功三部曲

本文将对特性注入以及相关方法做一个扫盲性的介绍。我们会解释这个框架的关键要素,并附上实例来证实它们。为了让文章保持相对较短,我们不会深入到某个工具或方法中,而是会给出一些参考资料,以便大家做进一步的研究。