netty 常见疑问 faq

1 netty如何支持主从reactor模式?

2.为什么说netty的main reactor大多并不能用到一个线程组,只能线程组里面的一个?

3.netty给channel分配NioEventloop的规则是什么?

4.通用模式的nio实现多路复用是怎么跨平台的?

5 下面是否有bug
在这里插入图片描述

  private static final class GenericEventExecutorChooser implements EventExecutorChooser {
        private final AtomicInteger idx = new AtomicInteger();
        private final EventExecutor[] executors;

        GenericEventExecutorChooser(EventExecutor[] executors) {
            this.executors = executors;
        }

        @Override
        public EventExecutor next() {
            //递增、取模,取正值,不然可能是负数,另外:有个非常小的缺点,当idx累加成最大值后,有短暂的不公平:
            //1,2,3,4,5,6,7,0,7(注意这里不是1,而是7,然而往前的第二个也是7,所以不够公平),6,5
            return executors[Math.abs(idx.getAndIncrement() % executors.length)];
        }
    }

return executors[Math.abs(idx.getAndIncrement() % executors.length)]; 这一行是否有bug
引用网友的计算。我还没有去深入研究,大家感兴趣可以去debug

&2的幂次方,主要是为了公平性与性能,性能就是直接操作位,公平如下:
假设线程池大小是7
那么第一次调用: 0 & (7-1)
0000 0000
0000 0110
返回 executor[0]

第二次调用: 1 & (7-1)
0000 0001
0000 0110 返回 executor[0]

第三次: executor[2] 第四次: executor[2] 第五次: executor[4] 第六次: executor[4]
很明显有问题,只有在&上二进制表示都为1的情况下,也就是2的幂次方-1,才会公平,但是为什么不直接&
length,假设length为2的幂次方-1,因为下标越界了额😄,比如长度为7,第8次调用,那就是 0000 0111 0000
0111 结果就是7,但是线程池总数为7 ,executor[7]就会越界

7 能解释一下NioEventLoop的含义吗?不是很明白,是不是发生的事件?
回答:你反过来看,就懂了,loop nio event,它的功能是轮训事件的,然后处理事件.别人也注册事件,而核心是因为它有一个selector。

8 对于netty的一些组件不是很了解。比如channel、eventloop与eventloopgroup的关系,又来个selector,感觉很混乱.
回复: 因为默认有一点了解的,所以很多细节一带而过了。这里补充说明下:
channel: 也就是连接;
eventloop:为连接服务的执行器,说白了,就是一个死循环(loop)轮训、处理channel上发生的事件(event)。一个channel只会绑定到一个eventloop,但是一个eventloop一般服务于多个channel.
eventloopgroup: 假设就一个eventloop服务于所有channel,肯定会有瓶颈,所以搞一个组,相当于多线程了。

9 pipeline 是什么?
**回答:**这里可以简单说说:pipeline其实就像工厂的生产线,上面有很多道工序(channel handler),然后这个产线的开始就是接受到的原始数据,最终把产品加工,处理完,打包出去就结束了,本身还是很简单的,扩展性就在于这些工序可以随意定制,我们基于netty开发实际上就是写这些工序,然后有序组织起来。
10 server 绑定多个端口的情况,是不是就用到 bossGroup 多个线程了?
回复: 你说的太对了!hadoop的web hdfs http服务器就绑定了两个端口

问题:比如说我一个bossgroup有8个线程, 在启动过程中, 初始化了8个NioEventGroup作为executor, 注册serversocketchannel的时候采用power(2)方式选择了其中1个, 然后绑定了serversocketchannel, 问题是其他7个NioEventGroup是不是没有用?如果有用,用来干嘛.
回复: 是的,没有用,判断有没有用的标准,就是看绑定的端口多少,像服务器,一般都绑定一个地址启动,比如8080,所以其他的的用不到,但是你绑定2个端口起启动就会用到了,比如一个绑定8080,一个绑定443.

几个问题
1.pipeline这块有点不太明白?为什么直接定位到head?
2.active 状态是不是做为channel bind地址和端口完成的一种状态?
3.selectionKey.interestOps(interestOps | readInterestOp); 这段代码代表了 注册OP_ACTIVE吗?并没有看到标识别啊
4.readInterestOp 这个字段为16是什么意思?
回复:
1 因为所有的pipeline都是以head开始,以tail结束。所以演示的时候,我知道核心逻辑在head中,所以为了节省跳转时间,直接定位到最后了。
2 是的,启动后,就active了。
3 没有OP_ACTIVE,注册的是readInterestOp,如果是ServerSocketChannel,就是指OP_ACCEPT,也就是16.
4 16代表accept,表示开始监听连接请求的事件了。

文章我都看完了,想问下如果您是面试官 会问netty的什么知识呢
回复: 可能会问以下一些问题
1 有没有看过netty源码?
2 reactor模式? 主从reactor的主从怎么区分的?
3 tcp传输的一些知识,例如netty怎么处理粘包和半包问题的;
4 有没有用netty做过什么项目?中间遇到什么问题?怎么解决的
等等吧,肯定不会问太细节的,意义不大,我自己也都记不住。哈哈

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值