Netty的Reactor模式

举报
JavaEdge 发表于 2021/06/03 23:01:27 2021/06/03
【摘要】 BIONIOAIOThread-Per-ConnectionReactorProactor 什么是Reactor Reactor是一种开发模式,模式的核心流程: 注册感兴趣的事件->扫描是否有感兴趣的事件发生->事件发生后做出相应的处理。 client/ServerSocketChannel/ServerSocketChannelOP_ACCEPTOP_...
BIO NIO AIO
Thread-Per-Connection Reactor Proactor

什么是Reactor

Reactor是一种开发模式,模式的核心流程:
注册感兴趣的事件->扫描是否有感兴趣的事件发生->事件发生后做出相应的处理。

client/Server SocketChannel/ServerSocketChannel OP_ACCEPT OP_CONNECT OP_WRITE OP_READ
client SocketChannel Y Y Y
client ServerSocketChannel Y
client SocketChannel Y Y

三种版本

Thread-Per-Connection模式

注意到每个 handler 里的 read 和 send都是阻塞操作,那用线程池不就行了?但那只是避免了线程数量无限增长而已,依旧无法避免等待线程的阻塞。

  • Reactor 模式 V1:单线程,一个线程太累啦,而且他一旦挂了,整个系统挂了。相当于创业初期,老板就是个全干工程师。
  • Reactor 模式 V2:多线程,老板开始招合伙人了,大家一起干!
  • Reactor 模式 V3:主从多线程。对于服务器来说,最重要的莫过于接收连接,使用主线程做这些事。老板真的成为资本家了,开始招聘打工人啦!老板只负责最关键的事情即可。

在 netty 中使用 reactor 模式

# Reactor单线程模式
EventLoopGroup eventGroup = new NioEventLoopGroup(1);
ServerBootstrap serverBootstrap = new ServerBootstrap();
serverBootstrap.group(eventGroup);

# 非主从Reactor多线程模式
EventLoopGroup eventGroup = new NioEventLoopGroup();
ServerBootstrap serverBootstrap = new ServerBootstrap();
I serverBootstrap.group eventGroup);

# 主从Reactor多线程模式
EventLoopGroup bossGroup = new NioEventLoopGroup();
EventLoopGroup workerGroup = new NioEventLoopGroup();
ServerBootstrap serverBootstrap = new ServerBootstrap();
serverBootstrap.group( bossGroup, workerGroup);

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

源码解析

跨平台实现的根本

 public static SelectorProvider provider() { synchronized (lock) { if (provider != null) return provider; return AccessController.doPrivileged( new PrivilegedAction<SelectorProvider>() { public SelectorProvider run() { if (loadProviderFromProperty()) return provider; if (loadProviderAsService()) return provider; provider = sun.nio.ch.DefaultSelectorProvider.create(); return provider; } }); } }

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

文章来源: javaedge.blog.csdn.net,作者:JavaEdge.,版权归原作者所有,如需转载,请联系作者。

原文链接:javaedge.blog.csdn.net/article/details/111008190

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。