【netty基础四】netty与nio

这篇具有很好参考价值的文章主要介绍了【netty基础四】netty与nio。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一. 反应堆

1. 堵塞模型

阻塞I/O在调用InputStream.read()方法时是阻塞的,它会一直等到数据到来(或超时)时才会返回;

同样,在调用ServerSocket.accept()方法时,也会一直阻塞到有客户端连接才会返回,每个客户端连接成功后,服务端都会启动一个线程去处理该客户端的请求。

阻塞I/O的通信模型示意如下图所示。
【netty基础四】netty与nio

阻塞I/O通信模型的两个缺点。

  1. 当客户端多时,会创建大量的处理线程。且每个线程都要占用栈空间和一些CPU时间。(有些请求没有数据就会导致这些栈空间和cpu就会被一直占用ing)
  2. 阻塞可能带来频繁的上下文切换,且大部分上下文切换可能是无意义的。

 
上下文切换

CPU利用时间片轮询来为每个任务都服务一定的时间,然后把当前任务的状态保存下来,继续服务下一个任务。任务的状态保存及再加载叫做线程的上下文切换。

 

2. Java NIO的工作原理

  1. 由一个专门的线程来处理所有的I/O事件,并负责分发。
  2. 事件驱动机制:(不断地轮询判断事件是否到达)事件到的时候触发,而不是同步地去监视事件。
  3. 线程通信:(因为请求而建立的)线程之间通过wait、notify等方式通信(how)。保证每次上下文切换都是有意义的,减少无谓的(时间片进行)线程切换。

【netty基础四】netty与nio

注:每个线程的处理流程大概都是读取数据、解码、计算处理、编码和发送响应。

 

二. Netty与NIO

Netty是一个异步的、事件驱动的、用来做高性能高可靠性的网络应用的框架。下面是其主要的优点。

(1)框架设计优雅,底层模型随意切换,适应不同的网络协议要求。
(2)提供了很多标准的协议、安全、编解码的支持。
(3)解决了很多NIO不易用的问题。
(4)社区更为活跃,在很多开源框架中使用,如Dubbo、RocketMQ、Spark等。

Netty支持的功能与特性如下图所示。
【netty基础四】netty与nio

  1. 底层核心有:Zero-Copy-Capable Buffer,非常易用的零拷贝Buffer(这个内容很有意思,稍后专门来讲)、统一的API、标准可扩展的事件模型。
  2. 传输方面的支持有:管道通信;HTTP隧道;TCP与UDP。
  3. 协议方面的支持有:基于原始文本和二进制的协议;解压缩;大文件传输;流媒体传输;ProtoBuf编解码;安全认证;HTTP和WebSocket。

 
Netty采用NIO而非AIO的理由

  1. Netty不看重Windows上的使用,在Linux系统上,AIO的底层实现仍使用epoll,没有很好地实现AIO,因此在性能上没有明显的优势,而且被JDK封装了一层,不容易深度优化。
  2. Netty整体架构采用Reactor模型,而AIO采用Proactor模型,混在一起会非常混乱,把AIO也改造成Reactor模型,看起来是把Epoll绕个弯又绕回来。
  3. AIO还有个缺点是接收数据需要预先(你需要预估缓存)分配缓存,而NIO是需要接收时才分配缓存,所以对连接数量非常大但流量小的情况,AIO浪费很多内存。
  4. Linux上AIO不够成熟,处理回调结果的速度跟不上处理需求,比如外卖员太少,顾客太多,供不应求,造成处理速度有瓶颈。

 
 

参考:
《Netty4核心原理与手写RPC框架》文章来源地址https://www.toymoban.com/news/detail-495389.html

到了这里,关于【netty基础四】netty与nio的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • 基于多反应堆的高并发服务器【C/C++/Reactor】(中)在TcpConnection 中接收并解析Http请求消息

    基于多反应堆的高并发服务器【C/C++/Reactor】(中)在TcpConnection 中接收并解析Http请求消息

    一、在TcpConnection 中多添加和http协议相关的request和response 二、给客户端回复数据(方法一) 1.在 Buffer.h 文件中添加 bufferSendData 函数:  2.在 TcpConnection.c 文件中添加 processWrite 函数: 3.修改 tcpConnectionInit 函数中调用的 channelInit函数 的写回调函数为 processWrite函数 三、给客户端

    2024年01月23日
    浏览(9)
  • 基于多反应堆的高并发服务器【C/C++/Reactor】(中)在EventLoop中处理被激活的文件描述符的事件

    基于多反应堆的高并发服务器【C/C++/Reactor】(中)在EventLoop中处理被激活的文件描述符的事件

    文件描述符处理与回调函数 一、主要概念 反应堆模型:一种处理系统事件或网络事件的模型,当文件描述符被激活时,可以检测到 文件描述符:在操作系统中,用于标识打开的文件、套接字等的一种数据类型  处理激活的文件描述符的函数:当文件描述符被激活时,需要有

    2024年02月03日
    浏览(14)
  • 【netty基础四】netty与nio

    【netty基础四】netty与nio

    阻塞I/O在调用InputStream.read()方法时是 阻塞的,它会一直等到数据到来 (或超时)时才会返回; 同样,在调用ServerSocket.accept()方法时,也会一直 阻塞到有客户端连接 才会返回,每个客户端连接成功后,服务端都会启动一个线程去处理该客户端的请求。 阻塞I/O的通信模型示意

    2024年02月10日
    浏览(11)
  • 【Netty】Reactor 模型(十)

    【Netty】Reactor 模型(十)

    回顾Netty系列文章: Netty 概述(一) Netty 架构设计(二) Netty Channel 概述(三) Netty ChannelHandler(四) ChannelPipeline源码分析(五) 字节缓冲区 ByteBuf (六)(上) 字节缓冲区 ByteBuf(七)(下) Netty 如何实现零拷贝(八) Netty 程序引导类(九) 说到 NIO、Netty,Reactor模型一

    2024年02月06日
    浏览(5)
  • 11.Netty源码之线程模型

    11.Netty源码之线程模型

    NIO 的类库和 API 繁杂,使用麻烦:需要熟练掌握 Selector、ServerSocketChannel、SocketChannel、ByteBuffer 等。 需要具备其他的额外技能:要熟悉 Java 多线程编程,因为 NIO 编程涉及到 Reactor 模式,你必须对多线程和网络编程非常熟悉,才能编写出高质量的 NIO 程序。 开发工作量和难度都

    2024年02月16日
    浏览(9)
  • netty基础(四)

    ①.Netty服务器在6668端口监听,客户端能发送消息给服务器\\\"hello, 服务器~\\\"; ②.服务器可以回复消息给客户端\\\"hello, 客户端~\\\"; 1.导入 netty 4.1.x 依赖

    2024年02月03日
    浏览(7)
  • netty基础与原理

    netty基础与原理

    设计模式——Reactor模式(反应器模式),是一种基于 事件驱动的设计模式,在事件驱动的应用中,将一个或多个客户的服务请求分离(demultiplex)和调度(dispatch)给应用程序。 同步地处理同时接收的多个服务请求 一般出现在高并发系统中,比如Netty,Redis等。 事件驱动的应

    2024年02月13日
    浏览(8)
  • Netty基础

    Netty基础

    是一个基于异步的(多线程处理结果和接收)、事件驱动的网络应用框架,用于基于快速开发可维护、高性能的网络服务器和客户端 异步是指调用时的异步,他的IO还是多路复用的IO 许多中间件都依赖与Netty zookper hadoop Spring 5.x - flux 抛弃了Tomact 使用netty作为服务器端 Netty优势

    2024年02月03日
    浏览(7)
  • 【Netty专题】【网络编程】从OSI、TCP/IP网络模型开始到BIO、NIO(Netty前置知识)

    【Netty专题】【网络编程】从OSI、TCP/IP网络模型开始到BIO、NIO(Netty前置知识)

    我是有点怕网络编程的,总有点【谈网色变】的感觉。为了让自己不再【谈网色变】,所以我想过系统学习一下,然后再做个笔记这样,加深一下理解。但是真要系统学习,其实还是要花费不少时间的,所以这里也只是简单的,尽可能地覆盖一下,梳理一些我认为比较迫切需

    2024年02月06日
    浏览(10)
  • LowCode 低代码平台集成 AI 大模型会产生怎样的化学反应?

    低代码平台(LowCode Platform)是一种新型的应用开发方式,它将应用开发的过程简化为“拖拽组件、配置属性、生成代码”的方式,使得应用开发变得更加简单和快捷。而AI大模型(AI Big Model)则是一种利用深度学习技术构建的大规模神经网络,它可以对海量数据进行训练和预

    2024年02月15日
    浏览(11)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包