Netty ChannelPipeline Inbound Outbound
所属分类 netty
浏览量 73
当boss线程监控到绑定端口上有accept事件,为该socket连接实例化Pipeline,
并将InboundHandler和OutboundHandler按序加载到Pipeline中,然后将该socket连接(也就是Channel对象)挂载到selector上。
一个selector对应一个线程,该线程会轮询所有挂载在他身上的socket连接有没有read或write事件,然后通过线程池去执行Pipeline的业务流。
selector如何查询哪些socket连接有read或write事件,主要取决于调用操作系统的IO多路复用内核,
如果是select(注意,此处的select是指操作系统内核的select IO多路复用,不是netty的seletor对象),
那么将会遍历所有socket连接,依次询问是否有read或write事件,最终操作系统内核将所有IO事件的socket连接返回给netty进程,
当有很多socket连接时,这种方式将会大大降低性能,因为存在大量socket连接的遍历和内核内存的拷贝。
如果是epoll,性能将会大幅提升,因为它基于完成端口事件,已经维护好有IO事件的socket连接列表,
selector直接取走,无需遍历,也少掉内核内存拷贝带来的性能损耗
Netty中,Inbound和Outbound是两个重要的概念,用于描述数据在ChannelPipeline中的流动方向。
Inbound(入站)指的是数据从网络传输到应用程序,即数据从远程主机进入本地主机。
在ChannelPipeline中,Inbound数据会依次经过Pipeline中的每个ChannelHandler进行处理,直到到达Pipeline的末尾。
Outbound(出站)指的是数据从应用程序传输到网络,即数据从本地主机发送到远程主机。
在ChannelPipeline中,Outbound数据会从Pipeline的末尾开始,逆序经过Pipeline中的每个ChannelHandler进行处理,直到到达Pipeline的起始位置。
Inbound和Outbound的区别在于数据的流动方向。
Inbound数据是从网络进入应用程序,而Outbound数据是从应用程序发送到网络。
这意味着Inbound数据是应用程序接收和处理外部数据的入口,而Outbound数据是应用程序发送数据到外部的出口。
虽然Inbound和Outbound描述了数据的不同流动方向,但它们之间也存在联系。
在ChannelPipeline中,Inbound和Outbound数据可以相互影响和交互。
例如,一个ChannelHandler可以在处理Inbound数据时生成Outbound数据作为响应,或者在处理Outbound数据时修改Inbound数据的内容。
总结起来,Inbound和Outbound是描述数据在ChannelPipeline中流动方向的概念。
Inbound数据是从网络进入应用程序,Outbound数据是从应用程序发送到网络。
它们在ChannelPipeline中相互影响和交互,共同实现网络数据的处理和传输。
Pipeline的责任链是通过ChannelHandlerContext对象串联的,ChannelHandlerContext对象里封装了ChannelHandler对象,通过prev和next节点实现双向链表。
Pipeline的首尾节点分别是head和tail,当selector轮询到socket有read事件时,将会触发Pipeline责任链,
从head开始调起第一个InboundHandler的ChannelRead事件,接着通过fire方法依次触发Pipeline上的下一个ChannelHandler .
ChannelPipeline ChannelHandlerContext 双向链表
ChannelHandlerContext 持有 ChannelHandler
ChannelHandler 分为 InbounHandler 和 OutboundHandler
InboundHandler 处理接收消息
OutboundHandler 处理发送消息
head的ChannelHandler既是InboundHandler又是OutboundHandler,无论是read还是write都会经过head,
head封装了unsafe方法,用来操作socket的read和write
tail的ChannelHandler只是InboundHandler,read的Pipleline处理将会最终到达tail
一个 Channel 包含一个 ChannelPipeline,ChannelPipeline 中维护了一个由 ChannelHandlerContext 组成的双向链表,每个 ChannelHandlerContext 中又关联一个 ChannelHandler。
入站事件和出站事件在一个双向链表中,入站事件会从链表 head 往后传递到最后一个入站的 handler,出站事件会从链表 tail 往前传递到最前一个出站的 handler,两种类型的 handler 互不干扰。
上一篇
下一篇
websocket 聊天室简单例子
netty http server 实例
netty 趣事
netty 架构原理简介
grafana prometheus 查询结果为空处理
netty-socketio 与 websocket