美文网首页
Netty学习分享

Netty学习分享

作者: Mahon | 来源:发表于2021-07-01 18:07 被阅读0次

    Netty基本概念 

    Netty是一个高性能、异步事件驱动的NIO框架,它提供了对TCP、UDP和文件传输的支持,作为一个异步NIO框架,Netty的所有IO操作都是异步非阻塞的,通过Future-Listener机制,用户可以方便的主动获取或者通过通知机制获得IO操作结果。

    作为当前最流行的NIO框架,Netty在互联网领域、大数据分布式计算领域、游戏行业、通信行业等获得了广泛的应用,一些业界著名的开源组件也基于Netty的NIO框架构建。如:Dubbo、 RocketMQ、Hadoop的Avro、Spark等。

    官网:https://netty.io/

    业界主要的使用:

    Hadoop Spark

    RocketMQ

    Dubbo gRPC

    ElasticSearch

    大体架构

    Netty为什么性能好

    1、I/O传输模型

    用什么样的通道将数据发送给对方,是BIO、NIO还是AIO,I/O传输模型在很大程度上决定了框架的性能。

    Netty对三种I/O方式的支持

    Not-blocking IO

    即用户需要不断地调用read,尝试读取socket中的数据,直到读取成功后,才继续处理接收的数据。整个IO请求的过程中,虽然用户线程每次发起IO请求后可以立即返回,但是为了等到数据,仍需要不断地轮询、重复请求

    IO多路复用

    通过Reactor的方式,可以将用户线程轮询IO操作状态的工作统一交给handle_events事件循环进行处理。用户线程注册事件处理器之后可以继续执行做其他的工作(异步),而Reactor线程负责调用内核的select函数检查socket状态。当有socket被激活时,则通知相应的用户线程(或执行用户线程的回调函数),执行handle_event进行数据读取、处理的工作。由于select函数是阻塞的,因此多路IO复用模型也被称为异步阻塞IO模型。注意,这里的所说的阻塞是指select函数执行时线程被阻塞,而不是指socket。一般在使用IO多路复用模型时,socket都是设置为NONBLOCK的,不过这并不会产生影响,因为用户发起IO请求时,数据已经到达了,用户线程一定不会被阻塞。

    异步IO

    异步IO模型中,用户线程直接使用内核提供的异步IO API发起read请求,且发起后立即返回,继续执行用户线程代码。不过此时用户线程已经将调用的AsynchronousOperation和CompletionHandler注册到内核,然后操作系统开启独立的内核线程去处理IO操作。当read请求的数据到达时,由内核负责读取socket中的数据,并写入用户指定的缓冲区中。最后内核将read的数据和用户线程注册的CompletionHandler分发给内部Proactor,Proactor将IO完成的信息通知给用户线程(一般通过调用用户线程注册的完成事件处理函数),完成异步IO。

    2、数据协议

    用什么样的通讯协议,是HTTP,还是内部私有协议。协议的选择不同,性能也就不同,一般来说内部私有协议比公有协议的性能更高。

    编解码器

    业界主流的编解码框架:

    Google Protobuf:支持Java、C++、Python三种语言,高效的编码性能,结构化数据存储格式(XML,JSON等)

    Facebook Thrift:适用于静态的数据交换,需要先确定好它的数据结构。结构变化后需要重新编译IDL文件,这也是Thrift的弱项。

    JBoss Marshalling:是一个Java对象的序列化API,修正了JDK自带的序列化包的很多问题,但又保持跟java.io.Serializable接口的兼容。

    Hessian:一个轻量级的remoting onhttp工具,使用简单的方法提供了RMI的功能,采用的是二进制RPC协议。

    TCP粘包/拆包及Netty如何解决

    粘包/拆包问题描述

    解决方式:

    消息定长,例如每个报文的大小为固定长度200字节,如果不够,空位补空格。

    在包尾增加回车换行符进行分割,例如FTP协议。

    将消息分为消息头和消息体,消息头中包含消息长度的字段,通常设计思路为消息头的第一个字段使用int32来表示消息的总长度

    3、线程模型

    线程模型涉及如何读取数据包,读取之后的编解码在哪个线程中进行,编解码后的消息如何派发等方面。线程模型设计不同,对性能也会产生非常大的影响。

    Netty线程模型

    (1)Reactor单线程模型

    (2)Reactor多线程模型

    (3)Reactor主从模型

    Netty的线程模型并不是一成不变,它实际取决于用户的启动参数配置。通过设置不同的启动参数,Netty可以同时支持Reactor单线程模型、多线程模型和主从模型。

    Ref:

    深入探秘 Netty、Kafka 中的零拷贝技术!_石杉的架构笔记-CSDN博客

    IO多路复用机制详解 - Yeang - 博客园

    相关文章

      网友评论

          本文标题:Netty学习分享

          本文链接:https://www.haomeiwen.com/subject/wtfsultx.html