Netty线程模型和其他WebServer的比较

大家都知晓的是 Netty比其他Server相对性能好,可定制化高. 那具体区别在哪里。

详细探讨下,上一篇详细讲了Netty的线程模型.

一、Netty线程模型.

一个boss线程、32(核数2倍)个work线程.

下面看看其他WebSever的线程模型.

二、webmvc

常见的 spring-webmvc. (用于 后端API、graphqlServer)

1
2
3
4
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
</dependency>

1. tomcat线程

NioEndpoint组件. Tomcat的NioEndpoint实现了I/O多路复用模型。

  • 创建一个Selector, 在其上注册 事件,等待感兴趣的事件发生.
  • 发生后(比如可读),就创建一个新的线程从Channel读数据.

NioEndpoint包含LimitLatch、Acceptor、Poller、SocketProcessor和Executor共5个组件。

LimitLatch

连接控制器,控制最大连接数,NIO模式下默认8192.

Acceptor

Acceptor实现了Runnable接口,因此可以跑在单独线程里,在死循环里调用accept接受新连接,
一旦有新连接请求到达,accept方法返回一个Channel对象,接着把Channel对象交给Poller去处理.

Poller

本质上是一个Selector,跑在单独线程里。

Poller在内部维护一个Channel数组,它在一个死循环里不断检测Channel的数据就绪状态,一旦有Channel可读,就生成一个SocketProcessor任务对象扔给Executor去处理。

Tomcat的高并发设计

NioEndpoint完成的三件事: 接受连接、检测IO事件和处理请求,关键是把这三件事情分布定制线程数处理:

  • 专门的线程组去跑Acceptor,并且Acceptor的个数可以配置
  • 专门的线程组去跑Poller,Poller的个数也可以配置
  • 具体任务的执行也由专门的线程池来处理,也可以配置线程池的大小

Tomcat线程模型—全网最清晰的讲解

2. 实际线程情况

下面是实际的线程情况:

Catalina-utility(2个)[TIMED_WAITING][ at sun.misc.Unsafe.park(Native Method)]
container-0(1个)[TIMED_WAITING][at java.lang.Thread.sleep(Native Method)]
Live Reload Server(1)[RUNNABLE][at java.net.PlainSocketImpl.socketAccept(Native Method)]
http-nio-8869-BlockPoller(1)[RUNNABLE][at sun.nio.ch.EPollArrayWrapper.epollWait(Native Method)]
http-nio-8869-ClientPoller(1)[RUNNABLE][at sun.nio.ch.EPollArrayWrapper.epollWait(Native Method)]
http-nio-8869-Acceptor(1)[RUNNABLE][at sun.nio.ch.ServerSocketChannelImpl.accept0(Native Method)]
http-nio-8869-exec-213(10)[WAITING][at sun.misc.Unsafe.park(Native Method)]

解释:

3. tomcat线程和netty线程对比【重点】

三、webflux

1
2
3
4
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webflux</artifactId>
</dependency>

四、dubbo

五、thrift