在netty的线程模型中,bossGroup只负责请求的转发,workerGroup是具体的数据处理,其实netty使用的是Reactor(响应器)的设计模式。
一篇文章对这种模式做了非常细致的介绍,《Scalable IO in Java》 ,这篇文章的作者是 Doug Lea!!!
大多数的网络服务都是下面的流程:
- 读取请求
- 解码
- 业务逻辑处理
- 编码响应
- 发送响应
典型的设计实现如下:
每个请求的处理都在自己的线程里。
采用分治是应对拓展的好方法:
将一个处理过程分成多个小任务,每个任务都是非阻塞的;
当任务可执行时再调用;下图中IO事件通常充作触发开关
底层利用java.nio 的非阻塞的读与写操作,一个Selector管理多个channel。
来看看Reactor是怎么做的。
Reactor 模式
Reactor 单线程模型
使用异步非阻塞 I/O,一个线程独立处理所有 I/O相关操作。通过 Acceptor 类接收客户端连接请求,建立链路,dispatch 将对应的信息 ByteBuffer 分发到响应 handler,进而对消息进行解析处理。
通过代码来理解:
class Reactor implements Runnable {
final Selector selector;
final ServerSocketChannel serverSocket;
Reactor(int port) throws IOException {
selector = Selector.open();
serverSocket = ServerSocketChannel.open();
serverSocket.socket().bind(new InetSocketAddress(port));
serverSocket.configureBlocking(false);
SelectionKey sk =serverSocket.register(selector,SelectionKey.OP_ACCEPT);
sk.attach(new Acceptor())