Netty学习内容

java中的几种I/O模型

BIO通信模型

BIO通信模型图

BIO通信模型

网络编程的基本模型是C/S模型,两个进程之间进行通信,需要服务端提供位置信息(绑定的IP和监听端口),客户端通过连接操作向服务端监听的地址发起请求,通过三次握手建立连接。

在同步阻塞的通信模型中,由一个独立的Acceptor线程监听客户端的连接,它接收到客户端的连接请求后就为每个客户端创建一个新的线程进行链路处理,处理完成后通过输出流返回应答给客户端,然后线程销毁。

通过以上模型可以看出,该通信模式最大的弊端在于,当客户端的并发访问量增大时,服务端创建的连接数与客户端的并发请求数为正比关系,线程数过多会消耗jvm的资源,系统性能下降,导致无资源创建新线程、线程堆栈溢出等,最终导致系统无法对外提供服务。

伪异步IO通信模型

为了解决BIO的缺陷,对BIO进行优化产生了伪异步IO模型——后端通过一个线程池来处理多个客户端的请求接入。

image.png

采用线程池和任务队列进行实现伪异步IO通信。
当客户端发起请求时,Acceptor接收请求,但并不是直接进行线程创建,而是交由后面的线程池处理。JDK的线程池维护一个消息队列和N个活跃线程,对消息队列中的任务进行处理。
线程池中的线程数和消息队列的大小可以设置,所以资源可控,不会产生高并发访问时BIO模型耗尽系统资源的情况。

看起来伪异步的线程模型很好,但是仍然没有实质性解决同步IO导致的线程阻塞问题。
当通信对方返回的应答时间过长会导致以下问题:

  1. 服务端处理缓慢,返回应答消息耗时60s,平时只需要10ms;
  2. 才以哦那个伪异步IO的线程正在读取故障服务节点的响应,由于读取输入流是阻塞的,所以踏会被同步阻塞60s;
  3. 假如所有的可用线程都被故障服务器阻塞,那后续的IO消息都在队列中排队;
  4. 由于线程池采用阻塞队列实现,队列满时,后续入队列的操作都将被阻塞;
  5. 由于前端只有一个Acceptor线程接收客户端的请求,它被阻塞在线程池的同步阻塞队列之后,新的客户端请求都将无法响应,客户端后发生大量连接超时;
  6. 由于所有的连接都超时,调用者会认为系统崩溃,无法接收新的请求。

NIO通信模型

  1. 缓冲区 buffer
    传统IO面向流,可以将数据直接写入或者读取到stream对象中。
    在NIO中,所有数据都在缓冲区中进行处理。
  2. 通道channel
    channel是通道,网络数据通过channel进行读取和写入。通道与流的区别在于,流是单向的,通道是双向的,全双工的。
  3. 多路复用器selector
    selector会不断轮询注册在其上的channel,如果某个channel上发生读写事件,这个channel就处于就绪状态,会被selector轮询出来,然后通过selectionkey 可以获取就绪的channel的集合,进行后续的IO操作。
    一个selector可以同时轮询多个channel,并且jdk处采用了epoll()代替传统的selector实现,所以没有最大连接句柄的限制。也就意味着,理论上,一个线程负责selector的轮询,就可以接入成千上万的客户端。

NIO服务端序列图

image.png

NIO客户端序列图

image.png

Netty线程模型

  1. Reactor单线程模型
    Reactor单线程模型是指所有的IO操作均在一个NIO线程上处理。
image.png

由于Reactor模式使用的是异步非阻塞IO,所以理论上所有的IO操作都不会造成阻塞,一个线程可以处理所有的IO操作。
Acceptor接收客户端请求,连接创建后,由dispatcher分发到各个handler上进行处理,处理完后通过NIO线程返回给客户端。

  1. Reactor多线程模型
    与单线程模型最大的区别在于有一组NIO线程处理IO操作。
image.png

有一个专门的NIO线程——Acceptor负责监听服务端,接收客户端的TCP连接请求。

网络IO操作由一个NIO线程池负责,线程池包含一个任务队列和N个可用的线程,由这些NIO线程负责消息的读取、解码、编码、发送。

一个NIO线程可以同时处理N条链路。

  1. 主从Reactor模型
image.png

主从Reactor模型的特点是服务端接收客户端连接的不是一个NIO线程,而是一个独立的NIO线程池。Acceptor接收到客户端的TCP连接请求并处理完成后将新创建的channel注册到IO线程池的一个IO线程上,由它负责channel的读写和编码、解码工作。Acceptor线程池仅仅用于客户端的登录、握手和安全认证,一旦链路创建成功就将链路注册到后端线程池的IO线程上,由后端线程负责后续的操作。

总结:通过以上几种通信模型的分析可以看出,影响IO通信的性能有三个要素:IO模型、协议、线程。
Netty的多线程其实很类似于伪异步IO的解决方案,在Acceptor上做文章,将一个线程变为一个线程池。
主从reactor模型也就是在后台处理上采用了线程池的方式

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,843评论 6 502
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,538评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,187评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,264评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,289评论 6 390
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,231评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,116评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,945评论 0 275
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,367评论 1 313
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,581评论 2 333
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,754评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,458评论 5 344
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,068评论 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,692评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,842评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,797评论 2 369
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,654评论 2 354

推荐阅读更多精彩内容

  • 1、Netty基础入门 Netty是由JBOSS提供的一个java开源框架。Netty提供异步的、事件驱动的网络应...
    我是嘻哈大哥阅读 4,690评论 0 31
  • NIO(Non-blocking I/O,在Java领域,也称为New I/O),是一种同步非阻塞的I/O模型,也...
    闪电是只猫阅读 3,109评论 0 7
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,652评论 18 139
  • 一、Netty框架简介 (本文中部分图片摘自Netty-In-Depth)Netty是一款以异步事件为驱动的网络开...
    WuRichard阅读 13,817评论 2 15
  • 前奏 https://tech.meituan.com/2016/11/04/nio.html 综述 netty通...
    jiangmo阅读 5,855评论 0 13