首页 > 编程知识 正文

netty reactor模型,netty应用场景

时间:2023-05-05 10:53:13 阅读:27717 作者:3541

1 .母语NIO问题

NIO类库和API复杂且难以使用:选择器、服务器套接字通道、

套接字通道、字节缓冲器等。 需要额外的技能。 您必须熟悉Java多线程编程。 NIO编程包含Reactor模式,因此需要

只有熟悉多线程和网络编程,才能编写高质量的NIO程序。 开发工作量和难度非常高。 例如,客户端面临连接断开、网络闪存断开、半包读写、失败缓存和网络拥有

插头和异常流的处理等。 JDK NIO错误:臭名昭著的Epoll错误会导致选择器空轮询,最终导致100 %的CPU。 到

JDK 1.7版此问题依然存在,尚未根本解决

(Epoll错误:根据JDK NIO api的说明,NIO上的选择器轮询中当前是否有IO事件,选择器的选择端

虽然方法在IO事件到达或超时之前会被阻止,但是在Linux平台上可能会出现此问题,在某些字段中

景下select方法直接返回,即使不超时IO事件也不会到达,这就是有名的epoll

错误,这是一个比较严重的错误,线程陷入死循环,CPU反弹到100%,投射很大的阴影

音响系统的可靠性,至今为止JDK还没有完全解决这个问题。 )2.网络茶介绍

Netty是JBOSS提供的Java开源框架。 Netty提供了一个异步事件驱动的网络APP应用程序框架,用于快速开发高性能、可靠的网络I/o程序。 Netty是一个基于NIO的网络编程框架,通过使用Netty,可以快速、轻松地开发相当于简化和流程化NIO开发过程的web APP应用程序。 作为目前最流行的NIO框架,Netty广泛应用于互联网领域、大数据分布式计算领域、游戏行业、通信行业等,知名的Elasticsearch、Dubbo框架内部采用Netty

Netty强度:支持零拷贝、可扩展事件模型TCP、UDP、HTTP、web套接字等协议; 提供安全的传输、压缩、大文件传输、编解码器支持等。

具有以下优点:

优雅的设计,提供块和非块的插座; 提供高度可定制的线程模型,提供灵活、可扩展的事件模型。 提高性能和吞吐量,使用零拷贝技术最大限度地减少不必要的内存复制并减少资源消耗。 提供安全的传输特性。 支持多个主要协议的用户专用协议3 .预装多个编解码器功能,支持线程模型的开发

)1)线程模型的基本介绍

不同的线程模式会严重影响程序的性能。 在学习Netty线程模式之前,首先介绍每个线程模式

表达式,最后看看Netty线程模型有什么优势.现在存在的线程模型如下:

传统的块I/O服务模式

反射器模型

根据Reactor的数量和处理资源池线程的数量,有三种典型的实现

单反线程

单反器多线程

主从Reactor多线程

)传统的阻塞I/O服务模式

要获取在块IO模式下输入的数据,每个连接都必须有独立的线程完成数据输入、业务处理和数据返回工作。

有问题:

如果并发行数较大,则在创建大量线程和占用系统资源的连接后,当前线程暂时没有数据读取,read操作将阻止该线程,浪费线程资源。 (3)反射器模型

反射器模式。 在一个或多个输入同时传递给服务处理器的模式下,服务器端程序处理接收到的多个输入

Reactor模式也称为Dispatcher模式,因为请求并将它们同步分配给相应的处理线程。 Reactor模式使用IO复用来接收事件,接收事件后将其分发给线程(进程),这是网络服务器高并发处理的关键

单跟踪单线程:

选择器允许APP应用程序通过块对象接收多址请求

如果Reactor对象通过Selector监视客户端请求事件,并且在收到事件后通过Dispatch分发事件是连接请求事件,则Acceptor通过Accept处理连接请求,并在连接完成后

Handler完成读取业务处理发送的完整业务流程

好处:机型简单,不存在多线程、进程通信和冲突问题,完全只需一个线程即可完成

缺点:

性能问题只有一个:线程,无法充分发挥多核CPU的性能。 Handler处理某个连接上的业务时,整个进程无法处理其他连接事件,导致性能瓶颈可靠性问题:线程突然终止或进入死循环,整个系统通信模块无法使用,无法发送和接收

处理外部消息导致节点故障的Reactor多线程

Reactor对象在selector中监视客户端请求事件,收到事件后在dispatch中分发

一旦建立连接请求

右 Acceptor 通过accept 处理连接请求
·如果不是连接请求,则由 reactor 分发调用连接对应的 handler 来处理
·handler 只负责响应事件,不做具体的业务处理, 通过 read 读取数据后,会分发给后面的worker 线程池的某个线程处理业务
·worker 线程池会分配独立线程完成真正的业务,并将结果返回给 handler
·handler 收到响应后,通过 send 将结果返回给 client

优点:
可以充分的利用多核 cpu 的处理能力
缺点:
多线程数据共享和访问比较复杂, reactor 处理所有的事件的监听和响应,在单线程运行, 在
高并发场景容易出现性能瓶颈

主从Reactor多线程

·Reactor 主线程 MainReactor 对象通过 select 监听客户端连接事件,收到事件后,通过Acceptor 处理客户端连接事件
·当 Acceptor 处理完客户端连接事件之后(与客户端建立好 Socket 连接),MainReactor 将连接分配给 SubReactor。(即:MainReactor 只负责监听客户端连接请求,和客户端建立连
接之后将连接交由 SubReactor 监听后面的 IO 事件。)
·SubReactor 将连接加入到自己的连接队列进行监听,并创建 Handler 对各种事件进行处理当连接上有新事件发生的时候,SubReactor 就会调用对应的 Handler 处理
·Handler 通过 read 从连接上读取请求数据,将请求数据分发给 Worker 线程池进行业务处理
·Worker 线程池会分配独立线程来完成真正的业务处理,并将处理结果返回给 Handler。Handler 通过 send 向客户端发送响应数据
·一个 MainReactor 可以对应多个 SubReactor,即一个 MainReactor 线程可以对应多个
SubReactor 线程

优点:

MainReactor 线程与 SubReactor 线程的数据交互简单职责明确,MainReactor 线程只需要
接收新连接,SubReactor 线程完成后续的业务处理MainReactor 线程与 SubReactor 线程的数据交互简单, MainReactor 线程只需要把新连接
传给 SubReactor 线程,SubReactor 线程无需返回数据多个 SubReactor 线程能够应对更高的并发请求
缺点:
这种模式的缺点是编程复杂度较高。但是由于其优点明显,在许多项目中被广泛使用,包括
Nginx、Memcached、Netty 等。这种模式也被叫做服务器的 1+M+N 线程模式,即使用该模式开
发的服务器包含一个(或多个,1 只是表示相对较少)连接建立线程+M 个 IO 线程+N 个业务处理
线程。这是业界成熟的服务器程序设计模式。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。