`
1998a
  • 浏览: 115337 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

Apache MINA 线程模型配置

阅读更多

本文内容是配置基于MINA的应用中的线程模型。
 
1、禁止缺省的ThreadModel设置
       MINA2.0及以后版本已经没有ThreadModel了,如果使用这些版本的话,可以跳过本节。
       ThreadModel设置是在MINA1.0以后引入的,但是使用ThreadModel增加了配置的复杂性,推荐禁止掉缺省的TheadModel配置。
       IoAcceptor acceptor = ...;
       IoServiceConfig acceptorConfig = acceptor.getDefaultConfig();
       acceptorConfig.setThreadModel(ThreadModel.MANUAL);
       注意在相关指南中,假定你已经如本节所说的禁止了ThreadModel的缺省配置。
 
2、配置I/O工作线程的数量
      这节只是NIO实现相关的,NIO数据包以及虚拟机管道等的实现没有这个配置。
      在MINA的NIO实现中,有三种I/O工作线程:
      >>Acceptor线程 接受进入连接,并且转给I/O处理器线程来进行读写操作。每一个SocketAcceptor产生一个Acceptor线程,线程的数目不能配置。
      >>Connector线程 尝试连接远程对等机,并且将成功的连接转给I/O处理器线程来进行读写操作。每一个SocketConnector产生一个Connector线程,这个的数目也不可以配置。
      >>I/O处理器线程 执行实际上的读写操作直到连接关闭。每一个SocketAcceptor或SocketConnector都产生它们自己的I/O处理线程。这个数目可以配置,缺省是1。
       因此,对于每个IoService,可以配置的就是I/O处理线程的数目。下面的代码产生一个有四个I/O处理线程的SocketAcceptor。
       IoAcceptor acceptor = new SocketAcceptor(4, Executors.newCachedThreadPool());
没有单凭经验来决定I/O处理线程数目的方法,大概可以从1开始增加。
       IoAcceptor acceptor = new SocketAcceptor(Runtime.getRuntime().availableProcessors() + 1, Executors.newCachedThreadPool());
 
3、增加一个ExecutorFilter到IoFilterChain中
       ExecutorFilter 是一个IoFilter,用于将进入的I/O事件转到一个 java.util.concurrent.Executor实现。事件会从这个 Executor转到下一个IoFilter,通常是一个线程池。可以在 IoFilterChain的任何地方增加任意数目的 ExecutorFilter,实现任何类型的线程模型,从简单的线程池到复杂的SEDA。
      到现在为止我们还没有增加 ExecutorFilter,如果没有增加ExecutorFilter,事件会通过方法调用转到一个 IoHandler,这意味着在 IoHandler实现中的业务逻辑会在I/O处理线程里运行。我们叫这种线程模型为"单线程模型"。单线程模型可以用来就会低反应网络应用程序,受 CPU限制的业务逻辑(如,游戏服务器)。
      典型的网络应用需要一个ExecutorFilter插入到IoFilterChain 中,因为业务逻辑和I/O处理线程有不同的资源使用模式。如果你用IoHandler的实现来执行数据库操作,而没有增加一个 ExecutorFilter的话,那么,你整个服务器会在执行数据库操作的时候锁定,特别是数据库性能低的时候。下面的例子配置一个IoService 在一个新的IoSession建立时增加一个ExecutorFilter。
      IoAcceptor acceptor = ...;
      DefaultIoFilterChainBuilder filterChainBuilder = acceptor.getDefaultConfig().getFilterChain();
      filterChainBuilder.addLast("threadPool", new ExecutorFilter(Executors.newCachedThreadPool());
      这里要注意ExecutorFilter没有管理特定的Executor的生命周期,当完成时,需要关闭所有特定Executor的工作线程。
     ExecutorService executor = ...;
     IoAcceptor acceptor = ...;
     DefaultIoFilterChainBuilder filterChainBuilder = acceptor.getDefaultConfig().getFilterChain();
     filterChainBuilder.addLast("threadPool", new ExecutorFilter(executor);
     // Start the server.
     acceptor.bind(...);
    // Shut down the server.
    acceptor.unbind(...);
    executor.shutdown();
    使用一个ExecutorFilter通常不意味着要用一个线程池,对于Executor的实现没有任何限制。
 
4、应该把ExecutorFilter放在IoFilterChain的什么地方
     这 个要根据于具体应用的情况来定。如果一个应用有一个ProtocolCodecFilter实现和一个常用的有数据库操作的IoHandler实现的话, 那么就建议在ProtocolCodecFilter实现的后面增加一个ExecutorFilter,这是因为大部分的协议解码实现的性能特性是受 CPU限制的,和I/O处理线程是一样的。
     IoAcceptor acceptor = ...;
     DefaultIoFilterChainBuilder filterChainBuilder = acceptor.getDefaultConfig().getFilterChain();
     // Add CPU-bound job first,
     filterChainBuilder.addLast("codec", new ProtocolCodecFactory(...));
     // and then a thread pool.
     filterChainBuilder.addLast("threadPool", new ExecutorFilter(Executors.newCachedThreadPool());
 
5、选择IoService的线程池类型时要小心
     Executors.newCachedThreadPool() 经常是IoService首选的。因为如果使用其它类型的话,可能会对 IoService产生不可预知的性能方面的影响。一旦池中的所有线程都在使用 中,IoService会在向池尝试请求一个线程时开始锁定,然后会出现一个奇怪的性能下降,这有时是很难跟踪的。
 
6、不推荐IoServices和ExecutorFilters共享一个线程池
     你可以想让IoServices和ExecutorFilters共享一个线程池,而不是一家一个。这个是不禁止的,但是会出现很多问题,在这种情况下,除非你为IoServices建立一个缓冲线程池。

分享到:
评论

相关推荐

    深入理解Apache_Mina_(5)----_配置Mina的线程模型[归类].pdf

    在这个深入理解Apache Mina的第五部分中,我们将关注Mina的线程模型配置,这是优化性能和管理资源的关键方面。 在Mina的非阻塞I/O(NIO)模式下,存在三种主要的工作线程,它们在NIO Socket中起到不同的作用: 1. ...

    关于apache Mina Server

    深入理解Apache_Mina_(1)----_Mina的几个类 ...深入理解Apache_Mina_(5)----_配置Mina的线程模型 深入理解Apache_Mina_(6)----_Java_Nio_ByteBuffer与Mina_ByteBuffer的区别(类图) 相信你们也愿意去下载更有价值的东西

    mina

    4. **Apache MINA 线程模型配置 .shtml**:这部分内容可能专注于MINA的线程模型,MINA支持多种线程模型,如NIO多路复用器、简单的线程池等,以优化性能和并发处理能力。 5. **NIO_TEST**:这可能是一些与Java NIO...

    MINA文档

    - **Apache MINA 线程模型配置 .shtml**:这部分内容可能详细讲解了MINA中的线程模型配置,如何根据应用场景选择合适的线程模型以优化性能。 - **MINA使用手记[1] _files**:这个目录可能包含了与第一篇使用手记相关...

    Apache Mina帮助文档

    Apache Mina的核心是基于Java NIO(非阻塞I/O)的事件驱动模型。在这个模型中,I/O操作不会阻塞线程,而是通过事件通知机制来触发回调函数。当数据准备好读取或写入时,事件处理器会接收到相应的事件,从而提高了...

    Apache mina2学习笔记DEMO

    此外,DEMO还可能涉及到MINA的线程模型和缓冲区管理。MINA基于NIO(Non-blocking I/O),利用Selector监控多个通道的I/O事件,从而有效地管理多个并发连接。Buffer类(如ByteBuffer)用于存储和操作字节数据,理解其...

    apache mina实例免费下载

    Apache MINA(Multipurpose Infrastructure for Network Applications)是一个开源框架,主要设计用于简化网络应用程序的开发,尤其是基于TCP和UDP协议的应用。它提供了高度可扩展和高性能的非阻塞I/O模型,使得...

    Apache MINA 2.0 用户指南( 缺第一章节)

    - **多线程处理**:为了提高性能和响应能力,服务器端通常采用多线程模型来处理连接请求和数据传输。 #### 客户端架构简介 客户端架构主要涉及连接服务器、发送请求和接收响应的过程。与服务器端类似,客户端也需要...

    Apache Mina Server 2.0 抢鲜体验

    1. **事件驱动模型**:Mina采用非阻塞I/O(NIO)的事件驱动模型,通过Selector监控多个Socket连接,减少了线程间的切换开销,提高了并发处理能力。这种模型对于处理大量并发连接的高负载服务器特别有利。 2. **API...

    Apache Mina2服务器和客户端简单实例

    Mina2基于Java NIO(Non-blocking I/O)库,提供了异步I/O操作,这意味着它不会因为等待数据而阻塞线程。它使用了服务端Acceptor和客户端Connector来处理连接。Acceptor负责接收并处理来自客户端的连接请求,而...

    深入理解Apache Mina

    3. **配置Mina的线程模型**: Mina提供了多种线程模型以适应不同的应用场景。这些模型包括:简单模型(SimpleExecutor),每个连接分配一个线程;固定线程池模型(FixedThreadPoolExecutor),线程池大小预先设定,...

    apache-mina-2.1.3-bin.tar.zip

    7. **线程模型**:MINA提供了多种线程模型,如单线程、多线程以及NIO线程池,开发者可以根据实际需求选择最适合的模型。 8. **易于调试和监控**:MINA提供了详细的日志记录和统计功能,帮助开发者更好地理解和优化...

    apache mina

    4. **MINA的线程模型配置** - MINA提供灵活的线程模型,如NIO线程模型、固定线程池模型等,可以根据应用需求调整线程的数量和分配策略,以优化性能和资源利用。 5. **MINA的使用** - 通过Apache_Mina入门资料,...

    apache mina与单例类集合实现网络通讯V1.0

    - **多线程模型**:Mina可以自动管理线程,确保在网络操作中避免阻塞,提高系统并发性能。 2. **单例类**: - **设计模式**:单例模式是一种创建型设计模式,保证一个类只有一个实例,并提供一个全局访问点。在...

    apache mina 框架实例

    一旦连接建立,Mina会通过事件模型来处理数据传输。服务端和客户端的交互通常涉及编码、解码、业务逻辑处理等步骤。例如,你可以创建一个简单的TCP服务器,它接收客户端发送的数据,解码后执行特定操作,然后将结果...

    官方最新Apache MINA 2.0二进制包和源代码

    - **线程模型**:MINA允许自定义线程模型,如单线程、多线程或线程池,以适应不同的性能需求。 - **异常处理**:了解如何处理网络异常,如连接断开、数据传输错误等,确保程序的健壮性。 总的来说,Apache MINA ...

    apache mina帮助文档

    NIO是一个基于事件的IO架构,最基本的思想就是:有事件我通知你,你再去做你的事情,没事件时你大...而且NIO的主线程only one,不像传统的模型,需要N个线程去,也减轻了JVM的工作量,使得JVM处理任务时显得更加高效。

Global site tag (gtag.js) - Google Analytics