`

利用NIO和线程池极大提升网管通讯模块的消息吞吐量

阅读更多
传统模式:



NIO + 线程池模式:


优势:
1、 减少了接收的线程数。
2、 利用线程池技术控制了处理线程的数量。
3、 从测试数据来看,消息的吞吐量是极大的提升,从原来的1000条/秒提升到现在的10W条/秒。

注意点:
1、 线程池技术时,要自己写许多代码来控制并发安全。
2、 NIO有一些BUG,列举如下:
          1、 socketchannel.close()有时候关不掉socket,需要多次关闭
          2、 selector在注销和注册监听时,有时候不能立刻反映到程序中,需要自己在程序中适时的wakeup一下。


应裴小星的要求,把我以前写的一个用nio收发消息的demo传上来(见src.zip):入口程序:com.talent.NioClient(直接运行这个类就可以了)

  • 大小: 27 KB
  • 大小: 24.7 KB
6
2
分享到:
评论
12 楼 cwqcwqmax9 2015-02-07  
楼主    demo呢
11 楼 jjruanlili 2014-08-27  
亲,说好的demo呢……
10 楼 裴小星 2011-03-19  
tywo45 写道
to小星:
1、socketchannel.close()关不掉,用压力测试可以测出来,一般很难发现。
2、千万别用Selector.select(),而应该用Selector.select(timeout),否则注册的事件有时体现不出来

谢谢。
9 楼 tywo45 2011-03-19  
to小星:
1、socketchannel.close()关不掉,用压力测试可以测出来,一般很难发现。
2、千万别用Selector.select(),而应该用Selector.select(timeout),否则注册的事件有时体现不出来
8 楼 裴小星 2011-03-17  
感觉不太一样,wakeup只是跳出select吧。
现在并没有阻塞在select上,wakeup能不能解决问题?
我再试试看吧。谢谢。
7 楼 tywo45 2011-03-17  
裴小星 写道
还遇到过一个问题:
已经把ket的interest置为0了,结果仍然被select到几次。

这不就是我说的“2、 selector在注销和注册监听时,有时候不能立刻反映到程序中,需要自己在程序中适时的wakeup一下。
”吗?
6 楼 裴小星 2011-03-16  
还遇到过一个问题:
已经把ket的interest置为0了,结果仍然被select到几次。
5 楼 裴小星 2011-03-15  
谢谢博主的例子。写得很好。
最近有点忙,刚看到,抱歉了。


socketchannel.close()有时候关不掉socket,需要多次关闭
什么情况下会发生呢?好像还没遇到过。

selector在注销和注册监听时,有时候不能立刻反映到程序中,需要自己在程序中适时的wakeup一下

我猜测是这样的:
因为Selector.select()本身是阻塞的,可能那个key已经被检查过了,
wakup就会跳出select(),因为while(true){}循环的存在,
实际上就会重新执行select(),那个key的状态就被检查到了。
用selectNow()的话就是非阻塞的,但即使检索结果为0也会执行循环,实际上开销可能更大。
4 楼 tywo45 2011-02-09  
east_java 写道
你是如何测试的啊?

每收到一条消息AtomicLong++一下,然后log.info出来,日志是有时间信息的,取时间差,再相除,不就得出来了?
3 楼 tywo45 2011-02-09  
裴小星 写道
能不能结合实际例子谈谈?比如用jdk里的nio和concurrent包实现一个简单的socket server。

已上传原来的demo,不过此demo是没用线程池技术的,当初只是为了测试NIO的可行性
2 楼 east_java 2011-02-09  
你是如何测试的啊?
1 楼 裴小星 2011-02-09  
能不能结合实际例子谈谈?比如用jdk里的nio和concurrent包实现一个简单的socket server。

相关推荐

    NIO加线程池实现Android消息推送

    本项目"**NIO加线程池实现Android消息推送**"旨在通过Java NIO和线程池技术构建一个高效的推送系统,尤其适用于服务器需要处理大量并发连接的情况。 首先,我们来理解NIO(Non-blocking Input/Output)的概念。NIO...

    基于tomcat的连接数与线程池详解

    连接数决定了Tomcat可以接受多少并发连接,而线程池中的线程数则影响到Tomcat处理请求的吞吐量。线程池由Acceptor和Worker两部分组成,Acceptor负责接收连接,而Worker负责处理这些连接上的请求。在BIO模式下,如果...

    NIO学习资料大全

    而“nio原理与实例(看).png”和“提升网管通讯模块的消息吞吐量(两种模式比较).png”可能是通过图形化的方式展示了NIO如何提高网络通信模块的性能,对比了NIO与传统IO在消息吞吐量上的差异。 通过学习这些资料...

    基于nio的简易聊天室

    在Java编程领域,NIO(New Input/Output)是一个重要的概念,它提供了非阻塞I/O操作的能力,相比传统的BIO(Blocking I/O),在处理大量并发连接时表现出更高的效率和性能。本项目"基于nio的简易聊天室"旨在通过NIO...

    基于java的BIO、NIO、AIO通讯模型代码实现

    因此,一个线程可以处理多个连接,极大地提高了服务器的并发能力。 关键类包括:`java.nio.channels.Selector`、`java.nio.channels.ServerSocketChannel`、`java.nio.channels.SocketChannel`,以及缓冲区类如`...

    java nio 包读取超大数据文件

    ### Java NIO 处理超大数据文件的知识点详解 ...综上所述,使用Java NIO处理超大数据文件时,关键是利用好内存映射文件技术和合理的数据读取策略,通过适当的分块和数据解析方法,可以有效地提升读取速度和处理能力。

    NIO处理大文件

    相较于传统的IO,NIO在处理大文件时通常具有更高的吞吐量和更低的CPU占用。尤其是在处理高并发、大数据量的场景下,NIO的优势更为明显。 9. 注意事项: 虽然NIO提供了强大的性能优化,但它的API相对复杂,使用时...

    nio demo for nio学习笔记(体系结构以及模块介绍)

    总的来说,NIO为Java开发者提供了更高效的I/O处理能力,尤其在处理高并发和大流量场景时,它的优势更加明显。然而,NIO的学习曲线相对较陡峭,需要对操作系统级别的I/O模型有一定了解,但一旦掌握,将极大地提升系统...

    Java通讯模型-BIO、NIO、AIO综合演练

    2. **优点**:真正实现了异步,避免了线程阻塞,提升了系统吞吐量。 3. **缺点**:API复杂,学习曲线较陡峭,且社区支持不如BIO和NIO成熟。 4. **应用实例**:Java的`java.nio.channels....

    httpcore-nio-4.3.jar包

    Apache HttpComponents项目中的HttpCore NIO模块(httpcore-nio)就是这样一个框架,它提供了基于Java NIO(New IO)的非阻塞I/O支持,极大地提升了网络应用的性能和并发能力。本文将详细探讨HttpCore NIO 4.3版本的...

    从Jetty、Tomcat和Mina中提炼NIO构架网络服务器的经典模式

    3. **处理请求**:为了防止业务处理阻塞Selector,使用多线程分离监听和处理任务,最大化利用NIO的异步特性。 接下来是Tomcat的NIO实现: 1. **NioEndpoint**:同样负责组件的组合,包括Acceptor和Poller。 2. **...

    java NIO和java并发编程的书籍

    java NIO和java并发编程的书籍java NIO和java并发编程的书籍java NIO和java并发编程的书籍java NIO和java并发编程的书籍java NIO和java并发编程的书籍java NIO和java并发编程的书籍java NIO和java并发编程的书籍java...

    3种下载文件程序的思考,为何使用NIO进行异步网络通讯

    标题中的“3种下载文件程序的思考,...对于开发高效网络服务,特别是像文件下载这样对吞吐量有较高要求的应用,NIO是一种非常有效的解决方案。学习和理解NIO的原理和实践,对于提升我们的IT专业技能是非常有价值的。

    基于nio实现的多文件上传源码

    总的来说,基于NIO实现的多文件上传源码充分利用了NIO的非阻塞特性和并发能力,提高了文件传输效率,尤其适用于文件小但数量大的场景。在理解和应用这个源码时,深入研究NIO的原理和实践,将有助于进一步提升系统的...

    Java NIO实现多个客户端之间的消息互发,客户端与服务器完整代码

    而"sensor"包可能是Java NIO的一部分,专门负责接收来自客户端的消息,并进行处理和转发。由于没有提供具体的源代码,我们无法深入分析每个类的功能,但根据描述,我们可以推测这些类可能包含: - Server类:作为...

    NIO与零拷贝_javanio_nio和零拷贝_

    - **提高系统吞吐量**:数据传输过程中的拷贝次数减少,整体传输速度提升,提升了系统性能。 - **降低内存压力**:减少了内存间的数据交换,降低了内存使用压力,尤其是对于大数据传输场景。 4. **应用实例** - ...

    Servlet API 和 NIO: 最终组合在一起

    这样做可以充分利用NIO的非阻塞特性,提高服务器的吞吐量和响应速度。 在实际项目中,开发者可能会遇到一些问题,如如何在Servlet中集成NIO进行数据读写,或者如何利用NIO优化Servlet的性能。解决这些问题通常需要...

    NIO网络通讯编程

    NIO(Non-blocking I/O,非阻塞I/O)是Java平台中的一种I/O模型,与传统的BIO(Blocking I/O,阻塞I/O)相比,NIO在处理高并发、大数据传输时表现出更高的效率和更好的性能。NIO的核心概念包括通道(Channel)、缓冲...

Global site tag (gtag.js) - Google Analytics