Netty之主从Reactor多线程模型

Reactor模式用于解决高性能IO问题,特别适合处理海量的I/O事件,它是当前大多数IO组件所采用的IO模式。Netty网络框架就是基于Reactor模式进行设计和开发的,当请求抵达后,服务处理程序使用多路分配策略,同步地派发这些请求至相关的请求处理程序。

Netty可以通过配置不同参数实现不同Reactor线程模型,在Netty的官方demo中,推荐使用主从Reactor多线程模型,所以这里主要讲解常用的主从Reactor多线程模型。

主从Reactor线程模型的特点,服务端用于接收客户端连接的不再是个1个单独的NIO线程,而是一个独立的NIO线程池bossGroup。Acceptor接收到客户端TCP连接请求并处理完成后,将新创建的SocketChannel注册到workGroup线程池的某个IO线程上,由它负责SocketChannel的读写和编解码工作。

(1)bossGroup:监听ServerSocketChannel,接收到客户端连接请求后交由Acceptor处理,成功建立连接后将SocketChannel派发给workGroup。

(2)Acceptor:联想Socket编程大概也能猜到这是处理客户端请求链接的,Acceptor仅仅完成登录、握手和安全认证等操作,一旦链路建立成功,就将SocketChannel注册到后端workGroup线程池的IO线程上,由IO线程负责后续的IO操作。

(3)workGroup:监听SocketChannel的IO事件,完成编码、解码以及相应业务处理。

下面给出一个主从Reactor多线程模式的使用实例:

public class Server {
	public static void main(String[] args) throws Exception {
		// Configure the server
		// 创建两个EventLoopGroup对象
		// 创建boss线程组 ⽤于服务端接受客户端的连接
		EventLoopGroup bossGroup = new NioEventLoopGroup(2);
		// 创建 worker 线程组 ⽤于进⾏ SocketChannel 的数据读写
		EventLoopGroup workerGroup = new NioEventLoopGroup();
		try {
			// 创建 ServerBootstrap 对象
			ServerBootstrap b = new ServerBootstrap();
			// 设置使⽤的EventLoopGroup
			b.group(bossGroup, workerGroup)
			// 设置要被实例化的为 NioServerSocketChannel 类 
			.channel(NioServerSocketChannel.class)
			// 设置 NioServerSocketChannel 的处理器
			.handler(new LoggingHandler(LogLevel.INFO))
			// 设置连⼊服务端的 Client 的 SocketChannel 的处理器
			.childHandler(new ServerInitializer());
			// 绑定端⼝,并同步等待成功,即启动服务端
			ChannelFuture f = b.bind(8888);
			// 监听服务端关闭,并阻塞等待
			f.channel().closeFuture().sync();
		} finally {
			// 优雅关闭两个 EventLoopGroup 对象
			bossGroup.shutdownGracefully();
			workerGroup.shutdownGracefully();
		}
	}
}

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
Netty的多线模型主从线模型有一些区别。Netty线模型基于主从Reactor模型,其中一个线程负责处理OP_ACCEPT事件,而拥有CPU核数的两倍的IO线程负责处理读写事件。一个通道的IO操作会绑定在一个IO线程中,而一个IO线程可以注册多个通道。在一个IO线程中,所有通道的事件是串行处理的。\[1\] 相比之下,主从线模型中,一个线程负责监听客户端请求,而多个线程负责事件处理和转发,还有多个线程负责逻辑处理。每个客户端都分配独立的线程,该线程负责全部的工作,包括监听、读取、处理和响应。而在Netty的多线模型中,一个IO线程可以处理多个通道的IO操作。\[2\] 此外,Netty的多线模型还可以通过指定其他线程池来处理编码、解码等操作,以及单独开启业务线程池来处理业务逻辑。这样可以避免线程切换,提高性能。而主从线模型中,所有的功能都在子线程中进行处理。\[2\] 总的来说,Netty的多线模型相对于主从线模型更加灵活和高效,能够更好地处理并发请求。 #### 引用[.reference_title] - *1* *3* [【9. Netty Reactor模型主从线模型】](https://blog.csdn.net/W664160450/article/details/123418237)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [面试官:Netty线模型可不只是主从Reactor这么简单](https://blog.csdn.net/prestigeding/article/details/112405349)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值