异步Web是一场革命

传统的Web是同步的,发出一个请求就等待响应,如果等不到响应,客户端就会报错,这种同步方式是刚性的,刚则易断。

而异步方式,就是不一定一个请求一定即时有一个响应,这就类似兵分两路,花开两朵,各表一枝,当前软件热点就是并行多核计算,异步方式也是一种并行分布式计算方式。如图2:

Web异步有两种方式:
1.象图2的HTTP streaming,整个客户端使用一个http长连接,由客户端发起这个长连接,服务器通过这个长连接向客户端推push信息,但问题就是有时无法穿透防火墙。

2.HTTP long polling:客户端发出一个请求后不立即返回响应,响应在服务器端被block停住,等服务器端发生事件过来解锁这个block,这时响应再返回,返回后这个连接就断了,客户端再发起一个新的请求,开始下一个轮回。

long polling表面上好像是这台机器反应很慢,要停顿一会儿才有响应一样,这可以欺骗穿透防火墙。这是一种好的方式。

由于HTTP long polling的响应要滞后传输到客户端,客户端就要有专门代码来处理这个滞后响应,这时socket http连接也许已经关闭。客户端必须接受响应,并更新界面信息。

这个过程有一些细节要求处理:服务器滞后响应与服务器死机要进行区分,眼睛一睁,觉醒了;眼睛不睁,就死了,所以客户端要有一个heartbeating心跳机制。正常IE同时有两个网络连接,我们拿来一个给long polling机制作为心跳测试使用了,一个是处理正常的请求。

这些都要求客户端AJAX等RIA技术来配合。

Servlet 3.0 specification (JSR 315)是提供这种异步Web的一个基础条件,很多中间件服务器已经提供这种异步功能:
Tomcat 6 Comet Processor
Glassfish Grizzly Connector
Jetty Continuations
WebLogic Future Response Servlet
WebSphere Asynchronous Request Dispatcher

英文原文:What is the Asynchronous Web, and How is it Revolutionary?

本站相关讨论:
关于Jetty6.0服务器的Continuations

[该贴被admin于2009-08-15 08:36修改过]



这种服务器在可承载能力上一定会有问题,只能通过集群来解决。就算使用集群,性能也不会很好,本身HTTP的设计不是为了这种长连接准备的。