ActiveMQ教程(5)— 优化1:网络配置优化

基本连接配置


在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&amp;wireFormat.maxFrameSize=104857600"/>
    <transportConnector name="amqp" uri="amqp://0.0.0.0:5672?maximumConnections=1000&amp;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&amp;wireFormat.maxFrameSize=104857600"/>
    <transportConnector name="ws" uri="ws://0.0.0.0:61614?maximumConnections=1000&amp;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 属性以外还有一些可选择的属性,例如:enableStatusMonitorupdateClusterClients。详细的属性介绍可参考官方文档 中 “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&amp;wireFormat.maxFrameSize=104857600&amp;org.apache.activemq.transport.nio.SelectorManager.corePoolSize=20&amp;org.apache.activemq.transport.nio.SelectorManager.maximumPoolSize=50" />

以下附图是改变网络连接设置后,ActiveMQ管理控制台中Connections页面显示的内容。注意ws协议的端口是额外保留的配置——因为auto模式中的协议不支持ws:
这里写图片描述

阅读更多
想对作者说点什么?

博主推荐

换一批

没有更多推荐了,返回首页