点击上方蓝字关注我吧!
本篇文章大概3200字,阅读时间大约10分钟
本文概括性的总结了Netty的NioEventLoop组件的事件循环机制设计思想和这种设计的必要性,并且类比到Redis组件,做到举一反三。同时,本篇文章也是对前面线程图像的一个总结。
前面花费了数篇文章,细致的拆解了Netty的线程图像,异步图像和流水线图像,现在做一个小结,即Netty为何要用单线程去做那么多的事情,包括了I/O事件轮询,处理并传播I/O事件,这里就对应到了流水线图像,还有异步任务的抽空执行策略,这里面也包含了定时任务。其实同样的问题可以套用在Redis,要知道Redis的事件循环机制也是单线程的。
我将其原因分了两类,一类是JDK的NIO本身的约束,一类是在设计上需要考虑的因素。
先看第一类,即NIO本身在实现和设计上有一些限制。前面总结过NIO的channel.register(Selector,I/O事件,附加对象)方法,它会给当前Channel注册感兴趣的I/O事件,以及I/O多路复用器等资源,并返回一个SelectionKey对象,这个SelectionKey是Channel和I/O多路复用器已经成功绑定的唯一标记,示意图如下: