Netty实现高性能
高性能
高性能包含的内容
- 高并发用户(Concurrent Users)
同时访问应用系统的用户/链接数 - 高吞吐量(Throughout)
单位时间处理的请求数QPS或事务数TPS - 低延迟(Latency)
用户从发出请求到得到响应的时间,比如P50=1ms表示百分之五十的请求在1ms以内 - 容量
最多能接受的链接数,因为随着访问应用系统的用户增多,就伴随着如JVM本身需要使用更多的内存(系统内存存在物理上限)、GC问题等性能瓶颈。所以一个应用系统的处理链接、请求的数量和应用系统的性能关系曲线总是存在一个顶点,过低或过高都会导致应用系统的性能下降,这个顶点就是该应用系统的容量
高性能的副作用
- 系统复杂度 x10以上
- 建设与维护成本++++
- 故障或 BUG 导致的破坏性 x10以上
Netty 实现高性能
多线程的Socket IO
使用selector的Socket IO
- 单个线程通过selector监听多个Socket
- 多个线程通过selector监听多个Socket
引入事件处理机制的Socket IO—Reactor 模型
- 事件处理机制
- 事件处理机制的应用:Reactor 模型
Reactor 模式首先是事件驱动的,有一个或者多个并发输入源,有一个 Service Handler(多路复用) 和多个EventHandlers
这个 Service Handler 会同步的将输入的有数据的请求分发给相应的 Event Handler
从 Reactor 模型到 Netty NIO
Reactor单线程模型
此时一个线程充当酒店的前台迎宾reactor,有一个线程充当工作人员
Reactor多线程模型
此时一个线程充当酒店的前台迎宾reactor,有多个线程充当工作人员
Reactor主从模型
此时多个线程充当酒店的前台迎宾reactor,又有多个线程充当工作人员
Netty对三种模式的支持
Netty启动和处理流程
Netty线程模式
EventLoopGroup
Netty 运行原理
关键对象
-
Bootstrap: 启动线程,开启socket
-
EventLoopGroup
-
EventLoop
-
SocketChannel: 连接
-
ChannelInitializer: 初始化
-
ChannelPipeline: 处理器链
-
ChannelHandler: 处理器
-
ChannelInboundHandler 通过该处理器从channel读取Socket 数据
-
ChannelOutboundHandler 通过该处理器从channel写出数据到Socket