上次讲到事件驱动模式,今天我们来好好分析下netty的事件模式的几个类型。

先从NIO讲起,

JAVA NIO方面Selector给Reactor模式提供了基础,Netty结合Selector和Reactor模式设计了高效的线程模型。

这里有个题外话,reactor英文的含义是什么?我们可以稍微了解下:

美[ri'æktər]英[ri'æktə(r)]
  • n.核反应堆
  • 网络反应器;电抗器;反应者

中文翻译是反应者,在我们这个语境,翻译成反应者或响应者,都是正解。就把它想象成KFC的前台服务员好,她就是一个响应者,也叫reactor.

现在我们来看下Reactor模式图:

如上图所示,所谓的reactor模式,就是我们上篇文章所说的,KFC前后服务员加后台服务员的模式。

前台服务员(同时代表上图的demultiplexer和dispatcher)只负责接待客户的点汉堡的请求和订单分派,做汉堡的活让后台台服务员(代表上图的handler)去做。

做好后,后台再通知前台,由前台转交给客户。

这个很好理解。

好,那我们现在来看看Java NIO的reactor的几个模式:单线程模式,多线程模式,主从模式。

先看单线程模式:

如上图所示,所谓单线程模式,只有一个线程(acceptor)去处理客户的请求,然后,这个线程还要做read,send等工作,相当于是个多面手。

就好像KFC前台后台都只有一个服务员。

这个模式,如果客户只有一个的话,是可以处理。但如果,是用餐高峰期,一下子来了十个客户,那就不好处理了。

怎么办?

很自然,我们可以增加后台服务员,并且因为后台的工作比较多,后台服务员可以多个。这就是多线程模式。

再看多线程模式图:

如上图所示,用线程池(多个服务员)去处理read,decode,compute,encode任务。

就好像,前台一个服务员只负责下订单,然后把订单信息分派给多个后台服务员,同时服务多个客户,速度和效率也明显好很多,客户也不用等待太久。

那如果,这个时间来了几十个客户,如果只有一个前台服务员,这时,也处理不过来,怎么办?

很自然,增加前台服务员的数量。当然我们也不需要增加太多(毕竟有人力成本),现在我们只增加一位好了。

两位服务员,一主一从,我们就叫主从模式。

我们来看主从模式图:

如上图,将Reactor分成两部分,mainReactor负责监听server socket,accept新连接;并将建立的socket分派给subReactor。subReactor负责多路分离已连接的socket,读写网络数据,对业务处理功能,其扔给worker线程池完成。通常,subReactor个数上可与CPU个数等同。

还是用KFC的例子来说明,其中mainReactor是服务员小黄,她只负责下订单。subReactor就是服务员小张,他呢,只服务根据订单信息分派给后台服务员,并负责把汉堡和饮料放在托盘递给客户。

以上就是reactor模式说明,希望你已经明白了!

说完了Reactor的三种模型,那么Netty是哪一种呢?其实Netty的线程模型是Reactor模型的变种,那就是去掉线程池的第三种形式的变种,这也是Netty NIO的默认模式。Netty中Reactor模式的参与者主要有下面一些组件:

Selector
    EventLoopGroup/EventLoop
    ChannelPipeline

Selector即为NIO中提供的SelectableChannel多路复用器,充当着demultiplexer的角色,就像专门下订单的前台服务员。
ChannelPipeline负责安排Handler的顺序及其执行。因为后台工作多且杂,需要一个后台管理员负责管理和编排后台服务员的工作。这个后台管理员就是ChannelPipeline。

EventLoop的目的是为Channel处理IO操作,一个EventLoop可以为多个Channel服务。EventLoop就是后台服务员,一个后台服务员可以同时做几份汉堡。

EventLoopGroup会包含多个EventLoop。EventLoopGroup就是后台服务员的班组,几个后台服务员一个班组,一个班组固定处理一个固定 的后台工作。

明天继续。

s

java高并发实战Netty+协程(Fiber)|系列1(续)|事件驱动模式和零拷贝的更多相关文章

  1. java高并发实战Netty+协程(Fiber)|系列1|事件驱动模式和零拷贝

    今天开始写一些高并发实战系列. 本系列主要讲两大主流框架: Netty和Quasar(java纤程库) 先介绍netty吧,netty是业界比较成熟的高性能异步NIO框架. 简单来说,它就是对NIO2 ...

  2. 用Swoole4 打造高并发的PHP协程Mysql连接池

    码云代码仓库:https://gitee.com/tanjiajun/MysqlPool 代码仓库:https://github.com/asbectJ/swoole4.git 前言 在写这篇文章之前 ...

  3. Java高并发实战,锁的优化

    锁优化 这里的锁优化主要是指 JVM 对 synchronized 的优化. 自旋锁 互斥同步进入阻塞状态的开销都很大,应该尽量避免.在许多应用中,共享数据的锁定状态只会持续很短的一段时间.自旋锁的思 ...

  4. java高并发实战(三)——Java内存模型和线程安全

    转自:https://blog.csdn.net/gududedabai/article/details/80816488

  5. java高并发实战(二)——线程(并行程序)基础

    转自:https://blog.csdn.net/gududedabai/article/details/80815666

  6. java高并发实战(一)——为什么需要并发

    转自:https://blog.csdn.net/gududedabai/article/details/80813592

  7. 从菜鸟到大神:Java高并发核心编程(连载视频)

    任何事情是有套路的,学习是如此, Java的学习,更是如此. 本文,为大家揭示 Java学习的套路 背景 Java高并发.分布式的中间件非常多,网上也有很多组件的源码视频.原理视频,汗牛塞屋了. 作为 ...

  8. 高级java高并发,高性能,分布式,高可用,负载均衡,系统架构实战

    java架构师.集群.高可用.高可扩 展.高性能.高并发.性能优化.Spring boot.Redis.ActiveMQ.Nginx.Mycat.Netty.Jvm大型分布 式项目实战 视频课程包含: ...

  9. Netty Redis 亿级流量 高并发 实战 (长文 修正版)

    目录 疯狂创客圈 Java 分布式聊天室[ 亿级流量]实战系列之 -30[ 博客园 总入口 ] 写在前面 1.1. 快速的能力提升,巨大的应用价值 1.1.1. 飞速提升能力,并且满足实际开发要求 1 ...

随机推荐

  1. http协议详解1

    一.http协议url组成部分详解:1.协议类型2.ip(服务器地址)3.port(或域名)4.path(请求资源所在地址)5.?(资源地址与参数的分割符合)6.参数(请求参数)7.&(多个参 ...

  2. CPU性能监测介绍

    CPU的性能监测包含以下部分: * 检查系统运行队列并确保每个核心上不超过3个可运行进程* 确保CPU利用率的用户时间和系统时间在70/30之间* 当CPU花费更多的时间在system mode上时, ...

  3. Dart学习笔记-循环

    1.for循环 main() { // for循环 ; i < ; i++) { print(i); // 0,1,2,3,4,5,6,7,8,9 } } 2.while循环 main() { ...

  4. Several ports (8005, 8080, 8009) required by Tomcat v8.5 Server at localhost are already in use.

    Several ports (8005, 8080, 8009) required by Tomcat v8.5 Server at localhost are already in use. The ...

  5. The system has no LUN copy license

    [问题描述] ipsan作为cinder后端的时候,通过快照创建磁盘失败,报以下错误: { u 'data': {}, u 'error': { u 'code': 1077950181, u 'de ...

  6. 软考题型—PERT图(项目计划评审技术)

    经历过软件危机和大量软件项目的失败,人们对软件工程产业现状进行分析后,得出普遍性结论便是:软件项目成功率低的原因很可能就是项目管理能力太弱.由于软件本身的特殊性和复杂性,将项目管理思想引入软件工程领域 ...

  7. shell简单脚本#1

    判断/etc/inittab文件是否大于100行,如果大于,则显示”/etc/inittab is a big file.”否者显示”/etc/inittab is a small file.” #! ...

  8. Maven出错的问题处理

    1:使用Maven部署dubbox.jar包到maven本地仓库 由于Dubbox的jar包并没有部署到Maven的中央仓库中,大家在Maven的中央仓库中可以查找到Dubbo的最终版本是2.5.3 ...

  9. vue单页(spa)前端git工程拆分实践

    背景 随着项目的成长,单页spa逐渐包含了许多业务线 商城系统 售后系统 会员系统 ... 当项目页面超过一定数量(150+)之后,会产生一系列的问题 可扩展性 项目编译的时间(启动server,修改 ...

  10. 在Vue项目中加载krpano全景图

    在Vue-cli项目中做krpano全景图编辑器的时候,由于js插件的路径是动态的,做的过程中遇到了加载不到资源的难题,在网上搜索了好久也没找到合适的办法,最后想到了可能是JS加载的问题,于是解决了问 ...