zoukankan      html  css  js  c++  java
  • Netty 线程模型

    一、线程模型概述

    线程模型表明了代码的执行方式。从最开始的使用单线程,后来出现了多线程,之后是线程池。当有要执行的任务时,任务会被传到线程池,从线程池中获得空闲的线程来执行任务,执行完了后会将线程返回到线程池。

    二、Reactor 模型

    1.网络服务基本的步骤:

    ①读取请求  → ②解码请求  → ③处理请求  → ④编码响应  → ⑤发送响应

    2.Reactor模型

    (1)single threaded version

    (图片摘自Doug Lea的pdf,链接参见文末)

    在这个模型中,一个线程处理所有I/O相关的操作。acceptor接收来自客户端的TCP连接请求,建立连接后,通过dispatcher将消息(ByteBuffer)分发到各个handler(新的线程)上进行处理。这个模型无法满足高容量的需求,不停的穿建了新的线程来处理消息,耗尽系统资源。此外,当NIO线程负载较重之后,处理速度会变慢导致大量客户端连接超时,重新发送请求,导致CPU很快便会达到100。

    (2)Multithreaded pattern

    (图片摘自Doug Lea的pdf,链接参见文末)

    这个版本上的变化,主要体现在分发到各个handler(worker thread)时,使用了线程池,这样避免创建过多的线程,控制线程数量,提高处理效率。 但是在个别场合,一个NIO线程负责监听和处理所有客户端连接(例如百万客户端连接)可能会存在性能问题。

    (3)Multiple Reactor

     

    (图片摘自Doug Lea的pdf,链接参见文末)

    在这个模型中,主reactor选择一个线程作为acceptor线程,用于绑定监听端口,接收客户端连接。然后,Acceptor接收客户端请求后创建新的SocketChannel,注册到子reactor中进行握手等操作。最后,来到工作线程池,进行业务的操作。

    三、Netty线程模型

     1.接口EventLoop

    1 public interface EventLoop extends OrderedEventExecutor, EventLoopGroup {
    2     @Override
    3     EventLoopGroup parent(); // 这个方法,返回这个EventLoop所属的EventLoopGroup的引用
    4 }

    在Netty中,多个EventLoop会被创建。其中的一个用来服务多个Channnel,另外的其他,会用来优化资源的使用。这句话的意思,联想代码部分,我们可以想到下面:

    1 EventLoopGroup bossGroup = new NioEventLoopGroup(1);  //负责监听接口,处理客户端过来的连接请求
    2 EventLoopGroup workerGroup = new NioEventLoopGroup(); //负责连接之后,通道的信息的传输

    再看一下他的类的层次图(图摘自《Netty in action》):

    2.Netty 4中I/O 和 事件处理

    事件多种多样,事件的本性决定了它本身如何被处理,例如:它可以从网络往应用里传输,也可相反,或是完全不同的一些事件。但是事件的处理逻辑要广泛和灵活,以至于可以处理任何的情况。因此,在Netty 4中所有I/O和事件的处理交给 指定到EventLoop上的thread来执行。这点与Netty 3不同。

    3.Netty 3中I/O 和 事件处理

    只有Inbound事件会被交给EventLoop来执行,而所有Outbound事件会由调用者线程来执行,可能是I/O线程,也可能是其他线程。因此,outbound端需要同步的操作。因为,五法保证多个线程不会同时操作outbound事件。

    4.实现的细节

    看下面流程,线程的管理:

     

    任务执行前会进行判断,调用的线程是否是指定给EventLoop的线程。如果是同一个的话,直接执行任务;如果不是,将任务放进队列之中,等EventLoop再次处理它的任务。

    这就解释了为什么在ChannelHandler中为什么不需要同步就可以让线程和Channel直接交互。

    就写到这里了。。。能力一般,水平有限!希望以后多用到Netty,能更好的认知Netty。

    参考资料:

    http://gee.cs.oswego.edu/dl/cpjslides/nio.pdf

    《Netty in action》

  • 相关阅读:
    事件使用(转 )
    使用Dotfuscator 进行.Net代码混淆 代码加密的方法
    Git分布式版本控制系统学习笔记
    免费SVN服务器笔记
    如何设置mysql远程访问及防火墙设置
    c# GridControl怎么换行
    模拟Post登陆带验证码的网站
    c#控制打印机杂项
    ssh 自动登录
    mysql 使用记号
  • 原文地址:https://www.cnblogs.com/lihao007/p/10726424.html
Copyright © 2011-2022 走看看