刚学Java,有一个疑问。为什么tomcat对每一个连接…

刚学Java,有一个疑问。为什么tomcat对每一个连接都用一个线程处理,而不是像nginx一样利用epoll这样的io多路复用来处理 ?

程序猿.多宝:m

滴滴员工:tomcat不就使用nio么

小米员工:因为1大多数程序员没有把所有的io写成异步的本事,2即使有这个本事这么写也极其耗时耗力,生产效率极低

程序猿.关平:同样喜欢nginx,不太欣赏汤姆猫的做法,会不会是java不是系统语言,依赖虚拟机,不像c++那样能直接使用epoll等高效接口

阿里巴巴员工:你是看的哪个版本的tomcat?不是早就多路复用了么

vivo员工:还停留在远古时代的tomcat吗[坏笑]

程序猿.时迁:我个学生都知道是nio

小米员工:汤姆猫的nio只是接受服务外的请求的时候吧,接受到的请求依然要使用线程池中一个线程处理。如果如同nginx一样的全异步,Tomcat怎么可能只有这么低的并发

小米员工:多学点只是再看不上别人吧,你那点还差的太远

楼主:是用APR实现吗?

滴滴员工:内部不是采用事件注册机制吗?

小米员工:你访问数据库的时候有注册过事件吗?另外你们的Tomcat线程数应该200左右吧,你可以看下nginx有几个线程

滴滴员工:只要底层有封装也不需要上层注册事件阿

运维攻城狮.简雍:m

楼主:查了一下,的确用了io多路复用。但是为什么tomcat要那么多的线程,nginx就几个子工作进程,而且是单线程模式。

小米员工:我代码中开一个tcp请求自动注册? 汤姆猫不是服务于某一个服务的,是服务于所有用汤姆猫的码农的,怎么确定某个码农不自己开tcp请求

小米员工:这里所谓的nio只是接受请求用nio,后续每个请求的处理依然每个请求对应一个线程。否则我必须需要知道访问数据库的是哪个请求

小米员工:来来来,说下你的认识,别动不动摆资格,装大佬,你的汤姆猫中起的线程数有没到3位数

小米员工:请看我的回复,这楼里除了我都是半瓶水晃荡的,只知道一个名词而已

程序猿.李莫急:这个线程池不是用来处理IO而是用来处理用户业务的,假设tomcat不去实现这个线程池2,到头来用户还是会自己写个线程池。

新垣架纯:而现在流行的netty这种,只有当链路发生真正的读写事件才会创建线程处理,这就是事件驱动的reactor线程模型

新垣架纯:tomcat的线程模型是一个io线程负责死循环接受tcp连接,接收到请求后创建一个工作线程处理后续的数据交互,这样有个问题,如果一个tcp连接上了,就算后续没有读写,在一段时间内创建的工作线程也不会销毁,这个工作线程会继续阻塞等待客户端的请求,出现了很大的资源浪费

楼主:epoll的LT模式支持阻塞IO

安东尼奥刘能:历史原因,当时还没有 netty

达尔巴:因为阻塞的模式符合人的惯性思维,像nginx那样也是可以的,spring5里的webflux就支持,可以用tomcat的异步servlet模式处理,默认用netty,但是这样就需要用reactor了,响应式编程还是不太一样的,对程序猿并不友好,debug也困难些,而且很多历史遗留问题,像jdbc驱动目前成熟的只有阻塞的实现,响应式的驱动目前还不成熟

vivo员工[2]:楼上都没说到点子上啊,ngix擅长的是什么?处理静态资源,几乎不需要耗时,直接就能返回,即使poll出来的长队列也不会等的太久,cpu很少空转,少线程也不消耗系统资源。tomcat的后端是数据接口以及可能包含大量的计算,本身epoll可以无阻塞读写,但是卡在后端处理上的时候,队列依旧会阻塞,失去了多路复用的意义

小米员工:快别扯了,后端绝大多数汤姆猫那点计算谈不上cpu密集型,都是与各种其他服务器交互,如果实现全异步,性能提高一个数量级是完全没问题的

百度员工:刚学java就这么高级吗。。

程序猿.韩当:你可别瞎说了

楼主:那你说

程序猿.瞅你咋滴:哥tomcat有异步的

文丑:1

小米员工:你没看懂我说的啥

程序猿.eight:又不是不能配nio[挖鼻屎]

程序猿.曹丕:m

嵩山弟子:你没有把io线程和业务线程区分开来。

程序猿.雷碧:m

程序猿.dota2:m

程序猿.贾雨村:因为要处理你写的bio

程序猿.潘璋:M

拼多多员工:因为老。新的已经支持nio

利物浦员工:处理网络转发和处理业务逻辑耗时不同。这是nginx和tomcat的区别。如果你的业务逻辑不耗时不会阻塞,你也可以用单线程去处理

程序猿.安东尼奥刘能:m

携程员工:M

阿里巴巴员工[2]:唯一说到点子上的,其他人包括楼主都是半瓶水

阿里巴巴员工[2]:全异步是可以提高性能,但是你得保证所有分布式系统中用到的中间件、数据库连接,全部都是异步的,你能保证么?

小米员工:他们是不是异步跟汤姆猫什么关系?我为何要保证?NGINX全异步要求上游服务全异步了? 我本来要用100台Java服务,我现在改用10台不行?

阿里巴巴员工[2]:你自己都说了全异步能提高性能,如果只是汤姆猫异步,其它中间件不支持异步,那能叫做全异步么?那能提高性能么?

小米员工:呵呵

阿里巴巴员工[2]:呵呵

阿里巴巴员工:你是看的哪个版本的tomcat?不是早就多路复用了么

vivo员工[2]:楼上都没说到点子上啊,ngix擅长的是什么?处理静态资源,几乎不需要耗时,直接就能返回,即使poll出来的长队列也不会等的太久,cpu很少空转,少线程也不消耗系统资源。tomcat的后端是数据接口以及可能包含大量的计算,本身epoll可以无阻塞读写,但是卡在后端处理上的时候,队列依旧会阻塞,失去了多路复用的意义

滴滴员工:tomcat不就使用nio么

程序猿.关平:同样喜欢nginx,不太欣赏汤姆猫的做法,会不会是java不是系统语言,依赖虚拟机,不像c++那样能直接使用epoll等高效接口

嵩山弟子:你没有把io线程和业务线程区分开来。

小米员工:因为1大多数程序员没有把所有的io写成异步的本事,2即使有这个本事这么写也极其耗时耗力,生产效率极低

阿里巴巴员工[3]:别暴露自己水平