Netty架构剖析

2023-11-15

1.Netty逻辑架构

Netty采用了典型的三层网络架构进行设计和开发。

在这里插入图片描述

  1. Reactor通信调度层
    1、它由一系列辅助类完成,包括Reactor线程NioEventLoop及其父类,NioSocketChannel/NioServerSocketChannel及其父类,Byteuffer及其由其衍生出来的各种Buffer,Unsafe及其其衍生出的各种内部类等。该层的主要职责就是监听网络的读写和连接操作,负责将网络层的数据读取到内存缓冲区中,然后触发各种网络事件,将这些事件Pipeline管理的职责链来进行后续的处理。
  2. 职责链ChannelPipeline
    1、它负责事件在职责链中的有序传播,同时负责动态地编排职责链。职责链可以选择监听和处理自己关心的事件,它可以拦截处理和向后/向前传播事件。上层业务则只需要关心处理业务逻辑即可,不需要感知底层的协议差异和线程模型差异,实现了架构层面的分层隔离。
  3. 业务逻辑编排层
    1、业务逻辑编排层通常由2类:一类是纯粹的业务逻辑编排,还有一类是其他的应用层协议插件,用于特定协议相关的会话和链路管理。

2.关键架构质量属性

  1. 高性能:
    (1)采用异步非阻塞的IO类库,基于Reactor模式实现,解决了传统同步阻塞IO模式下一个服务端无法平滑地处理线性增长的客户端的问题。
    (2)TCP接收和发送缓冲区使用直接内存代替堆内存,避免了内存复制,提升了IO读取和写入的性能
    (3)支持通过内存池的方式循环利用ByteBuf,避免了频繁创建和销毁ByteBuf带来的性能消耗
    (4)可配置的IO线程数、TCP参数等,为不同的用户场景提供定制化的调优参数。
    (5)采用环形数组缓冲区实现无锁化并发编程,代替传统的线程安全容器或锁。
    首先对环形缓冲区做下说明:
    1. 环形缓冲区使用改进的数组版本,缓冲区容量为2的幂
    2. 缓冲区满阻塞生产者,消费者进行消费后,缓冲区又有可用资源,由消费者唤醒生产者
    3. 缓冲区空阻塞消费者,生产者进程生产后,缓冲区又有可用资源,由生产者唤醒消费者
      (6)合理地使用线程安全容器、原子类等,提升系统的并发处理能力。
      (7)关键资源的处理使用单线程串行化的方式,避免多线程并发访问带来的锁竞争和额外的CPU消耗
      (8)通过引用计数器及时地申请释放不再被引用的对象,细粒度的内存管理降低了GC的频率,减少了频繁GC带来的时延增大和CPU损耗。
  2. 可靠性:
    (1)链路有效性检测:心跳检测机制
    (2)内存保护机制:
    1、通过对象引用计数器对Netty的ByteBuf等内置对象进行细粒度的内存申请和释放,对非法的对象引用进行检测和保护
    2、通过内存池来重用ByteBuf,节省内存
    3、可设置的内存容量上限
    4、ByteBuf的解码保护,防止非法码流导致内存溢出
    (3)优雅停机
    1、指的是系统退出时,JVM通过注册的Shutdown Hook拦截到退出信号量,然后执行退出操作,释放相关模块的资源占有,将缓冲区的消息处理完成或者清空,将待刷新的数据持久化到磁盘或数据库中,等到资源回收和缓冲区消息处理完成之后,再退出。
    2、往往需要设置最大超时时间T,如果达到T后系统仍没有退出,则通过Kill -9 pid强杀进程。
  3. 可定制性
    (1)责任链模式,便于业务逻辑的拦截、定制和扩展。
    (2)基于接口的开发:关键的类库提供了接口或抽象类,如果Netty自身的实现无法满足用户的需求,可以由用户自定义实现相关接口。
    (3)提供了大量工厂类,通过重载这些工厂类可以按需创建出用户实现的对象。
    (4)提供了大量的系统参数供用户按需设置,增强系统的场景定制性。
  4. 可扩展性
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Netty架构剖析 的相关文章

随机推荐

  • 3S基础知识:VC6.0+MapX编程总结

    一 MapX的帮助 MapX的官方帮助文档是 MapX在线帮助 个人认为 这套文档过于简单 系统性偏差 与ArcEngine的帮助文档不可比 很多MapX的开发技巧在 MapX在线帮助 中查找不到 只能在互联网上搜索 本文试图从一个程序员的
  • 1V转5V芯片,三个元件即可组成完整的稳压方案

    1V低电压要转成5V的电压 需要1V转5V的芯片 由于1V输入 所以不需要指望能输出多大的电流 压差和1V的供电电压意味着供电电流也是无法做大的了 一般1V转5V的输出电流在0MA 100mA 一般60MA应用多 1V转5V电路的BOM物料
  • [LeetCode]202. Happy Number(判断正整数是不是Happy Number)

    202 Happy Number 原题链接 Write an algorithm to determine if a number is happy A happy number is a number defined by the fol
  • java.lang.Integer线程安全吗?

    java lang Integer线程安全 因为 private final int value 不可变
  • SQL实战5——统计活跃间隔对用户分级结果

    现有用户行为日志表tb user log 问题 统计活跃间隔对用户分级后 各活跃等级用户占比 结果保留两位小数 且按占比降序排序 注 用户等级标准简化为 忠实用户 近7天活跃过且非新晋用户 新晋用户 近7天新增 沉睡用户 近7天未活跃但更早
  • 华为机试HJ11 数字颠倒

    HJ11 数字颠倒 Python 题目 解题思路 代码 结果 题目 解题思路 1 输入 转字符串 倒序输出即可 python可以很取巧 代码 print input 1 结果
  • 使用Python批量转换彩色图片到灰度图片

    当涉及到图像处理和计算机视觉时 有时需要将彩色图片转换为灰度图片 一张一张使用PS等工具转换十分复杂且没有必要 今天介绍的这种方法用到了Pillow库 使用Pillow库来打开 加载并转换彩色图像 并将图像储存在另一个文件夹里 具体步骤如下
  • [春秋杯2023]Misc sudo(记CVE-2023-22809)

    对我来说还是有点难了 web方向的phpstudy那道题 不知道为什么 xss就是打不进去 第二道python反序列化还没有理解 所以就先发一道misc MISC sudo 记CVE 2023 22809 一 漏洞范围 sudo 1 8 0
  • 3.动态库的动态加载、错误处理、GDB调试

    库文件 代码的仓库 当运行a out时 a out是链接动态库的 于是a out和动态库都需要加载到物理内存中 但是 a out可能运行十分钟 但是需要用到的动态库却只需要使用1分钟 则资源浪费 所以引入动态加载的概念 当需要用动态库的时候
  • OceanBase介绍

    OceanBase是什么 OceanBase是一个支持海量数据的高性能数据库系统 实现了数千亿条记录 数百TB数据上的跨行跨表事务 由淘宝核心系统研发部 运维 DBA 广告 应用研发等部门共同完成 OceanBase解决什么问题 许多公司的
  • 编译驱动时报错:./arch/x86/include/asm/atomic64_64.h: At top level:

    在编译6ULL驱动的时候程序报错 base c 4 arch x86 include asm atomic64 64 h At top level arch x86 include asm atomic64 64 h 31 33 error
  • Java里的锁

    前言 锁 最初是人类为了保护自己的财产而发明的一种用钥匙才能开启的装置 防范的是外部人员 正常手段下没有钥匙是不能绕过物理锁的 而在程序世界里 锁的设计则是为了保护数据资源 但并不能防范外部攻击 只能算是内部协作的一个约束 无论内外部 只要
  • Android APK反编译技巧全讲解

    Android APK反编译技巧全讲解 导言 在我们安卓开发当中 我们不仅需要掌握基础的开发技能 也需要掌握软件的安全技能 这样才可以让我们的软件能够成为一款能够真正可以进行发布的软件 同时也可以让自己的核心技术不会被别人所盗取 首先我们应
  • ul li ol 解决去除默认点 和 空白问题 缩进问题

    前面的空白 其实这段空白叫做 缩进 明白是缩进之后 在网上能搜到一堆处理的方法 使用firebug调试了很久 这段空白明明没有对应的样式控制啊 把margin left设置成0px也没用 后来反应过来 原来是缩进 据此搜索到解决办法 直接解
  • 不同平台的C/C++标准库

    1 C C 标准 C C 所涉及到的参与者 根据角色的不同 可以分为以下3类 C C 标准起草者 主要在ISO标准组织 International Organization for Standardization 他们负责对应C C 标准相
  • 元学习MAML算法详解

    Meta learning Meta learning 基本定义 元学习 又称 学习如何学习 就像我们人类学习新知识往往从以往得经验出发而很少从头开始一样 元学习以一种系统得 数据驱动得方式从先前得经验中学习 是一个可用于描述所以基于其他先
  • 【实操案例十一】使用try-except手动捕获异常 实例代码及运行效果图!

    任务一 编写程序输入学员成绩 异常捕获忘了的同学 可以参考这个 Bug的常见类型及异常处理机制 任务一 编写程序输入学员成绩 i int input 请输入学员成绩 if 0 lt i lt 100 print i else raise E
  • 【算法】稳定匹配二(JAVA版)

    详细介绍信息请看第一篇稳定匹配C 版这里不再过多讲述 下文直接贴代码 PiPei java package com dt pipei import java util Scanner public class Pipei public st
  • go+vue——基于gin框架和gorm的web开发实战

    go vue 基于gin框架和gorm的web开发实战 gin框架 视频 资料 笔记 安装Go环境 添加环境变量 可能自动添加好 下载 Go 环境变量 goland 报错 GOROOT is not defined 创建项目 Golang中
  • Netty架构剖析

    1 Netty逻辑架构 Netty采用了典型的三层网络架构进行设计和开发 Reactor通信调度层 1 它由一系列辅助类完成 包括Reactor线程NioEventLoop及其父类 NioSocketChannel NioServerSoc