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&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>
可以看到这里不同的协议类型使用不同的端口号;
描述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& wireFormat.maxFrameSize=104857600& org.apache.activemq.transport.nio.SelectorManager.corePoolSize=20& org.apache.activemq.transport.nio.SelectorManager.maximumPoolSize=50" />
常用的配置是 openwire+nio 模式
没有评论