基于tomcat响应处理模型实现的高并发web服务器
在上一篇博客中,一个简单的AIOweb处理例子,可以看到AIO异步处理,依赖操作系统完成IO操作的Proactor处理模型确实很强大,可以是实现高并发,高响应服务器的不错选择,但是在tomcat中的connector的处理模型还依旧是基于NIO的处理,当然,我认为这可能会在以后的版本进行改进,但另一方面,我更认为AIO的负载控制方面的处理可能是比较难的,因为AIO api并没有提供我们对分配线程组的处理,而只是提供一个线程组,交给操作系统去解决io处理上的问题,所以,这可能会给需要复杂处理的负载均衡带来一定的控制难度
对于tomcat的connector处理,我推荐看一下这篇博客,分析的比较到位http://liudeh-009.iteye.com/blog/1561638
tomcat的处理模型就是这样的,通过acceptor去accept过来的channel,再将channel注册到pollers中的selector,去select以及后面进行业务IO处理,接下来就是servlet引擎的工作 ,对channel的request进行响应。
好吧,接下来介绍一下我的实现吧,我的例子中是采用静态页面作为响应,如果有哪位朋友知道如果加入servlet,以及像tomcat一样servlet引擎的东西,请指教
类的结构图,这里就不贴代码了,有兴趣的朋友,可以到http://download.csdn.net/detail/chenxuegui123/7330269下载
我的处理模型还是差不多的,都是基于把acceptor和业务IO处理的worker分离开,从而实现更高的响应速度,而和tomcat实现上又有些区别,在acceptor线程组中的每个acceptor中我的实现并不是让非阻塞的ServerSocketChannel一直accept,再对SocketChannel进行处理,而是通过再acceptor中加入一个selector,有操作系统通知我们感兴趣的事件的发生。(以上不贴源码,有兴趣了解的朋友可以看一下上面的源码,还有我的源码下载),当然,这通过测试,在acceptor中加入selector的操作会使得并发更高
而在worker线程组中,我的每个worker都维护这一个阻塞队列,对需要处理的io进行缓存,而不是在加入selector,由操作系统通知我们感兴趣时间的发生,因为在本例中是基于静态页面的响应,所以都是对于每个请求就行响应,简单点,没有tomcat来的那么复杂
当然,经100000个并发响应测试,这个处理模型的并发速度还是不错的