数据模型
最主要的就是 Channel
- 每一个 Channel 都有自己的 ChannelPipeline
- 每一个 Channel 只会和一个 EventLoop 绑定
EventLoop 和 Channel 是一对多关系.
EventLoopGroup 和 EventLoop 是一对多关系.
Channel
就是用来读写数据的,每个 Channel 都有自己的 ChannelPipeline;可以把一个 Channel 当作 TCP 的客户端或服务端。
Channel 有哪些:
- DatagramChannel: UDP
- ServerSocketChannel: TCP 服务端
- SocketChannel: TCP 客户端
NIO、EPoll、KQueue 支持零拷贝;例如 NIOServerSocketChannel。
ChannelPipeline
就是 ChannelHandler 的链表;每一个 ChannelHandler 可以处理:
- 入站事件: ChannelInboundHandler
- 出站事件: ChannelOutboundHandler
- 或则两个都可以
ChannelHandler 就是具体的业务逻辑。
EventLoopGroup
就是一个 EventLoop 的线程池,主要就是:
- 创建 EventLoop
- 向其中一个 EventLoop 中注册 Channel
ScheduledExecutorService
EventLoopGroup创建并管理一个NioEventLoop线程池,它负责执行特定通道的I/O操作。每个NioEventLoop线程都与一个Selector相关联,Selector被用来管理多个通道并在这些通道上执行I/O操作。
NioEventLoopGroup类创建并管理一组NioEventLoop线程,它们负责执行特定通道的I/O操作。每个NioEventLoop线程都与一个Selector相关联,该Selector用于管理多个通道并在这些通道上执行I/O操作。
在Netty中,EventLoop是一个单线程实体,为一个特定的通道执行I/O操作。一个EventLoopGroup是一个EventLoop的集合,可以用来处理多个通道的I/O操作。
MultithreadEventLoopGroup扩展了EventLoopGroup接口,提供了一种实现EventLoopGroup的方法,它使用多个线程来处理其通道的I/O操作。这是通过创建一个EventLoop实例池来实现的,每个实例都在自己的线程中运行,然后将传入的I/O操作分配给它们。
NioEventLoopGroup是MultithreadEventLoopGroup的具体实现,用于Netty中基于NIO选择器的通道。它为处理I/O操作提供了一个事件驱动的编程模型,例如通过网络读写数据。
NioEventLoopGroup创建并管理一个NioEventLoop线程池,它负责执行特定通道的I/O操作。每个NioEventLoop线程都与一个Selector相关联,Selector被用来管理多个通道并在这些通道上执行I/O操作。
当一个通道被注册到NioEventLoopGroup时,它被添加到与一个NioEventLoop线程相关的Selector中。然后,NioEventLoop线程在选择器上等待I/O事件,并在事件发生时执行适当的I/O操作。
NioEventLoopGroup提供了几个构造器来创建具有不同配置的实例,如池中的线程数量和用于创建线程的执行器。
总的来说,NioEventLoopGroup是Netty架构中的一个关键组件,为网络应用中基于NIO的I/O操作提供了一个可扩展和高性能的解决方案。
一个能同时处理多个线程的任务的EventLoopGroup实现的抽象基类叫做 "MultithreadEventLoopGroup"。
该类提供了一种创建和管理多个EventLoop实例的方法,这些实例被用来执行I/O操作,并以非阻塞方式处理事件。每个EventLoop都在一个单独的线程中运行,任务可以在它们之间分配,以便并发执行。
MultithreadEventLoopGroup还提供了关闭EventLoop和释放其相关资源的方法。
这个类经常被用于高性能的网络应用中,其中需要多个线程来处理大量的并发连接和I/O操作。通过使用多线程的EventLoopGroup,应用程序可以充分利用可用的CPU资源,提高其整体性能。
这是 EventLoop 对象的容器。每个 EventLoop 对象只与一个线程相关联。每个 Channel 在其整个生命周期中都与一个 EventLoop 相关联。
虽然每个 Channel 都与单个 EventLoop 相关联,但 EventLoop 最终可能会与多个 Channels 相关联。这一点很重要,我们稍后会深入探讨其含义。
EventLoopGroup 有多种实现,使用的特定实现必须与传输相匹配:例如,NIOEventLoopGroup 必须与 NIO 传输一起使用,OIOEventLoopGroup 与 OIO 传输等。在单个组中创建的 EventLoop 对象的数量取决于关于 EventLoopGroup 的实现:OIOEventLoopGroup 为每个新 Channel 创建一个新的 EventLoop,而 NIO/EPoll/Kqueue 组创建一个 2 * 数量的处理器池,并将它们均匀分布在 Channel 中。
Channel 的所有事件和处理程序都在其单个 EventLoop 上执行。这些 EventLoop 对象可以被认为是 I/O 线程,因为它们处理 Netty 应用程序或驱动程序中的所有 I/O,包括 ChannelPipeline 中的 ChannelHandlers 中发生的任何处理。
EventLoop 中有一个任务队列,最小是 16 最大是 int 类型最大值
参考资料
https://medium.com/@akhaku/netty-data-model-threading-and-gotchas-cab820e4815a
https://livebook.manning.com/book/netty-in-action/chapter-7/13
标签:NioEventLoop,Netty,EventLoop,线程,EventLoopGroup,Channel,通道 From: https://www.cnblogs.com/jnyyxz/p/17171523.html