Netty源码死磕一(netty线程模型及EventLoop机制)
引言
好久没有写博客了,近期准备把Netty源码啃一遍。在这之前本想直接看源码,但是看到后面发现其实效率不高,
有些概念还是有必要回头再细啃的,特别是其线程模型以及EventLoop的概念。
当然在开始之前还是有务必要对IO模型要有清晰准确的认识。 传送门
事件循环机制(EventLoop)
Netty线程模型中一个非常重要的概念: 事件循环机制(EventLoop)
这个概念在JS上体现的也非常淋漓尽致,下面在开始介绍netty的线程模型之前,允许我简单的介绍下事件循环机
制在JS中的体现
JS的语言性质: 单线程非阻塞,单线程意味着,js代码在执行的任何时候,都只有一个主线程来处理所有的任务>。非阻塞则意味着,在进行异步IO任务时不会阻塞主线程,主线程会挂起这个任务,等待异步任务完成再执行对应>的回调。
那么JS是如何实现单线程非阻塞的呢?JS引擎遇到一个异步事件后并不会一直等待其返回结果,而是会将此事件>挂起(例如交给浏览器去执行请求),主线程会继续执行方法栈中的其他任务。之后当异步任务返回结果后,(可>能是浏览器?)会将回调函数加入到事件队列(Task Queue)中,那么什么时候会从事件队列中取出回调函数执行>呢?当前执行栈中的所有任务都执行完毕,主线程处于闲置状态时会去查找事件队列是否有任务待执行,如果有则>将回调函数加入到主线程的方法执行栈中执行,如此反复,我们就把这个循环过程称为事件循环机制(EventLoop)。
不知道介绍了JS的件循环机制,大家有没有对Event Loop有了一个初步的认识,下面我将会着重介绍我们主角Netty的线程模型及其与Event Loop的联系。
Netty线程模型
Netty的线程模型基于Reactor,Reactor的核心在于事件分发,它有三种经典的线程模型(单线程模型,多线程>模型,主从多线程模型),下面我们会结合Netty的EventLoop机制一一介绍
Reactor单线程模型
单线程模型全局只有一个线程在工作,也就意味着请求的接收,分发,IO读取写入等操作都在一个线程中完成,该>模型算得上是最经典的线程模型了,例如redis也是采用的此种单线程模型了。

可以看到上图中,我们把一个Reactor线程可以认为是一个EventLoop IO线程,一个事件循环机制。
由于其线程中的IO读写都是基于NIO,理论上所有的IO读写操作都不会阻塞EventLoop线程。所以即使是该单线程>模型,也是足以应付绝大多数的场景。
那么为什么又会延伸出Reactor多线程模型呢?
当应用并发量非常大时,例如一个Reactor NIO 线程需要同时处理成百上千的连接时,虽然IO读写是非阻塞的,>但是消息的编码解码都是需要同步阻塞的,这就导致NIO线程处理速度变慢,最终导致消息积压,出现性能瓶颈。
基于以上原因也就演进出了第二种模型Reactor多线程模型
Reactor多线程模型
Reactor多线程模型与Reactor单线程模型最大的区别就是,有一组Reactor NIO线程(也就是一组 EventLoop)来处理IO操作

通过上图,可以比较清晰的看到,IO的读写操作都由一个Reactor NIO线程池(对应到EventLoop也就是EventLoopGroup)来完成的,而请求的监听和Accept则是由另一个单独的Reactor线程来完成。
注意Reactor NIO线程池中的每一个线程都是处理N条链路,但是一个链路只能有一个线程来处理
多线程的Reactor模型可以满足绝大部分的应用场景,通常情况下,我们使用Netty使用这种线程模型就OK(创建>两个NioEventLoopGroup,bossGroup大小为1,workGroup大小为CPU*2)。但是有可能会存在某些极少数的情况,一
个Reactor线程处理请求的Accept可能会产生性能瓶颈,例如上百万的并发连接请求。这时候我们可能就需要采
用第三种模型Reactor主从多线程模型
Reactor主从多线程模型
Reactor主从多线程模型和Reactor多线程模型的区别在于原本是一个Reactor线程处理请求的Accept,变成了
一组Reactor线程。

对于Reactor主从多线程模型,其实大多数情况下我们并不需要。即使我们给BossGroup指定了多个线程,最终也>只会选择其中的一个作为Accepor的NIO线程,除非在服务端绑定了多个端口的情况下才会启用BossGroup的多个线
程。
尾言
把Netty的线程模型以及EventLoop理解清楚,个人觉得最好的方法还是顺着Netty的源码一步一步看,看多了
也就理解了这几种线程模型分别对应了哪几种情况,后面的文章我应该会根据源码来进一步理解netty
Netty源码死磕一(netty线程模型及EventLoop机制)的更多相关文章
- EventLoop(netty源码死磕4)
精进篇:netty源码 死磕4-EventLoop的鬼斧神工 目录 1. EventLoop的鬼斧神工 2. 初识 EventLoop 3. Reactor模式回顾 3.1. Reactor模式的组 ...
- JAVA NIO 简介 (netty源码死磕1.1)
[基础篇]netty 源码死磕1.1: JAVA NIO简介 1. JAVA NIO简介 Java 中 New I/O类库 是由 Java 1.4 引进的异步 IO.由于之前老的I/O类库是阻塞I/ ...
- Java NIO Buffer(netty源码死磕1.2)
[基础篇]netty源码死磕1.2: NIO Buffer 1. Java NIO Buffer Buffer是一个抽象类,位于java.nio包中,主要用作缓冲区.Buffer缓冲区本质上是一块可 ...
- ChannelHandler揭秘(Netty源码死磕5)
精进篇:netty源码死磕5 揭开 ChannelHandler 的神秘面纱 目录 1. 前言 2. Handler在经典Reactor中的角色 3. Handler在Netty中的坐标位置 4. ...
- Pipeline模式(netty源码死磕6)
精进篇:netty源码死磕6 巧夺天工--Pipeline模式揭秘 1. 巧夺天工--Pipeline模式揭秘 1.1. Pipeline模式简介 管道的发名者叫,Malcolm Douglas M ...
- Netty环境搭建 (源码死磕2)
[正文]netty源码 死磕2: 环境搭建 本小节目录 1. Netty为什么火得屌炸天? 1.1. Netty是什么? 1.2. Netty火到什么程度呢? 1.3. Netty为什么这么火? 2 ...
- netty源码分析之揭开reactor线程的面纱(二)
如果你对netty的reactor线程不了解,建议先看下上一篇文章netty源码分析之揭开reactor线程的面纱(一),这里再把reactor中的三个步骤的图贴一下 reactor线程 我们已经了解 ...
- netty源码分析(十八)Netty底层架构系统总结与应用实践
一个EventLoopGroup当中会包含一个或多个EventLoop. 一个EventLoop在它的整个生命周期当中都只会与唯一一个Thread进行绑定. 所有由EventLoop所处理的各种I/O ...
- Netty 源码(一)Netty 组件简介
Netty 源码(一)Netty 组件简介 Netty 系列目录(https://www.cnblogs.com/binarylei/p/10117436.html) 一.Netty 架构 Core: ...
随机推荐
- 挑战全网最幽默的Vuex系列教程:第六讲 Vuex的管理员Module(实战篇)
写在前面 这一讲是 Vuex 基础篇的最后一讲,也是最为复杂的一讲.如果按照官方来的话,对于新手可能有点难以接受,所以想了下,决定干脆多花点时间,用一个简单的例子来讲解,顺便也复习一下之前的知识点. ...
- python机器学习的常用算法
Python机器学习 学习意味着通过学习或经验获得知识或技能.基于此,我们可以定义机器学习(ML)如下 - 它可以被定义为计算机科学领域,更具体地说是人工智能的应用,其为计算机系统提供了学习数据和从经 ...
- What does __GNUC__ mean?
It indicates that I'm a GNU compiler and you can use GNU extensions. https://stackoverflow.com/quest ...
- PL/SQL登录Oracle18数据库:ORA-12154:TNS无法解析指定的连接标识符
PL/SQL登录Oracle18数据库出现ORA-12154:TNS无法解析指定的连接标识符解决以下问题:首先更改Oracle客户端的tnsnames.ora,我的路径是:D:\OracleSQL\n ...
- Python封装应用程序的最佳项目结构是什么?
Python封装应用程序的最佳项目结构是什么? 转载来源于stackoverflow:https://stackoverflow.com/questions/193161/what-is-the-be ...
- Hyperf基础教程
前提说明 本教程适用于新手.老手,也适用于任何操作系统,包括Windows.linux.MacOS 介绍 Hyperf 是基于 Swoole 4.4+ 实现的高性能.高灵活性的 PHP 协程框架,内置 ...
- P1516 青蛙的约会和P2421 [NOI2002]荒岛野人
洛谷 P1516 青蛙的约会 . 算是手推了一次数论题,以前做的都是看题解,虽然这题很水而且还交了5次才过... 求解方程\(x+am\equiv y+an \pmod l\)中,\(a\)的最小整数 ...
- mock-server 之 mock 接口测试
1.mock 介绍 mock 除了用在单元测试过程中,还有一个用途,当前端开发在开发页面的时候,需要服务端提供 API 接口,此时服务端没开发完成,或者说没搭建测试环境,这个时候前端开发会自己 moc ...
- Spring Framework 之AOP
Spring Framework 之AOP 目录 Spring Framework 之AOP 问题 AOP概述 AOP知识 1.连接点(Joinpoint) 2.切点(PointCut) 3.增强(A ...
- 编程坑太多,Map 集合怎么也有这么多坑?一不小心又踩了好几个!
点赞再看,养成习惯,微信搜索『程序通事』,关注就完事了! 点击查看更多历史文章 上一篇 List 踩坑文章中,我们提到几个比较容易踩坑的点.作为 List 集合好兄弟 Map,我们也是天天都在使用,一 ...