ActiveMQ 笔记(五)ActiveMQ的传输协议

个人博客网:https://wushaopei.github.io/    (你想要这里多有)

面试思考题:

  1. 默认的61616端口如何更改
  2. 你生产上的连接协议如何配置的?使用tcp吗?

一、Activemq的传输协议

传输协议官网连接:http://activemq.apache.org/configuring-version-5-transports.html

1、定义:

ActiveMQ支持的client-broker通讯协议有:TVP、NIO、UDP、SSL、Http(s)、VM。

ActiveMQ 笔记(五)ActiveMQ的传输协议

其中配置Transport Connector的文件在ActiveMQ安装目录的conf/activemq.xml中的<transportConnectors>标签之内。
见下图实际配置:

[root@wsp conf]# pwd
/myactiveMQ/apache-activemq-5.15.9/conf
[root@wsp conf]# vim activemq.xml

ActiveMQ 笔记(五)ActiveMQ的传输协议

这是activemq 的activemq.xml 中配置文件设置协议的地方:

ActiveMQ 笔记(五)ActiveMQ的传输协议ActiveMQ 笔记(五)ActiveMQ的传输协议

在上文给出的配置信息中,URI描述信息的头部都是采用协议名称:例如

描述amqp协议的监听端口时,采用的URI描述格式为“amqp://······”;
描述Stomp协议的监听端口时,采用URI描述格式为“stomp://······”;
唯独在进行openwire协议描述时,URI头却采用的“tcp://······”。这是因为ActiveMQ中默认的消息协议就是openwire

ActiveMQ 笔记(五)ActiveMQ的传输协议

注意:Activemq中,默认是使用 openwire 也就是 tcp 连接

默认的Broker 配置,TCP 的Client 监听端口 61616 ,在网络上传输数据,必须序列化数据,消息是通过一个 write protocol 来序列化为字节流。默认情况 ActiveMQ 会把 wire protocol 叫做 Open Wire ,它的目的是促使网络上的效率和数据快速交互 。

2、传输协议有哪些

 ActiveMQ 支持的协议有 TCP 、 UDP、NIO、SSL、HTTP(S) 、VM 、WS、Stomp等

ActiveMQ 笔记(五)ActiveMQ的传输协议

2.1 Transmission Control Protocol(TCP)默认

(1) 这是默认的Broker配置,TCP的Client监听端口61616

(2)在网络传输数据前,必须要先序列化数据,消息是通过一个叫wire protocol的来序列化成字节流。

(3)TCP连接的URI形式如:tcp://HostName:port?key=value&key=value,后面的参数是可选的。

(4) TCP传输的的优点:

(4.1)TCP协议传输可靠性高,稳定性强
             (4.2)高效率:字节流方式传递,效率很高
             (4.3)有效性、可用性:应用广泛,支持任何平台

(5)关于Transport协议的可选配置参数可以参考官网

http://activemq.apache.org/configuring-version-5-transports.html

2.2 New I/O API Protocol(NIO)

(1)NIO协议和TCP协议类似,但NIO更侧重于底层的访问操作。它允许开发人员对同一资源可有更多的client调用和服务器端有更多的负载。
(2)适合使用NIO协议的场景:
             (2.1)可能有大量的Client去连接到Broker上,一般情况下,大量的Client去连接Broker是被操作系统的线程所限制的。因此,NIO的实现比TCP需要更少的线程去运行,所以建议使用NIO协议。
             (2.2)可能对于Broker有一个很迟钝的网络传输,NIO比TCP提供更好的性能。
(3)NIO连接的URI形式:nio://hostname:port?key=value&key=value
(4)关于Transport协议的可选配置参数可以参考官网http://activemq.apache.org/configuring-version-5-transports.html

ActiveMQ 笔记(五)ActiveMQ的传输协议ActiveMQ 笔记(五)ActiveMQ的传输协议

2.3 AMQP协议

Advanced Message Queuing Protocol,一个提供统一消息服务的应用层标准高级消息队列协议,是应用层协议的一个开放标准,为面向消息的中间件设计。基于此协议的客户端与消息中间件可传递消息,并不受客户端/中间件不同产品,不同开发语言等条件限制。

ActiveMQ 笔记(五)ActiveMQ的传输协议ActiveMQ 笔记(五)ActiveMQ的传输协议

2.4 Stomp协议

STOP,Streaming Text Orientation Message Protocol,是流文本定向消息协议,是一种为MOM(Message Oriented Middleware,面向消息中间件)设计的简单文本协议。

2.5 MQTT协议

MQTT(Message Queuing Telemetry Transport,消息队列遥测传输)是IBM开发的一个即时通讯协议,有可能成为物联网的重要组成部分。该协议支持所有平台,几乎可以把所有联网物品和外部连接起来,被用来当作传感器和致动器(比如通过Twitter让房屋联网)的通信协议。

扩展:Github

小总结:

ActiveMQ 笔记(五)ActiveMQ的传输协议ActiveMQ 笔记(五)ActiveMQ的传输协议

3、NIO案例演示(启用NIO协议)

(1)说明:

官网:http://activemq.apache.org/configuring-version-5-transports.html

The NIO Transport
Same as the TCP transport, except that the New I/O (NIO) package is used, which may provide better performance. The Java NIO package should not be confused with IBM’s AIO4J package.
To switch from TCP to NIO, simply change the scheme portion of the URI. Here’s an example as defined within a broker’s XML configuration file.

ActiveMQ 笔记(五)ActiveMQ的传输协议ActiveMQ 笔记(五)ActiveMQ的传输协议

Trying to use nio transport url on the client side will instantiate the regular TCP transport. For more information see the NIO Transport Reference

(2)修改 activemq.xml 使之支持 NIO 协议:

<transportConnectors>
<transportConnector name="nio" uri="nio://0.0.0.0:61618?trace=true" />
</transportConnectors>

ActiveMQ 笔记(五)ActiveMQ的传输协议

如果你不特别指定ActiveMQ的网络监听端口,那么这些端口都讲使用BIO网络IO模型所以为了首先提高单节点的网络吞吐性能,我们需要明确指定ActiveMQ网络IO模型。
如下所示:URI格式头以“nio”开头,表示这个端口使用以TCP协议为基础的NIO网络IO模型。

 <transportConnector name="openwire" uri="tcp://0.0.0.0:61616?maximumCon    nections=1000&wireFormat.maxFrameSize=104857600"/>
<transportConnector name="amqp" uri="amqp://0.0.0.0:5672?maximumConnect ions=1000&wireFormat.maxFrameSize=104857600"/>
<transportConnector name="stomp" uri="stomp://0.0.0.0:61613?maximumConn ections=1000&wireFormat.maxFrameSize=104857600"/>
<transportConnector name="mqtt" uri="mqtt://0.0.0.0:1883?maximumConnect ions=1000&wireFormat.maxFrameSize=104857600"/>
<transportConnector name="ws" uri="ws://0.0.0.0:61614?maximumConnection s=1000&wireFormat.maxFrameSize=104857600"/>
<transportConnector name="nio" uri="nio://0.0.0.0:61618?trace=true"/> <!-- 这是添加的 --> </transportConnectors>

ActiveMQ 笔记(五)ActiveMQ的传输协议

ActiveMQ 笔记(五)ActiveMQ的传输协议ActiveMQ 笔记(五)ActiveMQ的传输协议

而使用 NIO 协议,代码修改量极小,只需同时将消息生产者和消费者的 URL 修改即可:

//public static final String ACTIVEMQ_URL = "tcp://192.168.17.3:61616";

public static final String ACTIVEMQ_URL = "nio://192.168.17.3:61618";

ActiveMQ 笔记(五)ActiveMQ的传输协议

修改之后即可正确运行

4、nio 增强

问题:URI 格式以 nio 开头,表示这个端口使用 tcp 协议为基础的NIO 网络 IO 模型,但这样设置让它只支持 tcp 、 nio 的连接协议。如何让它支持多种协议?

ActiveMQ 笔记(五)ActiveMQ的传输协议ActiveMQ 笔记(五)ActiveMQ的传输协议

Starting with version 5.13.0, ActiveMQ supports wire format protocol detection. OpenWire, STOMP, AMQP, and MQTT can be automatically detected. This allows one transport to be shared for all 4 types of clients.

使用 :auto+nio+ssl

官网介绍 : http://activemq.apache.org/auto

使用 auto 的方式就相当于四合一协议 : STOMP AMQP MQTT TCP NIO

<transportConnector name="auto+nio" uri="auto+nio://localhost:5671"/>

ActiveMQ 笔记(五)ActiveMQ的传输协议

auto 就像是一个网络协议的适配器,可以自动检测协议的类型,并作出匹配。使用"+"符号来为端口设置多种特性

<transportConnector name="auto" uri="auto://localhost:5671?auto.protocols=default,stomp"/>

ActiveMQ 笔记(五)ActiveMQ的传输协议

配置文件修改:

        …… 

<transportConnector name="auto+nio" uri="auto+nio://0.0.0.0:61608?maximumConnections=1000
&wireFormat.maxFrameSize=104857600&org.apache.activemq.transport.nio.SelectorManager.corelPoolSize=20
&org.apache.activemq.transport.nio.SelectorManager.maximumPoolSize=50"/>

ActiveMQ 笔记(五)ActiveMQ的传输协议

连接:

ActiveMQ 笔记(五)ActiveMQ的传输协议ActiveMQ 笔记(五)ActiveMQ的传输协议

消息发送成功

ActiveMQ 笔记(五)ActiveMQ的传输协议ActiveMQ 笔记(五)ActiveMQ的传输协议

同样代码只需修改 URI

public static final String ACTIVEMQ_URL = "nio://192.168.17.3:61608";

ActiveMQ 笔记(五)ActiveMQ的传输协议

对于 NIO 和 tcp 的代码相同,但不代表使用其他协议代码相同,因为底层配置不同,其他协议如果使用需要去修改代码

上一篇:activeMq笔记


下一篇:rocketmq延时消息