换完工作有三四个月了,发现一直都在忙,也好久不来这里,写下点什么了。今天就来分析下java Nio 和 Bio 应用于客户端的情况。
Nio 是 new IO 的缩写,这个新是相对于Bio 而言。对于IO,大体上有两种分类,同步,异步;阻塞,非阻塞之分。Bio 自然是阻塞io,但Nio 不一定就是非阻塞,也可以是阻塞的。所以Nio 体现在新上。 还有阻塞和非阻塞与同步,异步没有太大的对照性。不要以为同步就是用了阻塞IO的,异步就是非阻塞。同步,异步是和你用的线程有关。阻塞的也可用与异步情况,怎不用呢,业务内使用future模式,通信使用线程,也可有异步效果。仔细想想Nio 没出来之前,岂不是java就不能异步通信了,这当然是不可能了的嘛。非阻塞用于同步的就不说了。
这里看出来同步,异步要看线程。
这里比较Nio 和Bio 当然是把Nio 用于非阻塞的情况,阻塞的情况又有什么可比的呢?
我们可以可以看看mina和async http client 的Nio异步的实现方式。大部分是一个acceptor 或connector 线程专门管理建立链接相关的io事务,多个(cpu 核数加一)processor 线程处理数据传输。这里不得不吐槽下这个核数加一的设定,系统的并非处理能力和cpu核数当然是正相关的,但是认为设定个核数加一就算调到最优了,不能不说太傻太天真了。不知道一个进程里可能还有很多其它线程吗,其它进程还有线程吗?怎么能保证在一个分片时间里,处理掉所有的请求事件,尤其是大并发下。所以processor的个数核数加一是个下限而已。
在比较下,客户端通信与服务器通信之间的不同,一般总压力表现为,并发量*频率*单次压力,前两个不用废话,后一个对于io和计算就有点不同,业务越复杂,这个对于一次的计算压力越大,数据量越大,io压力越大。当然大部分都是一项或一两项高。
如果是小数据,并发,频率高,用mina 类的处理方式是非常不错的,保证每一个processor在自己的时间分片里处理完所以请求事件即可,如果处理不完呢?那只有加线程了,不行就加机器,就像公司里一样,活多人少,那可是不行的。而且服务端好处是io 可以和业务分离,io 有io 线程,业务有业务线程。这个对于客户端就不是太好了,这个在后面分析。所以如果是小数据量,io线程能保证快速处理io事件即可,对于业务,业务少,tps 达标,当然可以在io 线程里把业务也做了,如果太多,那加个线程池来处理也是可以的,如果还不够,妹的,esb,服务化加消息走起,先给你个简单回复,例如“容哥三思”,做完了,通过消息中间件发连接通知服务器,再发通知,如“哥想过了,这个可以有”云云。可谓玩法多多。
但是对于客户端,要发请求等响应,这就比较麻烦,因为请求和响应要对的起来,就像你同时像A和B要钱(非阻塞请求),那么A给你的钱,你得记在A上,B给你的要记在B上。现实情况可能比较简单,但对于同一个服务器,请求和响应要能绑定,那么顺序就要保证,这就不能简单的处理事件了。(对于服务器是不需要的,从哪来的请求,我给谁响应就行)。除非在协议上有规定,那么请求和响应就要有原子性。一个链路上就是一个请求一个响应的顺序。这个和Bio 区别就不大了。
所以很多客户端还是Bio的形式,如mongo,redis,c3p0等链接池还是bio 的形式
相关推荐
BIO、NIO、AIO、Netty 什么是IO:Java中I/O是以流为基础进行数据的输入输出的,所有数据被串行化(所谓串行化就是数据要按顺序 进行输入输出)写入输出流。简单来说就是java通过io流方式和外部设备进行交互。在Java...
BIO是同步阻塞模型,特点是一对一的客户端与处理线程关系,适用场景是连接数量较小并且固定的,优点是编程简单,但对服务器资源要求高。NIO是同步非阻塞模型,它借助selector能以一对多的方式处理连接,优点是连接...
jdk bio,nio,aio各种使用案例,深入理解netty,结合源码以及文章分析: jdk原生nio的缓冲区使用 jdk原生的nio channel使用 jdk原生的nio网络编程 jdk原生的React器编程模型(使用选择器)聊天室 零拷贝使用案例...
android socket client / java socket client,java/android客户端聊天程序,含TCP bio实现,含TCP nio实现, 含UDP bio实现,含UDP nio实现, 附完整demo
相比于上次的基于BIO的多人聊天室的线程数量大幅度减少。 一个线程用于监听客户端的到达,两个线程池分别负责客户端 消息的 读 和写。 另外两个线程 负责 readSelector 和writeSelector 的监听。 但是仅仅是对 ...
实现多人聊天消息转发,用户发送消息同步到服务中的其他客户端,运用到了nio中buffer、socket、selector。 1、Channel,管道。Channel可以理解为连接,与BIO中Sokcet类似,一个连接对应一个Channel,但Channel中仍...
1.BIO、NIO 和 AIO 的区别? BIO:一个连接一个线程,客户端有连接请求时服务器端就需要启动一个线程进行处理。线 程开销大。 伪异步 IO:将请求连接放入线程池,一对多,但线程还是很宝贵的资源。 NIO:一个请求一...
传统BIO通信的弊端 在JDK 1.4推出JAVANIO1.0之前,基于JAVA 的所有Socket通信都采用 BIO 了同步阻塞模式( ),这种一请求一应答的通信模型简化了上层的应用开发, 但是在可靠性和性能方面存在巨大的弊端。...
- BIO NIO 和 AIO 的区别 - 什么是流 - 流的分类 - 节点流和处理流 - Java IO 的核心类 File - Java IO 流对象 - 字节流对象 - InputStream - OutputStream - 字符流对象 - Reader - Writer - 字节流与...
Netty是一款高性能的网络通信框架,其应用也很广泛,比如常用的消息队列RocketMQ,RPC框架Dubbo在底层...既然BIO和NIO都是以同步的方式工作的,那么这里就先拿BIO与NIO做个简单的对比,比较两者的差异具体在哪些地方。
主要介绍了Java NIO服务器端开发详解,具有一定借鉴价值,需要的朋友可以参考下。
1.BIO、NIO和AIO的区别? BIO:一个连接一个线程,客户端有连接请求时服务器端就需要启动一个线程进行处理。线程开销大。 伪异步IO:将请求连接放入线程池,一对多,但线程还是很宝贵的资源。 NIO:一个请求一个...
1.Netty底层IO模型可以随意切换,比如可以从NIO切换到BIO,但一般很少会这么做。 2.Netty自带拆包解包,从NIO各种繁复的细节中脱离出来,让开发者重点关心业务逻辑。 3.Netty解决了NIO中Selector空轮询BUG,...
BIO方式适用于连接数目比较小且固定的架构,这种方式对服务器资源要求比较高,并发局限于应用中,JDK1.4以前的唯一选择,但程序简单易理解。 NIO 同步非阻塞 IO,None-Block IO NIO 是对 BIO 的改进,基于 Reactor
jdk 1.8中的日期时间API,数据结构中图的实现及操作和广度优先遍历/深度优先遍历(其他待完善),生成XML文件工具类,防止XSS攻击解决方案,mybatis逆向工程,接口并发测试,BIO,NIO,AIO,Netty的服务,客户端......
在高版本的Tomcat中,默认的模式都是使用NIO模式,在Tomcat 9中,BIO模式的实现Http11Protocol甚至都已经被删除了。但是了解BIO的工作机制以及其优缺点对学习其他模式有有帮助。只有对比后,你才能知道其他模式的...
项目中,你可以清晰地看到BIO与NIO模型在Netty中的灵活运用,如何通过Netty的高性能特性来优化网络通信。此外,demo还详细展示了如何通过自定义编解码器处理网络通信中的数据编解码问题,以及如何利用心跳机制确保...
livevent在MFC上的实现, 花了1周的时间研究各种TCP模型, 包括LINUX和WINDOWS平台等, 包括C&C++, C#, JAVA, GOLANG, ERLANG等居于IOCP, SELECT, POLL, EPOLL, KQUEUE, BIO, NIO, AIO, 并发语言等实现的同步或异步...
「喜欢的自提」 可以直接运行的代码,里面是我在工作中用来学和和测试的代码,一般是得到想要的测试结果,就直接用于实战项目中...17、BIO、NIO、AIO、Reactor、netty相关学习总结和测试(客户端/服务端通信测试demo)
BIO 和 NIO 拷贝文件的区别操作系统的零拷贝 选择器(Selectors) 选择键(SelectionKey) 示例:简易的客户端服务器通信 集合 集合框架总览 -、Iterator Iterable ListIterator 二、Map 和 Collection 接口Map 集合体系...