低代码到底是不是行业毒瘤?一线大厂怎么做的?戳此了解>>> 了解详情
写点什么

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

2007 年 11 月 26 日

有一些简单、基础性的工具是构建我们的软件基础设施的基础,当我发现那些能有效利用这些工具的解决方案的时候,对我来说总是件快事。与在现有复杂层次上再去创建另一个更多复杂层次不同,我们寻找使用软件架构栈中的核心构件来解决问题的方法。我认为像 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();<br></br>r.onreadystatechange=function() {<br></br> if (r.readyState==4) {<br></br> if (r.status==200) { // "OK status"<br></br> displayData(r.responseText);<br></br> }<br></br> else if (r.status==304) {<br></br> // "Not Modified": No change to display<br></br> }<br></br> else {<br></br> alertProblem(r);<br></br> }<br></br> }<br></br>}<br></br>r.open("GET",'http://myserver.example.com/latest_data/',true)<br></br>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

2007 年 11 月 26 日 22:491224

评论

发布
暂无评论
发现更多内容

Kafka生产者哪些重要的参数是我们需要注意的?

码农架构

Java kafka 程序员 消息中间件 架构·

函数式编程Stream接口真的有那么好用吗?

码农架构

Java 程序员 Java 8 架构·

商务部CECBC专委会-商务联络部长王聚师:中医国际化的数字创新密码

CECBC区块链专委会

数字

为什么联盟链系统没有“激励”?

CECBC区块链专委会

区块链

第十一周作业&总结

胡益

LoraWan的第一个网关与设备

LanLiang

物联网 IoT ChirpStack LoraWan

anyRTC新春大礼包

anyRTC开发者

音视频 WebRTC RTC

架构师week11 作业

Geek_xq

🎨 HTTP 协议的前世今生

飞天小牛肉

Java 程序员 面试 计算机网络 2月春节不断更

Kafka在哪些场景下会造成重复消费或消息丢失?

码农架构

Java kafka 程序员 消息中间件 架构·

用 JSX 实现 Carousel 轮播组件

三钻

前端 组件化 前端进阶 JSX

【得物技术】AB实验设计实现与分流算法

得物技术

算法 AB AB testing实战 实现 得物技术

重磅发布 | 2021年OpenAtom XuperChain开源技术路径

百度开发者中心

百度 #区块链#

第一次凡尔赛,字节跳动3面+腾讯6面一次过,谈谈我的大厂面经

Crud的程序员

Java 编程 架构 java面试

百度亮相全球量子信息处理顶会QIP2021 推动全球量子科技进步

爱极客侠

LeetCode题解:529. 扫雷游戏,BFS,JavaScript,详细注释

Lee Chen

算法 LeetCode 前端进阶训练营

Spring Boot 微服务性能下降九成!使用 Arthas 定位根因

Java架构师迁哥

堪称最全的JAVA开发手册(基础+框架+分布式微服务+调优)

Crud的程序员

Java 程序员 架构

微服务调用链日志追踪分析

Java王路飞

Java 程序员 架构 面试 微服务

【百度技术分享】San介绍以及在百度APP的实践

百度Geek说

Java JavaScript feed

即构发布 LCEP 产品「RoomKit」 ,实现房间内0代码接入

ZEGO即构

架构师week11总结

Geek_xq

SDS离全面EC(纠删码)还有多远?

XSKY融合存储

存储

日记 2021年2月5日(周五)

Changing Lin

个人感悟 2月春节不断更

Clubhouse是个啥?一夜爆火一码难求

架构精进之路

七日更 2月春节不断更 clubhouse

Kafka消费者提交消费位移时提交的是当前消费到的最新消息的 offset 还是 offset+1?

码农架构

Java kafka 程序员 架构 消息中间件

JDK1.8升级这么久!Stream流的规约操作有哪些?

码农架构

Java 架构 jdk 函数编程

通过配置开关 Spring Boot 中的 @Scheduled 定时任务

码狐

Java 定时任务 springboot

5年crud经验,三个月啃透888页Java王者级核心宝典,翻身阿里p7

周老师

Java 编程 程序员 架构 面试

“双循环”下的数字货币棋局

CECBC区块链专委会

数字货币

阿里新晋 CNCF TOC 委员张磊:“云原生”为什么对云计算生态充满吸引力?

阿里巴巴云原生

云计算 容器 微服务 云原生 cncf

2021 ThoughtWorks 技术雷达峰会

2021 ThoughtWorks 技术雷达峰会

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