web并发,谁是瓶颈?

         
bloodrate
09-08-05 6 2592

最近在看tomcat对于comet的实现,由一点很不解,就是comet要求将tomcat的连接器切换成nio形式,而按照我的理解,如果是使用长轮询方式实现serverpush,并不需要nio就能实现功能,comet可能出于这样一种顾虑,一般serverpush往往一个client要等待很长一段时间才得到反馈,这部分时间占用着系统连接将很大程度影响系统并发能力,所以用nio让一个连接服务多个客户端,让我疑惑的是虽然连接数少了,但是仍旧每个等待响应的客户占用一个阻塞的服务器线程,线程数会遏制并发。所以我很感兴趣的是,web应用中线程数和tcp连接数那个是并发数的瓶颈?

banq
2009-08-05 18:10

应该是web应用中线程数

关键是线程用赶快用完,适合轻量快速任务,很多应用需要立即返回响应,而在响应产生之前要处理很多任务,占据线程时间较长,导致该线程拥有的资源不能释放,服务器资源就这样被这些蚂蚁瓜分了。

线程池有最大个数,这个最大个数其实就是最多多少个线程能够把服务器资源全部被瓜分。

bloodrate
2009-08-05 22:36

一般的javaEE中web项目都是同步调用,都是假定服务器端线程尽可能快的执行完,倘若换成异步模式,比如tomcat部署一个股票系统,50个人在线等着看股票的变化,那么服务器端50个线程始终不终结,很影响并发能力,既然主要瓶颈在线程数上,那么用不用nio又有何防?

banq
2009-08-06 09:58

NIO主要是Socket和线程之间通讯关系,原来,是用一个线程守卫Socket,不断的轮询,这很耗CPU,容易堵塞,而NIO则不需要线程轮询,来一个Socket连接事件,就立即自动触发启动一个处理线程。

两者差异就是:
1.派人去侦察,三班倒。
2.无需派人侦察,有情况自动触发报警,大家就可以立即Action。这就是reActor模式

xmuzyu
2009-08-06 10:53

NIO是在响应性和CPU资源之间的折中。这其实就好比,多线程中你是不断的轮询然后阻塞的方式呢,还是采用对象条件队列来操作(比如wait,notify等),当然我们一般会采用条件队列的方式,因为这样有利于响应性的同时也有利于CPU资源的利用。

2Go 1 2 下一页