基本连接配置
在ActiveMQ的官方网站上,列出了目前ActiveMQ中支持的所有消息协议,它们是:AMQP、MQTT、OpenWire、REST、Stomp、XMPP;
不同的协议需要设置不同的网络监听端口,这个相关设置在ActiveMQ安装目录的/conf/activemq.xml
主配置文件中。主配置文件采用XML格式进行描述,其中的transportConnectors
标记描述了各种协议的网络监听端口,示例如下:
<transportConnectors>
<transportConnector name="openwire" uri="tcp://0.0.0.0:61616?maximumConnections=1000&wireFormat.maxFrameSize=104857600"/>
<transportConnector name="amqp" uri="amqp://0.0.0.0:5672?maximumConnections=1000&wireFormat.maxFrameSize=104857600"/>
<transportConnector name="stomp" uri="stomp://0.0.0.0:61613"/>
<transportConnector name="mqtt" uri="mqtt://0.0.0.0:1883?maximumConnections=1000&wireFormat.maxFrameSize=104857600"/>
<transportConnector name="ws" uri="ws://0.0.0.0:61614?maximumConnections=1000&wireFormat.maxFrameSize=104857600"/>
</transportConnectors>
以上配置了openwire
协议的接入端口号为本机所有IP设备的61616
(0.0.0.0代表本机所有IP设备);配置amqp
协议的接入端口号为本机所有IP设备的5672
;配置stomp
协议的接入端口号为本机所有IP设备的61613
,等等。这里注意以下几个事实:
- 每一个
transportConnector
标记的 name 属性和 uri 属性都必须填写,name 属性的值可以随便填写,它将作为一个Connector元素,显示在ActiveMQ管理界面的Connections栏目中; - 每一个
transportConnector
标记的 uri 元素,都有固定写法:
- uri 头是指定的协议名称,例如:amqp、mqtt、stomp等;
- 然后是HOST/IP域名,指定端口监听所在的路由信息;
- 接下来是端口信息,指定的端口不能重复,否则会产生冲突。
- URI参数部分,每一种协议都有一些特定的参数,读者可参考ActiveMQ官网中,关于协议部分的介绍。但是有些参数却是各种协议都可共用的,例如以上实例中使用的
maximumConnections
属性,代表这个端口支持的最大连接数量;wireFormat.maxFrameSize
属性代表支持协议的“一个完整消息”的最大数据量(单位为byte);您可以在ActiveMQ官网中对wire formats的参数描述中,找到这些默认属性。 - URI参数部分,各协议可共用的参数还包括基本连接特性相关的参数。另外如果您使用的是
TCP
协议,您还可以在URI参数部分加入TCP相关的属性描述;如果您使用的是UDP协议,那么您还可以在URI参数部分加入UDP相关的属性描述。 -
transportConnector
标记中,除了必须填写的 name 属性和 uri 属性以外还有一些可选择的属性,例如:enableStatusMonitor
、updateClusterClients
。详细的属性介绍可参考官方文档 中 “Server side options”部分章节的介绍。
特别说明
在上文给出的配置信息中,您可以发现我们在描述各种消息协议时,URI描述信息的头部都是采用协议名称。例如,描述amqp协议的监听端口时,采用的URI描述格式为amqp://……
;描述Stomp协议的监听端口时,采用的URI描述格式为stomp://……
。唯独在进行openwire协议描述时,URI头却采用的tcp://…..
。这是因为ActiveMQ中默认的消息协议就是openwire。
ActiveMQ完整支持AMQP协议。但是读者会发现ActiveMQ中并没有存在Exchange这样的结构。这是怎么回事呢?实际上在国际标准组织 (ISO) 和国际电工委员会 (IEC) 制定的AMQP Version 1.0 规范文档中,并没有说AMQP 消息必须经过Exchange规则才能够到达队列,也没有规定Exchange 必须要实现某种规则的路由。所以在支持AMQP协议时,是否需要有Exchange这样的路由处理规则,完全取决于AMQP的消息中间件软件厂商自己的决定。
网络配置优化
ActiveMQ在Version 5.13.0+ 版本后,将OpenWire, STOMP, AMQP, MQTT这四种主要协议的端口监听进行了合并,并使用auto
关键字进行表示。也就是说,ActiveMQ将监听这一个端口的消息状态,并自动匹配合适的协议格式。配置如下:
<transportConnectors>
<transportConnector name="auto" uri="auto://0.0.0.0:61617?maximumConnections=1000" />
</transportConnectors>
以上的URI配置信息中,可以使用所有通用的Connection Configuration、Wire Formats Configuring、Server side options和TCP Transport Configuration配置项。但是这种优化只是让ActiveMQ的连接管理变得简洁了,并没有提升单个节点的处理性能。
如果不特别指定ActiveMQ的网络监听端口,那么这些端口都将使用BIO网络IO模型。所以为了提高单节点的网络吞吐性能,我们需要明确指定Active的网络IO模型,如下所示:
<transportConnectors>
<transportConnector name="nio" uri="nio://0.0.0.0:61618?maximumConnections=1000"/>
</transportConnectors>
请注意,URI格式头以nio
开头,表示这个端口使用以TCP协议为基础的NIO网络IO模型。但是这样的设置方式,只能使这个端口支持Openwire
协议。那么我们怎么既让这个端口支持NIO网络IO模型,又让它支持多个协议呢?ActiveMQ的服务端设置,允许开发人员使用+
符号来为端口设置多种特性,如下:
// 表示这个端口使用NIO模型支持Stomp协议
<transportConnector name="stomp+nio" uri="stomp+nio://0.0.0.0:61613?transport.transformer=jms"/>
// 表示这个端口支持amqp和ssl密文传输
<transportConnector name="amqp+ssl" uri="amqp+ssl://localhost:5671"/>
所以如果我们既需要某一个端口支持NIO网络IO模型,又需要它支持多个协议,那么可以进行如下的配置:
<transportConnector name="auto+nio" uri="auto+nio://0.0.0.0:61608?maximumConnections=1000" />
另外,如果是为了生产环境进行的配置,那么至少应该还要配置这个端口支持的最大连接数量、设置每一条消息的最大传输值、设置NIO使用的线程池最大工作线程数量:
<transportConnector name="auto+nio" uri="auto+nio://0.0.0.0:61608?maximumConnections=1000&wireFormat.maxFrameSize=104857600&org.apache.activemq.transport.nio.SelectorManager.corePoolSize=20&org.apache.activemq.transport.nio.SelectorManager.maximumPoolSize=50" />
以下附图是改变网络连接设置后,ActiveMQ管理控制台中Connections页面显示的内容。注意ws协议的端口是额外保留的配置——因为auto模式中的协议不支持ws: