何为 Netty 的异步事件驱动?

初学Netty,就对官网上Netty的介绍印象很深,其中有一句话,“Netty是一款高性能的异步事件驱动的网络编程框架”,一直疑惑,明明是设计基于NIO(当然也支持传统BIO),却说他是异步事件驱动,这个异步事件驱动到底体现在什么地方。随着逐渐的理解,终于有了自己的答案。这个答案在于 Netty 对 EventExecutorEventExecutorGroupChannelHandler 事件处理这部分的设计。其重要子类就是,大家熟知的EventLoopEventLoopGroup 。如果还不熟悉,它的“孙子”就是 NIOEventLoopNIOEventLoopGroup

EventExecutorEventExecutorGroup顶级接口设计:

Netty事件驱动顶级接口设计.png

大概绘制一下,Netty是如何进行异步事件驱动设计的,下图参考了 NIOEventLoopNIOEventLoopGroup

Netty异步事件驱动设计.png

  1. EventExecutorGroup :一般来说是包含了 n 个 EventExecutor ,比如: NioEventLoopGroup 通过构造参数设置 EventExecutor 的数量,在初始化时会对应产生这么多的 EventExecutor。
  2. EventExecutor:负责处理具体的事件逻辑,在 NioEventLoop 中,每一个 NioEventLoop 都是一个线程,循环去队列中拉去任务执行,并且负责绑定 channel 的 selector.select .
  3. HandlerContext:虚构的,这个上图依据了,ChannelHandlerContext,主要责任是:1. 事件处理责任链。2. 识别事件,依据不同事件,将EventHandler的对应的逻辑,交给绑定了 EventExecutor 处理。Context在创建时,就会从EventExecutorGroup 中 获得一个 EventExecutor 和他绑定,这样做的好处就是,减少从Group取Executor的频率(即不用每个事件过来都去找一个Executor去处理)
  4. Event:表示事件,一般都是一个标识,比如说 Selector.select() 的 keys。

事件,驱动一系列行为,行为逻辑执行交由线程池中选择出的线程(EventExcutor) 完成,执行完毕后,可以通过 Future 和 Promise setSucees setFairure 方法,获取结果或触发相关回调代码,这便是 Netty 的 异步事件驱动。

你可能感兴趣的:(何为 Netty 的异步事件驱动?)