Netty原来就是这样啊(二)
前言:
Netty其实最大的特点就是在于对于对NIO进行了进一步的封装,除此以外Netty的特点就是在于其的高性能 高可用性,下面就会一一进行说明。
高性能:
我在Netty原来就是这样啊(一)-CSDN博客 解释了其中的零拷贝的技术除此以外还有Reactor线程模型,这个Reactor线程模型的思想就是基于NIO这个也是可以通过看我的那个博客
Reactor线程模型:
Raactor模式;
组成:
Reactor:在一个线程中进行运行,这个主要就是监听以及分发相关的事件, 这个可以看做是一个中转站,就像我们坐高铁一样,如果没有直达的车次的话那么我们就会选择一个有目的地的高铁站然后我们就到达那个中转站然后乘坐对应的高铁到达目的地
Handler: 处理程序执行 I/O 事件要完成的实际事件,类似于客户想要与之交谈的公司中的实际官员。Reactor 通过调度适当来处理实际的来自客户端的请求
三种模式:
单 Reactor 单线程:
实现原理: 这个就是有Reactor负责监听以及分配IO事件,当监听到事件之后如果是连接事件的话那么就是由Acceptor来进行处理,反之的话由于是单线程的那么read send 以及处理逻辑都会在一个线程中进行
优缺点: 优点就是在于由于单线程的那么就不会产生线程和线程之间的竞争也就是上下文切换
缺点也是比较明显的那就是当处理的请求比较多的时候那么处理的效率就会特别低
单 Reactor 多线程:
实现过程:这个就是在处理业务逻辑的是不一样的,在这个模型当中的话那么就叫处理业务逻辑的部分交给线程池来进行处理,Handler就是负责read以及send的操作,除了这个以外的话那么就是Handler线程的数目变多了,就是在read以及send的时候效率提高了
优缺点: 优点: 相较于单Reactor单线程而言能够处理的并发的请求量多 但是缺点也是在这里因为只有一个Reactor来进行监听以及分配IO事件,这个也是一个瓶颈的地方
主从 Reactor 多线程:
实现原理: 相较于单Reactor多线程而言,当MainReactore建立连接之后将分配一些IO连接给子Reactor那么这样的话就是由多个Reactor来负责监听以及分配IO事件给Handler
优缺点: 优点:就是在于相对于两个模型而言可以应对高并发场景下的请求 缺点:就是在于进行实现的时候会十分复杂
Netty的线程模型:
Netty的线程模型在主从Reactor多线程的基础之上进行了进一步的优化
组成:
BossGroup: 这个主要就是当接收到来自于客户端的请求之后和客户端建立连接用的就是线程池
NioEventLoop: 这个就是里面用于处理实际请求的线程
TaskQueue:这个就是用于存放没有来得及处理的请求的也可以说是任务是一个队列
WorkerGroup: 这个也是一个线程池,里面的就是用于处理业务逻辑以及read write
NIOScoektChanel:这个就是一个通过被selector进行监听用于传输数据的
PipLine: pipline中包含了 channel,即通过pipline可以获取到对应的 channel,并且pipline维护了很多的 handler(处理器)来对我们的数据进行一系列的处理。
工作原理:
1.当客户端发送请求的时候那么这个时候BossGroup负责建立连接然后NIOEventLoop中的Slecetor和客户端的连接进行一个绑定
2.建立连接成功之后就会生成 NIOSocketChannel,之后就会将这个通道和WorkGroup中的NioEventLoop的selector进行一个绑定
3.WorkGroup中的NioEventLoop对于通道进行一个轮询如果有read/write事件的时候,这个时候就会将这个IO事件分发给相应的 ChannelPipeline(
包含了多个 ChannelHandler
,每个 ChannelHandler
负责处理特定的事件或数据,从而实现了高可用性和高性能的网络通信。)
进行处理。处理完成之后就会直接将结果返回给客户端
高可用性:
负载均衡
1.客户端负载均衡:客户端可以通过负载均衡算法(如轮询、随机等)选择合适的服务器节点进行连接。
2.服务端负载均衡:使用反向代理(如 Nginx、HAProxy)或负载均衡器(如 AWS ELB)将请求分发到多个服务器节点,确保单个节点的故障不会影响整体服务。
健康检查
- 定期健康检查:定期检查服务器节点的健康状态,及时发现并隔离故障节点。
- 心跳检测:客户端和服务端之间定期发送心跳包,检测连接状态。
分布式部署
- 多节点部署:在多个物理或虚拟机上部署相同的服务器节点,确保单点故障不会影响整个系统。
- 地理分布:在不同地理位置部署服务器节点,提高系统的容灾能力。