NIO 传输参考

使用 ActiveMQ Classic > 配置传输 > ActiveMQ Classic 连接 URI > NIO 传输参考

NIO 传输与常规 TCP 传输 非常相似。区别在于它是使用 NIO API 实现的,可以帮助提高性能和可扩展性。NIO 仅是服务器端传输选项。尝试在客户端使用它将实例化常规 TCP 传输。

配置语法

nio://hostname:port?key=value

配置选项与 TCP 传输 相同。

请注意,原始 NIO 传输是使用 OpenWire 协议的 tcp 传输的替代品。其他网络协议(如 AMQP、MQTT、Stomp 等)也有自己的 NIO 传输实现。通常,通过在协议前缀中添加“+nio”后缀来配置它,例如

mqtt+nio://127.0.0.1:1883

所有协议特定的配置也应适用于 NIO 版本的传输。

调整 NIO 传输线程使用情况

与常规版本的传输相比,使用 NIO 的主要优势之一是它可以更好地扩展并支持更多连接。在这种情况下,主要限制是系统使用的线程数量。在阻塞实现的传输中,每个连接使用一个线程。在 NIO 实现中,有一个共享的线程池来承担负载,因此连接数量与系统中使用的线程数量没有直接关系。

您可以使用以下系统属性(自 5.15.0 起可用)来调整传输使用的线程数量。

属性 默认值 描述
org.apache.activemq.transport.nio.SelectorManager.corePoolSize 10 池中要保留的线程数量,即使它们处于空闲状态
org.apache.activemq.transport.nio.SelectorManager.maximumPoolSize 1024 允许池中存在的最大线程数
org.apache.activemq.transport.nio.SelectorManager.workQueueCapacity  0  在扩展池之前,最大工作队列深度
org.apache.activemq.transport.nio.SelectorManager.rejectWork false 允许在容量达到时使用 IOException 拒绝工作,以便可以保留现有的 QOS

如果要扩展您的代理以支持数千个连接,您需要首先找到 JVM 进程允许创建的线程数量限制。然后,您可以将这些属性设置为该限制以下的某个值(代理需要更多线程才能正常运行)。有关目标和如何限制目标线程使用量的更多信息,请查看 扩展队列 或 此配置文件。例如,您可以添加以下内容

ACTIVEMQ_OPTS="$ACTIVEMQ_OPTS -Dorg.apache.activemq.transport.nio.SelectorManager.corePoolSize=2000 -Dorg.apache.activemq.transport.nio.SelectorManager.maximumPoolSize=2000 -Dorg.apache.activemq.transport.nio.SelectorManager.workQueueCapacity=1024"

到启动脚本(例如,${ACTIVEMQ_HOME}/bin/env)中,以拥有一个由 2000 个线程组成的常量池来处理连接。使用这种设置,代理应该能够接受系统限制内的连接数量。当然,接受连接只是故事的一部分,因此在垂直扩展代理方面还有其他限制。

Apache、ActiveMQ、Apache ActiveMQ、Apache 羽毛徽标和 Apache ActiveMQ 项目徽标是 Apache 软件基金会的商标。版权所有 © 2024,Apache 软件基金会。根据 Apache 许可证 2.0 获得许可。