Tomcat并发处理请求

2018-10-12  本文已影响169人  ZMRWEGo

Tomcat处理连接请求的模式:

一、NIO、BIO、APR

1. Connector的模式

Connector在处理HTTP请求时,会使用不同的模式。不同版本的Tomcat支持的模式不行同(Tomcat8+版本支持NIO以及APR去掉了对BIO的支持)
BIO与NIO大家都是比较熟悉的,APR是Apache Portable Runtime,是Apache可移植运行库,利用本地库可以实现高扩展性、高性能;APR是在Tomcat上运行高并发应用的首选模式,但是需要安装apr、apr-utils、tomcat-native等包

2. Connector的请求流程

OverView

Connector启动后会启动三种线程组用于不同阶段的处理:

Connector的初始化及启动
tomcat-connector-start
  1. initServerSocket(),通过ServerSocketChannel.open()打开一个ServerSocket,默认绑定到8080端口,默认的连接等待队列长度为100,当超过100时会拒绝服务。我们可以通过在conf/server.xml中的Connector的acceptCount属性对其进行设置。
  2. createExecutor()用于创建Worker线程池。默认会启动10个Worker线程,Tomcat处理请求过程中,Worker最多不超过200个。我们可以通过配置conf/server.xml中的Connector的minSpareThreads 和 maxThreads 对这两个属性进行定制。
  3. Poller用于检测已经就绪的Socket,默认不超过2个线程,我们可以通过配置 pollerThreadCount 设置。
    4.Acceptor用于接收新的连接,默认1个线程,我们可以通过配置 acceptorThreadCount 对其进行设置。
Acceptor请求过程
  1. Acceptor在启动后会阻塞在ServerSocketChannel.accept()处,当有新连接到达时,该方法返回一个SocketChannel
    2.配置完Socket以后会将Socket封装到NioChannel中,并注册到 Poller,由于我们一开始就启动了多个 Poller 线程,注册的时候,连接是公平的分配到每个 Poller 的。
    3.addEvent() 方法会将 Socket 添加到该 Poller 的 PollerEvent 队列中。到此 Acceptor 的任务就完成了。
Poller过程
  1. selector.select(1000)。当 Poller 启动后因为 selector 中并没有已注册的 Channel,所以当执行到该方法时只能阻塞。所有的 Poller 共用一个 Selector,其实现类是 sun.nio.ch.EPollSelectorImpl
    2.events() 方法会将通过 addEvent() 方法添加到事件队列中的 Socket 注册到 EPollSelectorImpl,当 Socket 可读时,Poller 才对其进行处理
    3.createSocketProcessor() 方法将 Socket 封装到 SocketProcessor 中,SocketProcessor 实现了 Runnable 接口。worker 线程通过调用其 run() 方法来对 Socket 进行处理。
    4.execute(SocketProcessor) 方法将 SocketProcessor 提交到线程池,放入线程池的 workQueue 中。workQueue 是 BlockingQueue 的实例。到此 Poller 的任务就完成了。
Worker过程

参考:谈谈 Tomcat 请求处理流程(http://www.importnew.com/27729.html

上一篇下一篇

猜你喜欢

热点阅读