背景
最近遇到了一些问题了netty相关,又重新看了下netty相关的知识
之前疑问
1、NiO, IO多路复用, Netty, Epoll, Selector, Reactor模型等的关系是什么?
Netty (主从 Reactors 多线程模型的落地)
netty的核心实现:NIO(Non-block I/O) + IO多路复用
操作系统底层提供对IO多路复用提供的支持:Epoll Selector Poll
可看
2、IO多路复用和非阻塞的关系,IO多路复用复用的是啥?
复用:线程;
多路:多个IO事件;
IO多路复用:一个线程去处理多个IO事件(尽可能去压榨了CPU,同时又没有线程切换的开销,所以性能好);解决的是IO事件处理的瓶颈问题
IO多路复用,既可以是非阻塞的,也可以是阻塞的,阻塞是指,在某个IO没有数据达到的时候,是阻塞的,还是非阻塞的;(阻塞的以为着只能阻塞在某个IO上,非阻塞意味着可以进行多个IO的轮询或者监听)
2、netty的主要解决什么问题?什么场景下需要考虑使用netty?
网络连接的问题。需要自建服务器的时候可以使用netty, eg: dubbo, rocketmq等等;
3、netty的核心概念以及核心工作流程是怎样的?
见下面的概念以及执行架构;
Netty的概念
- Channel
- EventLoop
- EventLoopGroup
- Selector
- ChannelHandler
Netty执行架构
摘自:http://www.52im.net/thread-2043-1-1.html
当前疑问
1、Netty的Reactor多线程模型,落地是怎么落地的,是怎么设计的,有啥可以借鉴的;
eventLoop 就是Reactor,BossEventLoop就是主reactor,NioEventLoop就是从reactor;
EventLoop就是IO多路复用,进行多路复用的那个线程;
2、dubbo又是怎么使用Netty的;
从包可以看到,dubbo集成netty基本上就很少代码,就是server,然后一个编码解码,然后是一个handler进行适配,将netty的事件为dubbo的事件,然后交给dubbo的handler进行处理
上层集成的时候,也使用了扩展点Transporter,然后指定了Transporter的具体实现为netty,才会触发nettyServer的流程。
一些扩展
1、CPU密集型 和 IO密集型的线程设置;
以前一直不知道怎样的才是cpu密集型,现在知道了,netty, redis等都是,看netty的现场,直接是绑定cpu核心数 + 1;redis也是类似。
2、netty的模式真的相比阻塞的模式能提高性能么?(在IO密集型应用上)因为IO密集型应用最终还是会把工作交给工作线程,工作线程最终还是会阻塞的?