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/
相关推荐
这篇博客“Java学习之IO总结及mina和netty”探讨了Java IO的基础知识,并深入到两个高级网络通信框架——Mina和Netty。Mina和Netty都是基于NIO(非阻塞IO)的高性能网络应用框架,它们简化了复杂网络编程的实现。 *...
jaca视频教程 jaca游戏服务器端开发 Netty NIO AIO Mina视频教程 课程目录: 一、Netty快速入门教程 01、第一课NIO 02、第二课netty服务端 03、第三课netty客户端 04、第四课netty线程模型源码分析(一) 05、...
在这个压缩包中,包含了“Java_NIO基础视频教程”和“MINA视频教程”,你可以通过观看这些教程,了解和学习NIO和Mina的基本用法。同时,“Netty快速入门视频(52im.net).txt”虽然不是直接与Mina相关的,但Netty也是...
MINA、Netty和Twisted是三个备受瞩目的开源通讯框架,它们各自拥有独特的特性和优势,广泛应用于高性能、高并发的网络应用中。本文将结合一系列的学习文档,深入探讨这三大框架的使用方法和技术细节。 首先,我们来...
Mina2与Netty4是两种非常流行的网络编程框架,它们都用于构建高性能的网络服务器和客户端。由于它们都是基于Java NIO实现,因此有很多共同点,但同时也存在一些重要的差异。接下来将根据标题和描述的要求详细分析...
文中提到的Mina和Netty是使用Java NIO开发的高性能的网络通信框架。Mina是一个完全由Java编写的NIO框架,而Netty则是由JBOSS提供的一个高性能的异步事件驱动的网络应用框架,它们都是基于Java反应器模式设计的,用于...
Netty和Mina都是Java开发的高性能网络框架,供开发者快速构建高性能的网络应用程序。下面是关于Netty和Mina的详细知识点: 开发文档和实现 Netty的开发文档比Mina丰富,提供了更多的示例代码和开发指南。Netty的...
在"**NIO学习-Java源代码分享**"这个压缩包中,可能包含了关于NIO的示例代码,包括使用NIO进行文件操作、网络通信的实例,也可能包含Netty或Mina的部分源码,这些都可以作为学习和研究NIO技术的宝贵资源。...
长期从事高性能通信软件的架构设计和开发工作,有多年在NIO领域的设计、开发和运维经验,精通NIO编程和Netty、Mina等主流NIO框架。目前负责华为软件公司下一代SOA中间件和PaaS平台的架构设计工作。
这一时期,除了官方改进之外,社区也做出了贡献,例如Google发布的Guava库和Trustin Lee领导开发的Netty和MINA框架等,这些工具极大地简化了文件操作和网络通信。 - **JDK1.7至今**: 随着Java 7的发布,NIO2(New I/...
长期从事高性能通信软件的架构设计和开发工作,有多年在NIO领域的设计、开发和运维经验,精通NIO编程和Netty、Mina等主流NIO框架。目前负责华为软件公司下一代SOA中间件和PaaS平台的架构设计工作。
Netty是一个高性能、异步事件驱动的网络应用程序框架,用于快速开发可维护的高性能协议服务器和客户端,是基于Java NIO的异步非阻塞的网络编程框架。Netty在内部实现了自己的线程模型,支持多种协议,包括UDP、TCP、...
这个简单的NIO服务器示例展示了如何使用Java NIO进行非阻塞I/O通信,但实际的生产环境中,通常会使用更高级的框架,如Apache Mina或Netty,它们提供了更丰富的功能和更高的性能优化。Apache Mina是一个轻量级、高...
在实际开发中,Java NIO通常与Apache等开源库结合使用,例如Apache Mina或Netty,它们提供了基于NIO的高性能网络通信框架,简化了网络编程的复杂性。 在"2021最新-Java NIO视频教程.txt打包整理.zip"这个资源中,你...
包含了Netty,NIO AIO,Mina知识的详解以及netty结合spring protocolbuf的源码
Java NIO基础视频教程、MINA视频教程、Netty快速入门视频 [有源码]-附件资源
在Java世界中,MINA与Netty相似,都是基于NIO(Non-blocking I/O)的网络编程框架。 MINA的状态机概念是其核心设计之一。状态机是一种用于描述系统或对象在不同时间点的行为模式。在MINA中,状态机用于处理网络连接...