原文地址: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. 使用 Quickwit 的搜索流功能为 ClickHouse 添加全文搜索

    本指南将帮助您使用 Quickwit 的搜索流功能为知名的 OLAP 数据库 ClickHouse 添加全文搜索.Quickwit 暴露了一个 REST 端点,可以极快地(每秒最多 5000 万条)流 ...

  2. 【工具分享】红队重点资产指纹识别 -- P1finger -0.02(最新版本)

    工具介绍: P1finger 红队行动下的重点资产指纹识别工具.P1finger 是一个重点资产指纹识别的工具,旨在通过HTTP请求特征来识别目标系统.其主要特点包括: 语言和实现: 语言:使用Go语 ...

  3. Angular 学习笔记 (消毒 sanitizer)

    refer : https://www.intricatecloud.io/2019/10/using-angular-innerhtml-to-display-user-generated-cont ...

  4. CSS – Dimension min-content, max-content, fit-content

    前言 无意间在 practice 的时候看到视频使用, 以前没有听过. 它有点像 Figma 的 hug content, 据说 CSS 2.1 也是有类似的概念, 只是没有被正式纳入 CSS 里. ...

  5. mac M1,M2,M3芯片踩坑 nodejs ruby brew

    问题&解决方法 先说解决方法, 感兴趣的可以了解事情的经过, 也许我描述的问题不专业, 但确实解决了当下的问题, 欢迎留言讨论 这里主要是两个问题, 一个是启用rosetta模式失败, 一个是 ...

  6. [OI] 珂朵莉树

    对于一个序列,它有较多重复元素,并且题目需要维护区间修改,维护区间信息,维护整块值域信息的,那么就可以考虑珂朵莉树解决. 主要思想 珂朵莉树将全部相同的颜色块压缩为一组,如对于下述序列: 1 1 1 ...

  7. php获取支付宝用户信息

    php获取支付宝用户信息 一:创建应用 要在您的应用中使用支付宝开放产品的接口能力: 您需要先去蚂蚁金服开放平台(open.alipay.com),在开发者中心创建登记您的应用,此时您将获得应用唯一标 ...

  8. 优质技术文章分享 | 首届【MogDB数据库征文活动】进行中,期待您的参与

    2022年6月30日,MogDB 3.0版本正式发布,基于2.1版本进一步增强,集成了openGauss 3.0.0版本的新增特性,并融合了云和恩墨的创新特性研发,持续助力用户达成安稳易用的企业级数据 ...

  9. TX御加固脱壳

    示例APP某小说 其实脱这个有好几个方法,我使用了两个方法都可以脱掉. 首先使用Y佬的APK测试: 上传文件后经过等待提示任务成功,把给的ZIP包下载下来. 解压后得到两个文件,txt文件是脱壳后的a ...

  10. JDK线程池详解(全网最全-原理解析、源码详解)

    频繁创建新线程的缺点? 不受控风险 系统资源有限,每个人针对不同业务都可以手动创建线程,并且创建标准不一样(比如线程没有名字).当系统运行起来,所有线程都在疯狂抢占资源,毫无规则,不好管控. 另外,过 ...