博客
关于我
Netty源码—3.Reactor线程模型四
阅读量:790 次
发布时间:2023-02-15

本文共 2375 字,大约阅读时间需要 7 分钟。

NioEventLoop和Reactor线程模型深度解析

5. NioEventLoop的执行总体框架

NioEventLoop是Netty中核心的异步事件循环框架,主要负责处理网络IO事件和异步任务。其执行流程分为三个主要阶段:事件检测、事件处理和任务执行。

6. Reactor线程执行一次事件轮询

Reactor线程通过NioEventLoop的run()方法每进行一次事件轮询,首先会调用select()方法尝试检测出IO事件。然后,processSelectedKeys()方法会处理发现的IO事件,主要包括新连接接入事件和连接数据读写事件。最后,runAllTasks()方法会执行任务队列中的异步任务,包括普通任务和定时任务。

7. Reactor线程处理产生IO事件的Channel

每个Channel都绑定一个唯一的NioEventLoop。Reactor线程通过Channel处理IO事件时,会触发相应的读写事件,并将这些事件处理结果传递给Channel的上下文。

8. Reactor线程处理任务队列之添加任务

Reactor线程中的任务队列分为两种类型:普通任务队列(MpscQueue)和定时任务队列(PriorityQueue)。普通任务通过addTask()方法添加到MpscQueue中,而定时任务则通过schedule()方法添加到PriorityQueue中。

(1)Reactor线程执行一次事件轮询的过程

Reactor线程执行事件轮询时,首先检测是否有新的IO事件发生。如果有,则立即停止事件检测,开始处理这些事件。事件处理完成后,Reactor线程会执行任务队列中的异步任务。

(2)任务的分类和添加说明

任务分为普通任务和定时任务。普通任务通过execute()方法添加到MpscQueue中,而定时任务则通过schedule()方法添加到PriorityQueue中。普通任务和定时任务的添加均通过相应的队列实现,确保线程安全和高效执行。

(3)普通任务的添加

普通任务的添加通常通过execute()方法实现。无论是内部线程还是外部线程调用NioEventLoop的execute()方法,都会将任务添加到对应的MpscQueue中。Netty通过MpscQueue实现了异步任务的聚集和批量执行。

(4)定时任务的添加

定时任务的添加通过schedule()方法实现。该方法会将定时任务添加到PriorityQueue中,并根据截止时间进行排列。PriorityQueue的特性确保了定时任务按截止时间优先执行。

(5)Netty的定时任务机制补充

定时任务在Netty中有三种执行方式:一次性任务(schedule()),固定频率任务(scheduleAtFixedRate())和固定延迟任务(scheduleWithFixedDelay())。每种方式都通过调整任务的截止时间来实现定时执行,确保任务按时处理。

9. Reactor线程处理任务队列之执行任务

Reactor线程执行任务时,首先会将定时任务转移到MpscQueue中,然后逐个执行任务。执行过程中,每隔64个任务会检查一次截止时间,避免长时间阻塞。Netty通过这种方式实现了高效的任务执行和性能优化。

(1)runAllTasks()方法需要传入超时时间

runAllTasks()方法需要传入超时时间参数,确保在指定时间内完成任务执行。这种机制避免了长时间运行任务对IO事件检测的影响。

(2)Reactor线程执行任务的步骤
  • 任务聚合:将定时任务转移到MpscQueue中。
  • 时间计算:计算本轮任务执行的截止时间,填充所有已到期的定时任务。
  • 任务执行:逐个执行任务,并每隔64次任务执行检查截止时间。
  • (3)Netty性能优化之批量策略

    Netty采用每隔64个任务检查截止时间的批量策略,避免频繁的时间计算对性能的影响。这种方式在高负载场景下显著提升了执行效率。

    (4)NioEventLoop.run()方法执行任务总结

    NioEventLoop执行任务时,首先处理IO事件,然后执行异步任务。普通任务和定时任务均存储在MpscQueue中,定时任务在转移后按截止时间排列。Netty通过这种方式确保了任务执行的高效性和高可靠性。

    10. NioEventLoop总结

    (1)NioEventLoop的执行流程总结

    NioEventLoop的执行流程包括:

  • 事件检测:通过select()方法检测IO事件。
  • 事件处理:处理发现的IO事件。
  • 任务执行:执行异步任务,包括普通任务和定时任务。
  • (2)Reactor线程模型总结

    Reactor线程模型具有以下特点:

  • 懒启动:NioEventLoopGroup创建时默认懒启动,bossNioEventLoop在服务启动时启动,workerNioEventLoop在新连接接入时启动。
  • 线程绑定:每个连接绑定一个NioEventLoop,确保线程安全。
  • 任务处理:统一处理网络IO事件和异步任务,提升线程模型的简洁性。
  • (3)NioEventLoop创建启动执行的总结
  • 群组创建:用户创建NioEventLoopGroup时,默认创建两倍CPU核数个NioEventLoop。
  • 线程选择器:NioEventLoopGroup内部有线程选择器优化线程分配。
  • 任务队列:每个NioEventLoop创建一个MpscQueue和一个Selector,确保高效执行和线程安全。
  • 通过对NioEventLoop和Reactor线程模型的深入理解,可以看出其在Netty中的重要作用。NioEventLoop不仅处理网络IO事件,还统一管理异步任务执行,确保高效、线程安全的网络通信。

    转载地址:http://dvcfk.baihongyu.com/

    你可能感兴趣的文章
    N-Gram的基本原理
    查看>>
    n1 c语言程序,全国青少年软件编程等级考试C语言经典程序题10道七
    查看>>
    nacos config
    查看>>
    Nacos Derby 远程命令执行漏洞(QVD-2024-26473)
    查看>>
    Nacos 与 Eureka、Zookeeper 和 Consul 等其他注册中心的区别
    查看>>
    Nacos2.X 配置中心源码分析:客户端如何拉取配置、服务端配置发布客户端监听机制
    查看>>
    NacosClient客户端搭建,微服务注册进nacos
    查看>>
    Nacos做注册中心使用
    查看>>
    Nacos原理
    查看>>
    Nacos发布0.5.0版本,轻松玩转动态 DNS 服务
    查看>>
    Nacos启动异常
    查看>>
    Nacos和Zookeeper对比
    查看>>
    Nacos在双击startup.cmd启动时提示:Unable to start embedded Tomcat
    查看>>
    Nacos如何实现Raft算法与Raft协议原理详解
    查看>>
    Nacos安装教程(非常详细)从零基础入门到精通,看完这一篇就够了
    查看>>
    Nacos实战攻略:从入门到精通,全面掌握服务治理与配置管理!(下)
    查看>>
    Nacos心跳机制实现快速上下线
    查看>>
    Nacos服务注册与发现demo
    查看>>
    Nacos服务注册总流程(源码分析)
    查看>>
    nacos服务注册流程
    查看>>