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 个线程组成的常量池来处理连接。使用这种设置,代理应该能够接受系统限制内的连接数量。当然,接受连接只是故事的一部分,因此在垂直扩展代理方面还有其他限制。