`
youyu4
  • 浏览: 426274 次
社区版块
存档分类
最新评论

java NIO 之 mina 和 netty

 
阅读更多

java NIO 之 mina 和 netty

 

 

Mina 和 Netty 同属于nio框架,但是Mina较早,而Netty更新,同时Netty的更新频率和社区活跃度都比Mina高,所以如果选择项目开发的话,Netty会比较稳妥。

 

两者的主要区别

 

  • Netty 文档更完整,版本更新更快
  • Mina 则依赖Apache,Netty 依赖JBoss,和jboss的结合度非常高,netty有对google protocal buf的支持,有更完整的ioc容器支持(spring,guice,jbossmc和osgi);
  • netty比mina使用起来更简单,netty里你可以自定义的处理upstream events 或/和 downstream events,可以使用decoder和encoder来解码和编码发送内容;
  • netty和mina在处理UDP时有一些不同,netty将UDP无连接的特性暴露出来;而mina对UDP进行了高级层次的抽象,可以把UDP当成"面向连接"的协议,而要netty做到这一点比较困难。mina把TCP和UDP一样当"有连接"的处理,一个UDP请求会按照address产生一个新的 IoSession,过期时间是1分钟,这样做的好处是显然的,但是对于有性能要求的项目就不好了,对一个无连接的东西cache 1分钟,大多数时候可能是白cache了,做无用功。 

 

 

 

mina、netty的线程模型

 

mina与netty都是Trustin Lee的作品,所以两者都采用了Reactors in threads模型,即Main Reactor + Sub Reactors的模式。

 

由main reactor处理连接相关的任务:accept、connect等,当连接处理完毕并建立一个socket连接(称之为session)后,给每个session分配一个sub reactor,之后该session的所有IO、业务逻辑处理均交给了该sub reactor。每个reactor均是一个线程,sub reactor中只靠内核调度,没有任何通信且互不打扰。

 

 

Thread per Connection

在没有nio之前,这是传统的java网络编程方案所采用的线程模型。即有一个主循环,socket.accept阻塞等待,当建立连接后,创建新的线程/从线程池中取一个,把该socket连接交由新线程全权处理。这种方案优缺点都很明显,优点即实现简单,缺点则是方案的伸缩性受到线程数的限制。

 

 

Reactor in Single Thread

有了nio后,可以采用IO多路复用机制了。我们抽取出一个单线程版的reactor模型,时序图见下文,该方案只有一个线程,所有的socket连接均注册在了该reactor上,由一个线程全权负责所有的任务。它实现简单,且不受线程数的限制。这种方案受限于使用场景,仅适合于IO密集的应用,不太适合CPU密集的应用,且适合于CPU资源紧张的应用上。



 

 

Reactor + Thread Pool

方案2由于受限于使用场景,但为了可以更充分的使用CPU资源,抽取出一个逻辑处理线程池。reactor仅负责IO任务,线程池负责所有其它逻辑的处理。虽然该方案可以充分利用CPU资源,但是这个方案多了进出thread pool的两次上下文切换。



 

 

Reactors in threads

基于方案3缺点的考虑,将reactor分成两个部分。main reactor负责连接任务(accept、connect等),sub reactor负责IO、逻辑任务,即mina与netty的线程模型。该方案适应性十分强,可以调整sub reactor的数量适应CPU资源紧张的应用;同时CPU密集型任务时,又可以在业务处理逻辑中将任务交由线程池处理,如方案5。该方案有一个不太明显的缺点,即session没有分优先级,所有session平等对待均分到所有的线程中,这样可能会导致优先级低耗资源的session堵塞高优先级的session,但似乎netty与mina并没有针对这个做优化。



 

 

 

Reactors in threads + Threads pool

这也是我所在公司应用框架采用的模型,可以更为灵活的适应所有的应用场景:调整reactor数量、调整thread pool大小等。



 

 

 

参考

http://ifeve.com/netty-mina-in-depth-1/

  • 大小: 28.6 KB
  • 大小: 31.1 KB
  • 大小: 37.7 KB
  • 大小: 44.3 KB
分享到:
评论
1 楼 dick1305 2017-12-28  

相关推荐

    Java视频教程 Java游戏服务器端开发 Netty NIO AIO Mina视频教程

    jaca视频教程 jaca游戏服务器端开发 Netty NIO AIO Mina视频教程 课程目录: 一、Netty快速入门教程 01、第一课NIO 02、第二课netty服务端 03、第三课netty客户端 04、第四课netty线程模型源码分析(一) 05、...

    基于Java NIO反应器模式设计与实现

    Java NIO反应器模式讲解,目前热门的Java网络通信框架中Mina,Netty等都采用NIO

    Netty权威指南(第2版)

    长期从事高性能通信软件的架构设计和开发工作,有多年在NIO领域的设计、开发和运维经验,精通NIO编程和Netty、Mina等主流NIO框架。目前负责华为软件公司下一代SOA中间件和PaaS平台的架构设计工作。

    Netty权威指南 第2版 带书签目录

    长期从事高性能通信软件的架构设计和开发工作,有多年在NIO领域的设计、开发和运维经验,精通NIO编程和Netty、Mina等主流NIO框架。目前负责华为软件公司下一代SOA中间件和PaaS平台的架构设计工作。

    Netty nio protocolbuf视频课程

    包含了Netty,NIO AIO,Mina知识的详解以及netty结合spring protocolbuf的源码

    Java NIO基础视频教程、MINA视频教程、Netty快速入门视频 [有源码]-附件资源

    Java NIO基础视频教程、MINA视频教程、Netty快速入门视频 [有源码]-附件资源

    NIO Netty框架

    NIO 框架 netty 与 mina

    NIO学习-Java源代码分享(含netty)

    NIO学习-Java源代码分享(含netty)

    Java Netty技术研究

    近代: java.nio java.niojava.niojava.niojava.niojava.nio 其他: MinaMinaMinaMina,GrizzlyGrizzlyGrizzly GrizzlyGrizzly 为什么不是 为什么不是 MinaMina Mina? 1、都是 Trustin LeeTrustin LeeTrustin Lee ...

    Java在高并发网络编程中的应用

    对Java NIO的原理及应用做了较为详细的探讨,详细描述了Mina 和Netty框架的特性及原理。

    java开源包3

    6、支持多种通信框架(Mina/Netty/Grizzly),支持多种序列化/反序列化(Java/Hessian/PB); 7、支持自定义通信协议,可完全替换NFS-RPC自带的协议。 淘宝开放平台JAVA版SDK top4java 设计原则 容易维护扩展(不...

    nety nio 视频.txt

    Java NIO基础视频教程、MINA视频教程、Netty快速入门视频 [有源码] 网盘地址

    Netty 3.0.2.GA 的源码--- Mina的兄弟

    Netty、Mina、Cindy都是不错的NIO开源框架,后两者都是在Netty的基础上演化出来的。所以要学习好Java的异步通信框架,这三个都是不可多得的好材料。 本资源仅供学习和参考使用,若要进行开发,请下载相应的Jar包。

    Mina 文档doc

    • Multipurpose ...MINA没有直接使用使用java NIO的ByteBuffer类。它使用一个自制的ByteBuffer来扩展java。如果你使用MINA,你将不需要直接使用NIO buffers,因为仅使用MINA buffers就可以完成大多数buffer操作

    基于Netty4实现的UDP双向通信源码

    本源码是《NIO框架入门(三):iOS与MINA2、Netty4的跨平台UDP双向通信实战》一文的服务端源码实现(Netty4版),详见:http://www.52im.net/thread-378-1-1.html

    tridge-server.zip

    基于java nio开发的tcp服务端开发框架 类似于mina、netty

    基于Netty的Android点对点聊天软件-源码

    基于Netty的Android点对点聊天软件-源码 Netty是基于NIO的JAVA异步通讯框架,比Mina在性能上更具有优势,其作者也正是Mina的原作者之一。

Global site tag (gtag.js) - Google Analytics