`

netty 源码分析之(二.1)ServerBootstrap、Boss/workers线程池

 
阅读更多

1、 ServerBootstrap bootstrap = new ServerBootstrap(

                new NioServerSocketChannelFactory(

                        Executors.newCachedThreadPool(),

                        Executors.newCachedThreadPool()));

或者,NioServerSocketChannelFactory(

            Executor bossExecutor, Executor workerExecutor,

            int workerCount) {

中,第二个参数(线程池)用于运行NioWorker。第三个参数(workerCount)表示NioWorker最大个数,即最大的并发量。默认是(cpu个数*2)。

 

boss线程和worker线程

 

可以这么说,ServerBootstrap监听的一个端口对应一个boss线程,它们一一对应。比如你需要netty监听80和443端口,那么就会有两个boss线程分别负责处理来自两个端口的socket请求。在boss线程接受了socket连接求后,会产生一个channel(一个打开的socket对应一个打开的channel),并把这个channel交给ServerBootstrap初始化时指定的ServerSocketChannelFactory来处理,boss线程则继续处理socket的请求。

 

ServerSocketChannelFactory则会从worker线程池中找出一个worker线程来继续处理这个请求。
如果是OioServerSocketChannelFactory的话,那个这个channel上所有的socket消息消息,从开始到channel(socket)关闭,都只由这个特定的worker来处理,也就是说一个打开的socket对应一个指定的worker线程,这个worker线程在socket没有关闭的情况下,也只能为这个socket处理消息,无法服务器他socket。

 

如果是NioServerSocketChannelFactory的话则不然,每个worker可以服务不同的socket或者说channel,worker线程和channel不再有一一对应的关系。
显然,NioServerSocketChannelFactory只需要少量活动的worker线程及能很好的处理众多的channel,而OioServerSocketChannelFactory则需要与打开channel等量的worker线程来服务。

 

线程是一种资源,所以当netty服务器需要处理长连接的时候,最好选择NioServerSocketChannelFactory,这样可以避免创建大量的worker线程。在用作http服务器的时候,也最好选择NioServerSocketChannelFactory,因为现代浏览器都会使用http keepalive功能(可以让浏览器的不同http请求共享一个信道),这也是一种长连接

 

Netty网络线程模型主要有两类线程组成:boss线程、worker线程。启动一个server实例只会产生一个boss线程,boss线程主要负责监听端口,当有新的连接请求时就会产生一个task交给worker线程池处理,worker线程池中线程的个数默认是cpu个数的2倍。

 

 

Netty网络I/O操作采用了目前流行的I/O多路选择器Selector方式(具体的实现是select/poll,还是epoll/kqueue,是由java虚拟机根据具体操作系统的实现来决定的)。

       Worker线程池中每个线程都维护几个处理队列(如注册队列,写任务队列等),每个队列中实际上都注册着一些interestOPS(感兴趣的操作集),worker线程不断的循环地做select操作,boss线程不断地将新的连接请求注册到一个work线程的注册队列中,每次都是轮询出worker线程池中的一个线程:

 

[java] view plaincopy
  1. NioWorker nextWorker() {  
  2.         return workers[Math.abs(workerIndex.getAndIncrement() % workers.length)];  
  3. }  


Worker线程中如果selectors.keys操作结果为空,则会主动退出,当又有新的连接请求被boss线程加到相应的worker线程的队列时,该worker线程又会重新启动。

 

 

       这里在处理线程间同步和互斥时用了2个锁:

 

  1.  一个started标志,主要用于判断当前线程是否已经启动,当boss线程选择了一个worker线程后,想把新请求加入到该worker线程的新请求队列时,若该started=false,则表示该worker线程没有启动,所以要先启动worker线程,若started=true,则表示该worker线程已启动,则直接把请求加入到该worker线程的请求队列就行了。当worker线程的队列中没有了操作,即为空时,worker线程会主动退出,并设置started=false。故,对于started,boss线程和worker线程间要进行同步,所以使用了       synchronized(startStopLock)
  2.  Selectors选择器操作本身是同步的,但对selectionkey的操作则需要进行同步控制,所以又用到了一个锁:selectorGuard = newReentrantReadWriteLock()

 

 

第一个是互斥锁;第二个是读写锁

 

每个worker线程各自使用一个selector,即每个worker线程的请求队列中所有的新请求(即一个SocketChannelclient)都会在该worker线程的Selector中注册感兴趣的选择键集。

 

 

分享到:
评论

相关推荐

    netty-all-4.1.8.Final.jar

    android开发使用的netty-all-4.1.18.Final.jar的依赖包

    netty-all-4.1.32.Final-sources.jar 最新版netty源码全部包

    netty-buffer-4.1.32.Final-sources.jar netty-buffer-4.1.32.Final.jar netty-build-22-sources.jar netty-build-22.jar netty-codec-4.1.32.Final-sources.jar netty-codec-4.1.32.Final.jar netty-codec-...

    netty-netty-4.1.36.Final.rar

    netty源码netty-netty-4.1.36.Final.rarnetty源码netty-netty-4.1.36.Final.rarnetty源码netty-netty-4.1.36.Final.rarnetty源码netty-netty-4.1.36.Final.rarnetty源码netty-netty-4.1.36.Final.rarnetty源码netty-...

    Netty (netty-netty-5.0.0.Alpha2.tar.gz)

    Netty (netty-netty-5.0.0.Alpha2.tar.gz)是一个 NIO 客户端服务器框架,可以快速轻松地开发协议服务器和客户端等网络应用程序。它极大地简化和流线了网络编程,例如 TCP 和 UDP 套接字服务器。 “快速和简单”并...

    netty-all-4.1.97.Final-20230731.020124-2.jar netty最新jar包,可直接导入使用

    Netty 是一个利用 Java 的高级网络的能力,隐藏其背后的复杂性而提供一个易于使用的 API 的客户端/服务器框架。 Netty 是一个广泛使用的 Java 网络编程框架(Netty 在 2011 年获得了Duke's Choice Award,见...

    netty-common-4.1.65.Final-API文档-中英对照版.zip

    赠送jar包:netty-common-4.1.65.Final.jar; 赠送原API文档:netty-common-4.1.65.Final-javadoc.jar; 赠送源代码:netty-common-4.1.65.Final-sources.jar; 赠送Maven依赖信息文件:netty-common-4.1.65.Final....

    netty-buffer-4.1.68.Final-API文档-中文版.zip

    赠送jar包:netty-buffer-4.1.68.Final.jar; 赠送原API文档:netty-buffer-4.1.68.Final-javadoc.jar; 赠送源代码:netty-buffer-4.1.68.Final-sources.jar; 赠送Maven依赖信息文件:netty-buffer-4.1.68.Final....

    netty-all-4.1.68.Final-API文档-中英对照版.zip

    赠送jar包:netty-all-4.1.68.Final.jar; 赠送原API文档:netty-all-4.1.68.Final-javadoc.jar; 赠送源代码:netty-all-4.1.68.Final-sources.jar; 赠送Maven依赖信息文件:netty-all-4.1.68.Final.pom; 包含...

    netty-netty-4.1.79.Final.tar.gz

    netty-netty-4.1.79.Final.tar.gz

    netty-buffer-4.1.73.Final-API文档-中文版.zip

    赠送jar包:netty-buffer-4.1.73.Final.jar; 赠送原API文档:netty-buffer-4.1.73.Final-javadoc.jar; 赠送源代码:netty-buffer-4.1.73.Final-sources.jar; 赠送Maven依赖信息文件:netty-buffer-4.1.73.Final....

    netty-netty-3.10.6.Final.tar.gz

    Netty (netty-netty-3.10.6.Final.tar.gz)是一个 NIO 客户端服务器框架,可以快速轻松地开发协议服务器和客户端等网络应用程序。它极大地简化和流线了网络编程,例如 TCP 和 UDP 套接字服务器。 “快速和简单”并...

    netty-all-4.1.23.Final-API文档-中英对照版.zip

    赠送jar包:netty-all-4.1.23.Final.jar; 赠送原API文档:netty-all-4.1.23.Final-javadoc.jar; 赠送源代码:netty-all-4.1.23.Final-sources.jar; 赠送Maven依赖信息文件:netty-all-4.1.23.Final.pom; 包含...

    Netty (netty-netty-4.0.56.Final.tar.gz)

    Netty (netty-netty-4.0.56.Final.tar.gz)是一个 NIO 客户端服务器框架,可以快速轻松地开发协议服务器和客户端等网络应用程序。它极大地简化和流线了网络编程,例如 TCP 和 UDP 套接字服务器。 “快速和简单”并...

    netty-common-4.1.68.Final-API文档-中文版.zip

    赠送jar包:netty-common-4.1.68.Final.jar; 赠送原API文档:netty-common-4.1.68.Final-javadoc.jar; 赠送源代码:netty-common-4.1.68.Final-sources.jar; 赠送Maven依赖信息文件:netty-common-4.1.68.Final....

    netty-all-4.1.43.Final.jar

    RosJava android_core中android_10所需的部分依赖

    netty-4.1.42.Final.tar.bz2

    linux下netty包,用来作网络爬虫测试,通过netty来实现每秒1000+次请求,这个是netty包,为了方便把他传上来

    netty-handler-4.1.73.Final-API文档-中文版.zip

    赠送jar包:netty-handler-4.1.73.Final.jar; 赠送原API文档:netty-handler-4.1.73.Final-javadoc.jar; 赠送源代码:netty-handler-4.1.73.Final-sources.jar; 赠送Maven依赖信息文件:netty-handler-4.1.73....

Global site tag (gtag.js) - Google Analytics