ActiveMQ系列:ActiveMQ传输协议

简介: ActiveMQ支持的client-broker通讯协议有:TCP、NIO、UDP、SSL、Http(s)、VM。其中配置 Transport Connector 的文件在activeMQ安装目录的 conf/activemq.xml 中的 <transportConnectors> 标签之内。

ActiveMQ系列:ActiveMQ传输协议


前面有介绍与基础、应用实践部分,有兴趣的可以移步:


初步认识了ActiveMQ:https://blog.csdn.net/qq_26975307/article/details/98875098


结合JavaSE进行初尝试:https://blog.csdn.net/qq_26975307/article/details/98968854


详细讲讲JMS:https://blog.csdn.net/qq_26975307/article/details/99408962


JMS的可靠性:https://phubing.blog.csdn.net/article/details/99412285


结合 Spring,基于配置文件的使用 ActiveMQ:https://phubing.blog.csdn.net/article/details/99413883


结合 SpringBoot,基于 application.xml 使用ActiveMQ:https://blog.csdn.net/qq_26975307/article/details/99415899


此篇企图一窥 ActiveMQ 的传输协议,有兴趣可以留言共同探讨


1、可能遇到的面试题


这篇写的挺多的,就不重复了:https://msd.misuland.com/pd/2884250137616455834

另外,如果问:你生产上的链接协议如何配置的?使用tcp吗?(黑人问号,如果是TCP那么就是单机跑的ActiveMQ)


2、ActiveMQ的传输协议


2.1、ActiveMQ支持的网络协议


20190829215337408.png


2.2、有哪些呢


不同的配置,MQ性能是不一样的

官网拜读:https://activemq.apache.org/connectivity


(1)Transmission Control Protocol(TCP)-- 默认


1、这是默认的Broker配置,TCP的Client监听端口616162.在网络传输数据前,必须要序列化数据,消息是通过一个叫wire protocol的来序列化成字节流。


2、默认情况下ActiveMQ把wire protocol叫做OpenWire,它的目的是促使网络上的效率和数据快速交互。


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


4、TCP传输的优点:

(4.1)TCP协议传输可靠性高,稳定性强

(4.3)有效性、可用性:应用广泛,支持任何平台                                                                                                       (4.2)高效性:字节流方式传递,效率很高


5、关于Transport协议的可配置参数可以参考官网:http://activemq.apache.org/configuring-version-5-transports.html


(2)New I/O API Protocol(NIO)


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


其中配置 Transport Connector 的文件在activeMQ安装目录的 conf/activemq.xml 中的  标签之内。


20190829222600277.png


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


4.Transport Connector配置示例,参考官网去:


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


The NIO Transport


Same as the TCP transport, except that the New /O(NIO) package is used, which may provide better performance. The Java NIO package should not be confused with IBM's AlO4Jpackage.


To switch from TCP to Nlo, simply change the scheme portion of the URl. Here's an example as defined within a broker's XML configuration file.


<broker>
  ...
  <transportConnectors>
    <transportConnector name="nio" uri="nio://0.0.0.0:61616"/>  
  </<transportConnectors>
  ...
</broker>


(3)AMQP 协议


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


ActiveMQ supports the AMQP 1.0 protocol which is an OASIS standard.


Availability


Available from ActiveMQ version 5.8 onward.


Enabling the ActiveMQ Broker for AMQP


To enable AMQP protocol support on the broker add the following transport connector Configuration referencing the amqp scheme in its URl:


<transportConnectors>
    <transportconnector name="amqp"uri="amqp://0.0.0.0:5672"/>
</transportConnectors>


It is enabled in the default ActiveMQ server configuration.For more help see Run Broker.


(4)MQTT协议


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


懒得看官网版:https://s2.ax1x.com/2019/08/29/mL4W38.png


怎么用呢?


Enabling the ActiveMQ Broker for MQTT

Its very easy to enable ActiveMQ for MQTT. Just add a connector to the broker using the MQTT URL.


<transportConnectors>
   <transportConnector name="mqtt" uri="mqtt://localhost:1883"/>
</transportConnectors>


扩展github:https://github.com/fusesource/mqtt-client


(如果你直接改的话,会出现下面这个错误:


Caused by:java.lang.ClassNotFoundException:org.fusesource.mqtt.codec.PINGRESP


我怎么知道?shift ...  你把tcp改成它就出现了呗,因为还需要配置,具体自行百度去,喔又不是做硬件的 ....)


(5)Secure Sockets Layer Protocol(SSL)


1、连接的URL形式:ssl://hostname:port?key=value


2、Transport Connector配置示例:


<transportConnectors>
   <transportConnector name="ssl" uri="ssl://localhost:61618?trace=true"/>
</transportConnectors>


(6)STORM 协议


STOMP,Streaming Text Orientated Message Protocol,是流文本定向消息协议,是一种为MOM(Message Oriented

Middleware,面向消息的中间件)设计的简单文本协议。


官网拜读:https://activemq.apache.org/stomp


(7)WebSocket  -- ws 协议


还是拜读官网吧:https://activemq.apache.org/websockets


2.3、NIO性能增强


(1)配置了 NIO 后性能应该可以,有没有更进一步的优化?


URI 格式头以 "nio” 开头,表示这个端口使用以TCP 协议为基础的 NIO 网络 IO 模型。但是这样的设置方式,只能使这个端

口支持 Openwire 协议。怎么既让这个端口支持 NIO 网络 IO 模型,又让它支持多个协议呢?


(2)使用auto关键字


依旧是官网拜读:https://activemq.apache.org/auto


Enabling AUTO over NIO

To configure ActiveMQ auto wire format detection over an NIO TCP connection use the auto+nio transport prefix. For example, add the following transport configuration in your XML file:


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


(3)使用“+”符号来为端口设置多种特性


如果您不特别指定 ActiveMQ 的网络监听端口,那么这些端口都将使用 BIO 网络 IO 模型。(OpenWire,STOMP,AMQP..

…)


所以为了首先提高单节点的网络吞吐性能,我需要明确指定Active的网络IO模型,如下所示:URI 格式头以 ”nio” 开头,表示这个端口使用以TCP协议为基础的 NIO 网络 IO 模型。


20190829224448755.png


(4)如果既需要某一个端口支持NIO网络lO模型,又需要它支持多个协议?

 

未完待续......(下篇开始 ActiveMQ 的持久化机制)

相关实践学习
消息队列RocketMQ版:基础消息收发功能体验
本实验场景介绍消息队列RocketMQ版的基础消息收发功能,涵盖实例创建、Topic、Group资源创建以及消息收发体验等基础功能模块。
消息队列 MNS 入门课程
1、消息队列MNS简介 本节课介绍消息队列的MNS的基础概念 2、消息队列MNS特性 本节课介绍消息队列的MNS的主要特性 3、MNS的最佳实践及场景应用 本节课介绍消息队列的MNS的最佳实践及场景应用案例 4、手把手系列:消息队列MNS实操讲 本节课介绍消息队列的MNS的实际操作演示 5、动手实验:基于MNS,0基础轻松构建 Web Client 本节课带您一起基于MNS,0基础轻松构建 Web Client
目录
相关文章
|
消息中间件 存储 缓存
服务异步通信--RabbitMQ
服务异步通信--RabbitMQ
82 0
|
2月前
|
消息中间件 网络协议 Java
消息中间件-ActiveMQ
消息中间件-ActiveMQ
|
消息中间件 Java Kafka
ActiveMQ
   MQ是消息中间件,是一种在分布式系统中应用程序借以传递消息的媒介,常用的有ActiveMQ,RabbitMQ,kafka。ActiveMQ是Apache下的开源项目,完全支持JMS1.1和J2EE1.4规范的JMS Provider实现。
176 0
ActiveMQ
|
消息中间件 存储 网络协议
深入了解ActiveMQ!
深入了解ActiveMQ!
401 0
|
消息中间件 Java 数据库
ActiveMQ系列:JMS的可靠性
持久化消息这是队列的的默认传送模式,此模式保证这些消息只被传送一次和成功使用一次。对于这些消息,可靠性是优先考虑的因素。可靠性的另一个重要方面是确保持久性消息传送至目标后,消息服务在向消费者传送它们之前不会丢失这些消息。
138 0
ActiveMQ系列:JMS的可靠性
|
消息中间件
ActiveMQ - SpringJMS 之 ActiveMQ
ActiveMQ - SpringJMS 之 ActiveMQ
56 0
ActiveMQ - SpringJMS 之 ActiveMQ
|
消息中间件 JSON 缓存
浅谈ActiveMQ
浅谈ActiveMQ
|
消息中间件 Java Spring
消息中间件系列三、JMS和activeMQ的简单使用
一、JMS 1、什么是JMS   JMS(JAVA Message Service,java消息服务)本质是API,Java平台消息中间件的规范,java应用程序之间进行消息交换。并且通过提供标准的产生、发送、接收消息的接口简化企业应用的开发。
4206 6
|
消息中间件
消息中间件的技术选型心得-RabbitMQ、ActiveMQ和ZeroMQ
版权声明:本文为博主chszs的原创文章,未经博主允许不得转载。 https://blog.csdn.net/chszs/article/details/8479072 消息中间件的技术选型心得-RabbitMQ、ActiveMQ和ZeroMQ 作者:chszs,转载需注明。
987 4
|
消息中间件 网络协议
轻松搞定RabbitMQ1:RabbitMQ与AMQP协议简介
RabbitMQ与AMQP协议详解 1. 消息队列的历史 了解一件事情的来龙去脉,将不会对它感到神秘。让我们来看看消息队列(Message Queue)这项技术的发展历史。