原文地址: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的一些技术细节进行分析。
分享到:
相关推荐
3.2.0.M1是Spring框架的一个里程碑版本,标志着在3.2系列中的第一个预览版,为开发者提供了新的功能和改进。在这个版本中,Spring团队致力于提升性能,增强可维护性,并引入了对Java 7和Servlet 3.0规范的支持。 ...
#### 二、使用 Spring Data Repositories Spring Data Repositories 提供了一个高度抽象化的数据访问层,旨在减少实现数据访问层所需的标准代码量。通过使用 Spring Data Repositories,开发者可以更专注于业务逻辑...
总之,VideoShare通过集成Flex3、BlazeDS、Spring2.5、Hibernate3.2、MySQL5.0、FFmpeg、MPlayer和Red5等一系列先进技术,构建了一个集视频分享、互动交流、社交娱乐于一体的综合性平台,不仅满足了用户对高质量视频...
- 实现信息的实时更新与分享。 #### 2.3 系统优势 - **高性能**: 系统基于Java技术栈构建,具备良好的扩展性和稳定性。 - **易用性**: 用户界面友好,便于用户快速上手。 - **安全性**: 采用多种安全措施保护数据的...
#### 二、技术栈介绍 ##### 2.1 Java语言 Java是一种广泛使用的面向对象编程语言,具有跨平台性、安全性高、可移植性强等特点。在本项目中,Java主要负责后端业务逻辑处理以及与数据库之间的交互操作。 ##### 2.2...
#### 二、关键技术介绍 ##### 2.1 SSM框架 SSM框架是由Spring框架、SpringMVC框架以及MyBatis框架组合而成的一种轻量级Java EE企业级应用开发框架。其中: - **Spring框架**:负责整个应用的基础架构,提供了依赖...
##### 3.2 关键技术介绍 - **SpringBoot框架**:SpringBoot是Spring家族中的一个新成员,它的目标是简化Spring应用的初始搭建以及开发过程。该框架提供了各种默认配置来简化项目配置,支持独立运行的应用程序和...
2. **SpringMVC**:SpringMVC是Spring框架的一部分,专注于实现MVC架构。它使得开发者可以更轻松地处理HTTP请求,并将它们映射到具体的业务逻辑上。 3. **MyBatis**:MyBatis是一个优秀的持久层框架,它支持自定义...
2.2.1 控制器和模型:Thymeleaf与Spring MVC的集成示例,其中如何设置控制器来处理HTTP请求,并提供数据模型。 2.2.2 视图展示:如何设计HTML视图模板来展示模型中的数据。 3. 表达式和操作 3.1 常规表达式使用 ...
- **软件架构合理,开发方便**:采用了J2EE平台的软件架构,整合了“Ajax+Structs+Spring+Hibernate”技术栈,利用XML作为“数据总线”,简化了数据访问过程,提高了开发效率。 - **层次清楚,符合标准**:遵循...
由于J2EE的开源的框架中提供了MVC模式实现框架Struts、对象关系模型中的Hibernate 的框架及拥有事务管理和依赖注入的Spring。利用现存框架可以更快开发系统。所以选择Java技术作为blog 的开发工具。 为了增加系统的...
SpringMVC是Spring框架的一部分,是一个轻量级的模型-视图-控制器(MVC)架构,用于开发Web应用程序。在BBS论坛中,SpringMVC的角色如下: - **模型(Model)**:负责处理业务逻辑,如用户登录验证、帖子的创建和...
SpringBoot是Spring生态系统的一部分,它简化了Spring应用程序的初始设置和配置。SpringBoot的主要优势在于其“开箱即用”的特性,通过内置的Tomcat服务器和自动配置,可以快速搭建Web应用。在博客系统中,...
前端界面采用HTML、CSS等技术实现,后端则使用Java及其框架(如Spring MVC)进行逻辑处理,数据库采用Access97或更高级别的数据库管理系统。 #### 4. 数据库设计 ##### 4.1 数据库需求分析 根据系统功能需求,...