ActiveMQ 理解1–原理与网络IO模式

2018年11月11日

MQ 是很常见的分布式中间件,被测系统和测试工具中也经常用到它们,使用它们的时候要遇到很多概念: JMS,AMQP , Producer,consumer等等,它们之间是神马关系? MQ的实现原理又是什么? 性能指标有哪些?可以通过哪些配置参数提升传输性能?

MQ基础–协议

常见的MQ有 activemq, rabbitmq, rocketmq, kafka等,常用消息队列协议的基本原理和工作方式,包括MQTT、XMPP、Stomp、AMQP、OpenWire等;

消息队列和RPC相同的是:无论是RPC也好,消息队列也好他们都建立在网络IO模型基础上(之前的文章介绍过多种网络IO模型)。先进的网络IO模型将赋予MQ协议优异的性能表现(性能也不仅仅取决于网络IO模型)

比如,AMQP协议 已经成为一种ISO 标准协议,网上材料有很多可以参考;

常见的几种MQ的特点

 

ActiveMQ

ActiveMQ是常见的开源MQ,支持AMQP协议、MQTT协议(和XMPP协议作用类似)、Openwire协议和Stomp协议等多种消息协议。并且ActiveMQ完整支持JMS API接口规范

ActiveMQ 支持的两种队列模式:

1.订阅-发布模式:

2. P2p(负载均衡)模式:

特点比较:

Jms接口和协议之间是神马关系?

JMS这套面向消息通信的 JAVA API 是一个和厂商无关的规范。通过JMS,我们能实现不同消息中间件厂商、不同协议间的转换和交互!  也就是说开发人员可以忽略各种消息协议的细节,只要消息在同一队列中,就能够保证各种消息协议间实现互相转换。

 

active MQ的网络IO模式:

默认情况下ActiveMQ的网络信息传递方式基于网络IO模型中的BIO方式(不是NIO)

不同的协议需要设置不同的网络监听端口,这个相关设置在ActiveMQ安装目录的./conf/conf/activemq.xml主配置文件中

<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>

可以看到这里不同的协议类型使用不同的端口号;

描述amqp协议的监听端口时,采用的URI描述格式为“amqp://……”;
描述Stomp协议的监听端口时,采用的URI描述格式为“stomp://……”;
在进行openwire协议描述时,URI头却采用的“tcp://…..”。ActiveMQ中默认的消息协议就是openwire
“maximumConnections”属性,代表这个端口支持的最大连接数量;
”wireFormat.maxFrameSize”属相代表支持协议的“一个完整消息”的最大数据量(单位为byte);

 

ActiveMQ在Version 5.13.0+ 版本后,将OpenWire, STOMP, AMQP, MQTT这四种主要协议的端口监听进行了合并,并使用auto关键字进行表示

<transportConnectors>
    <transportConnector name="auto" uri="auto://0.0.0.0:61617?maximumConnections=1000" />
</transportConnectors>

如果不特别指定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模型,又让它支持多个协议呢?–使用“+”符号来为端口设置多种特性,如下:

<transportConnector name="stomp+nio" uri="stomp+nio://0.0.0.0:61613?transport.transformer=jms"/> // 表示这个端口使用NIO模型支持Stomp协议 
<transportConnector name="amqp+ssl" uri="amqp+ssl://localhost:5671"/> // 表示这个端口支持amqp和ssl密文传输

如果我们既需要某一个端口支持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" />

常用的配置是 openwire+nio 模式

 

 

没有评论

发表评论

邮箱地址不会被公开。 必填项已用*标注