原文地址:http://blog.springsource.org/2012/05/08/spring-mvc-3-2-preview-techniques-for-real-time-updates/

上一篇文章中,我介绍了新的Servlet 3,这是Spring MVC 3.2的新特性——异步支持——的运行环境。第二种使用异步处理的非常主要的原因是使浏览器接受信息的实时更新。例如网页聊天室、股票报价、状态更新、体育赛事直播等。虽然这些应用对于信息延迟的敏感度不同,但是它们的功能需求是类似的。

在标准的HTTP的“请求—响应”语义中,浏览器发出一个请求,服务器端响应一个请求,这就意味着直到浏览器发送请求,服务器才能够返回更新信息。要想实时获取服务器的更新信息,当前有很多种方法可以实现,例如传统轮询、长轮询、HTTP流和最近兴起的WebSocket协议。

传统轮询:

传统轮询采用浏览器不断发送请求,而服务器在收到请求后立即返回信息的方式进行。这种方式适合发送请求较少的情况下使用(请求发送过多服务器就崩溃了)。例如邮箱客户端可以每十分钟检查一次是否有新邮件到来。这种方式简单有效。但是如果需要信息实时反馈给客户端时,请求的发送就非常频繁,这种方式的实现效率就会大大降低。

长轮询:

长轮询中浏览器不断发送请求,而服务器只在有新信息更新的时候相应请求。在客户端看来,这种方式与传统轮询的方式完全一样。而在服务器端看来,这种方式与长请求方式非常类似,而且可以比传统轮询方式有更好的扩展性。

一个响应可以保持打开状态多久呢?浏览器设置的时间范围为5分钟,而一些网络中介——例如代理服务器——设置的时间范围可能更短。所以,即使没有信息更新,一个长轮询请求也要在时间范围内完成响应,以便浏览器发送下一个新请求。IETF的文档建议将时间范围设置为30至120秒之间,但通常实际的时间范围取决于你所使用的网络中介所设置的时间。

长轮询方式可以显著的降低实时信息更新的延时现象,特别是在新信息的更新间隔时间不确定(不规律)的情况下。但是,信息更新频率越高,这种方式就越像传统轮询一样效率低下。

HTTP流:

HTTP流采用浏览器不断发送请求,而服务器只在有信息可以返回时相应请求。但是与长轮询不同,HTTP流中服务器保持相应的打开状态,并且随着请求的到来不断向响应中添加更新信息。这种方式不需要进行轮询,但这也是与标准HTTP“请求—相应”的最大不同之处。例如客户端和服务器可以就相应流达成协议,以解决客户端如何识别相应就中不同的更新信息。但是,网络中介可以将相应流缓存,这样就阻止了这种方式的进行。这也是HTTP流不如长轮询方式使用广泛的原因。

WebSocket协议:

浏览器发送一个HTTP请求,这个请求将在服务器端被转换为WebSocket协议,服务器在确认有更新信息后再返回相应。这样一来,浏览器和服务器之间就可以建立一个双向连接,通过TCP协议按帧来发送数据。

WebSocket协议的设计就是用来避免轮询,并且非常适合在浏览器和服务器之间频繁交换信息的情况下使用。通过HTTP的初始化握手可以保证WebSocket请求通过防火墙。但是,由于主流浏览器很少支持WebSocket协议(Chrome支持的哦),因此基于WebSocket协议的应用开发具有非常大的挑战性,而且在经过网络中介时还存在更多问题

WebSocket以浏览器和服务器双向交互文本信息或二进制数据为中心。这导致它与传统的RESTful、以HTTP为基础的架构有很大的不同。事实上,还有很多其他协议需要建立在WebSocket基础之上,例如XMPP、AMQP、STOMP等,而哪个(些)协议将成为主流协议还需要拭目以待。

IETF组织已经将WebSocket协议制定为一个标准,而由W3C组织制定的WebSocket
API
标准也已经进入了最后一个阶段。很多Java工具——包括Servlet容器Jetty和Tomcat——都已经开始支持WebSocket。Servlet 3.1规范也很有可能将WebSocket包含在内,同时一个新的JSR规范也将定义WebSocket
API。

总结:

尽管挑选出一个最优秀的方式很诱人,但是——和其他问题一样——最简单最符合实际面对的问题的解决方式才是最好的解决方式。WebSocket协议给了我们很好的解决方案,而且也将适用于越来越多的情况下。浏览器的支持情况和网络问题先放在一边,双向信息的传输和RESTful的HTTP架构是两种完全不同的方式。在REST中你为资源建模并应用HTTP动词来获取资源。而在双向信息传输中,你将按规定路线发送、过滤、处理信息。记住这点不同非常的重要。

回到我上一篇文章中介绍的Spring MVC 3.2新特性中,我们可以使用长请求来实现实时更新功能,这种方式建立于标准的HTTP“请求—响应”架构中,就像常轮询和一些扩展自HTTP流的技术类似。Filip
Hanik
将这称为“客户端可以调用的服务器端AJAX”(the server version of client AJAX calls)。虽然Spring MVC 3.2 M1版本中没有包含WebSocket的支持,但在最终版本中仍然可能会包含。

在下一篇文章中,我将出示一个源码示例,并对Spring MVC 3.2的一些技术细节进行分析。

Spring MVC 3.2 技术预览(二):实时更新技术的更多相关文章

  1. 熊猫猪新系统测试之一:Windows 10 技术预览版

    话说本猫不用windows很多年了呀!不过看到微软最新的Windows10还是手痒了,想安装体验一把.于是第一时间下载,并做成usb引导安装镜像,在08年的老台式机上安装尝鲜鸟.下载ISO和安装方法这 ...

  2. 熊猫猪新系统測试之中的一个:Windows 10 技术预览版

    话说本猫不用windows非常多年了呀! 只是看到微软最新的Windows10还是手痒了.想安装体验一把. 于是第一时间下载,并做成usb引导安装镜像,在08年的老台式机上安装尝鲜鸟.下载ISO和安装 ...

  3. Windows 10 技术预览版9926 “未知源”引起系统休眠后自启的解决办法

    问题的由来: 自从安装上了最新发布的Windows 10 ,使用起来有诸多的改进:无论是重绘的图标还是通知消息中心的整合还是更智能的OneDrive客户端都使得工作起来非常愉悦. 不过笔者这两天频繁遇 ...

  4. 新的理念、 新的解决方案、 新的Azure Stack技术预览

    Jeffrey Snover 我们很高兴地宣布︰Azure Stack Technical Preview 2(TP2)已发布!我们朝着向您的数据中心提供Azure服务能力的目标又更近一步.自发布第一 ...

  5. Windows 10 技术预览

    windows10的技术预览版已经发布了很久了,正式版大约在今年的夏天就会发布,作为微软寄予厚望的下一代全平台操作系统,相比于windows8.1,windows10做了哪些改进,又添加了哪些新功能. ...

  6. 微软推出首个Microsoft Azure Stack技术预览版

    Mike Neil,微软公司企业云副总裁 怀着对于提高业务灵活性.加速创新的期待,很多企业正在向云平台迅速迁移.伴随着这样的趋势,我们也见证了微软智能云Azure业务在全球市场的快速增长--每个月近1 ...

  7. (转)ASP.NET MVC 第五个预览版和表单提交场景

    转自:http://ourlife.blog.51cto.com/708821/296171 上个星期四,ASP.NET MVC开发团队发布了ASP.NET MVC框架的“第五个预览版”.你可以在这里 ...

  8. 06、Windows 10 技术预览

    随着 Windows 10 发布的,未来 Windows 平台都是统一开发模型,可以只写一个 Appx 包,就可以同时部署到 Windows/ Windowsw Phone/ Tablet /xbox ...

  9. 微软发布Azure Stack第一个技术预览版

    为了提升商业灵敏度和加快创新步伐,各个企业都在迅速地转向云服务.在微软,我们已经见到微软智能云Azure的飞速发展和使用,每月我们都有近十万的新增订阅量.然而,我们也了解到还有很多企业在完全移到公有云 ...

  10. 【官方免费】Apple Silicon M1 + Parallels 16技术预览版 + Win 10 arm64

    期待了好久,终于能用pd运行win10了,其实也就想写个c++,mac上配置个c++编译器太麻烦了.. 步骤: 打开 https://my.parallels.com/desktop/beta,这里下 ...

随机推荐

  1. HttpWebResponse 四种accept-encoding解析(gzip, deflate, br,identity【转】

    var hwrs = (HttpWebResponse)hwr.GetResponse() if (hwrs.ContentEncoding.ToLower().Contains("gzip ...

  2. 待补 重要思考:求给无向图定向使得其变为DAG的方案数

    今天比赛考到了,不会,丢了 100 分. rk2,380 -> rk15,280 别问为什么 T4 没过,因为不会 T2. 方法一 \(O(3^n)\) 令 \(f_S\) 为子集 \(S\) ...

  3. Angular 18+ 高级教程 – 目录

    请按顺序阅读 关于本教程 初识 Angular Get Started Angular Compiler (AKA ngc) Quick View Dependency Injection 依赖注入  ...

  4. 前端基本功——面试必问系列(1):都2024了,还没吃透Promise?一文搞懂

    写在前面: 大家好,我是山里看瓜,该系列文章是为了帮助大家不管面试还是开发对前端的一些基本但是很重要的知识点认识更加深入和全面. 想写这个系列文章的初衷是:我发现前端的很多基本知识,使用起来很简单,定 ...

  5. Flutter 2.5 更新详解

    Flutter 2.5 正式版已于上周正式发布!这是一次重要的版本更新,也是 Flutter 发布历史上各项统计数据排名第二的版本.我们关闭了 4600 个 Issue,合并了 3932 个 PR,它 ...

  6. Word、Excel办公书的资源下载

    我是清华社编辑,下载资源没有版权问题,可供读者个人学习用,但不允许商用. 微信扫描,清华社网盘,可转自己邮箱下载.安全,无风险. <Word/Excel/PPT 2019商务办公从入门到精通&g ...

  7. foobar2000 v1.6.14 汉化版(2023.01.12更新)

    foobar2000 v1.6.14 汉化版 -----------------------[软件截图]---------------------- -----------------------[软 ...

  8. 【USB3.0协议学习】Topic4·USB3.0的Port Connect State Machine和设备枚举

    上一节的文章[USB3.0协议学习]Topic2·USB3.0的LTSSM分析中我们详细分析了USB3.0协议中的链路训练状态机(LTSSM)的各状态和跳转条件,覆盖了所有LTSSM状态.本文我们将从 ...

  9. 2024年4月中国数据库排行榜:OceanBase再度登顶,KingBase稳步上升进前五

    春风劲吹,迎来了2024年4月中国流行度排行榜.纵观本月榜单,各家数据库产品你追我赶,名次呈现微妙变动,它们正以不可忽视的力量,推动着中国乃至全球的数据管理革新.在这春意盎然的四月,让我们继续关注这些 ...

  10. v-if 为什么不能和 v-for 一起使用 ?

    当 Vue 处理指令时,v-for 比 v-if 具有更高的优先级,通过v-if 移动到容器元素,不会再重复遍历列表中的每个值.取而代之的是,我们只检查它一次,且不会在 v-if 为否的时候运算 v- ...