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模式Netty的Reactor模式_ide

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

Netty的Reactor模式_bootstrap_02


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

在 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);

源码解析

跨平台实现的根本

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;
}
});
}
}

Netty的Reactor模式_ide_06