中间件1.2.2-ActiveMQ支持的消息协议讲解
Activemq支持协议:
1)Activemq支持多种协议传输和传输方式,允许客户端使用多种协议连接。
2)Activemq支持的协议:AUTO、 OpenWire、AMQP、 Stomp、MQTT等
3)Activemq支持的基础传输方式:WM、TCP、SSL、UDP、Peer、Multicast、HTTP(S)等,以及更高级的 Failover、 Fanout、 Discovery、ZeroConf方式。
Active MQI的协议连接配置
在${ACTIVEMQ_ HOME}/conf/ activemq.xml中,通过配置<transportConnectors>就可以使用多种传输方式。
Activemq常用的传输方式及配置
TCP
由于TCP具有可靠传输的特性,它在 Activemq中也是最常使用的一种协议。在默认的配置中,TCP连接的端口为61616
TCP配置格式: tcp://hostname:port?key=value
TCP配置参数说明
在服务器端配置时,参数要以“ transport.”开头
在客户端连接时,参数省略“ transport.前缀
服务器端配置示例:
tcp://localhost:61616?transport.threadName&transport.trace=false&transport.soTimeout=60000
客户端配置示例:
tcp://localhost:61616?threadName&trace=false&soTimeout=60000
TCP配置参数说明:
属性 | 默认值 | 描述 |
backlog | 5000 | 指定传输服务器套接字等待接受的最大连接数 |
connectionTimeout | 30000 | 超时时间,>=1时才有超时时间(单位为毫秒)。为0表示没有超时,负值被忽略。 |
daemon | false | 如果为true,则传输线程将以守护进程模式运行。 将代理嵌入 Spring容器或Web容器中时,请将此参数设置为true,以允许容器正确关闭。 |
dynamicmanagement | false | 如果为true,则可以通过JMX管理 |
ioBufferSize | 8*1024 | 协议解析使用的缓冲区的大小。(非TCP缓冲区) |
jmxPort | 1099 | (仅在客户端有效)JMX端口 |
keepAlive | false | 如果为true,则在Broker连接上启用 TCP Keepalive,以防止连接在TCP级别超时。 这不要和InactivityMonitor使用的KeepAliveInfo消息混淆 |
maximumConnections | Integer.MIN_VALUE | broker允许的最大 socket数量 |
socketBufferSize | 64*1024 | 设置接受的套接字读写缓冲区的大小(以字节为单位) |
soLinger | Integer.MIN_VALUE | 当值>-1时,设置套接字的选项 solinger;设置为-1时,将禁用Solinger套接字选项。 |
soTimeout | 0 | 设置套接字的读取超时(以毫秒为单位),值0表示没有超时 |
soWriteTimeout | 0 | 设置套接字的写入超时(以毫秒为单位), 0表示没有超时 |
stackSize | 0 | 设置服务端后台读取线程的堆栈大小 ;必须以128K的倍数指定;值为0表示忽略此参数。 |
startLogging | true | true,将传输信息 TransportLogger对象写入日志。仅在 trace=true的场景下生效 |
tcpNoDelay | false | 如果为true,则设置套接字的选项 ICP NODELAY。这会禁用 Naglef的小数据包传输算法。 |
threadName | N/A | 指定调用 transporte的线程名称。例如以服务器host命名,调试线程的时候可以看到 |
trace | false | 为true时,服务器记录传输发送的所有命令内容。log4j.logger.org.apache.activemq.transport.Transportlogger=DEBUG |
trafficClass | 0 | ip协议级别的服务质量参数。(0x02,0x04,0x08,0x10) |
useInactivityMonitor | true | false,则禁用 nactivitymonitor,连接永远不会超时。 |
useKeepAlive | true | true,在空闲连接上发送 Keepalivelnfo消息,防止它超时。 false,指定的时间内没有接收到数据,连接超时。 |
SSL
需要一个安全连接的时候可以考虑使用SSL,适用于 client和 broker在公网的情况,如使用aws云平台等
http://activemq.apache.org/ssl-transport-reference.html
SSL配置格式,可配置参数和TCP相同
ssl: //localhost: 61616
SSL客户端配置
JMS客户端需要使用 Activemqsslconnectionfactory类创建连接, brokerurll以ssl://开头,以下是 Spring配置示例
<bean id="AMQJMSConnectionFactory" class="org.apache.activemq.ActiveMQSslConnectionFactory">...</bean>
SSL主机名验证
从 Activemq5.15.6开始, Activemq开始支持TLS主机名验证,默认情况下客户端启用了该验证,而服务器端没有启用。
服务器端配置
ssl://localhost:61616?transport.verifyHostName=true
客户端配置
ssl://localhost:61616?socket.verifyHostName=false
或
ssl://localhost:61616?verifyHostName=false
NIO(默认BIO)
使用Java的NIO方式对连接进行改进,因为NIO使用线程池,可以复用线程,所以可以用更少的线程维持更多的连接。如果有大量的客户端,或者性能瓶颈在网络传输上,可以考虑使用NIO的连接方式。
NIO配置格式,可配置参数和TCP相同
nio://hostname:port?key=value
NIO是 Openwire协议的传输方式,其它协议,像AMQP、MQTT、 Stomp,也有NIO的现,通常在协议前缀中加“+nio”来区分。示例:
mgtt+nio://localhost:1883
NIO传输线程使用情况配置
从5.15.0开始, Active MQ支持调整NO的传输线程,可以设置以下属性
属性 | 默认值 | 描述 |
org.apacheactivemq.transportnio.Selectormanager.corePoolSize | 10 | 该心线程池线程数 |
org.apacheactivemq.transportnio.SelectorManager.maximumPoolSize | 1024 | 线程池最大线程数 |
org.apache.activemg.transport.nio.SelectorManager.workQueueCapacity | 0 | 线程池队列容量 |
org.apache.activemg.transportnio.Selectormanager.rejector | false | 当达到容量时,允许使用IOException拒绝工作,以便可以保留现有的QOS |
NIO传输线程使用情况配置
属性可以在${ACTⅣEMQ_HOME}/bin/env中配置
NIO SSL
从 Activemq5.6版本开始,NO可以支持和SsL搭配使用的传输连接
NIO+SSL配置格式,可配置参数和TCP相同
nio+ssl://1.0.0.0:61616
UDP
与面向连接,可靠的字节流服务的TCP不同,UDP是一个面向数据的简单传输连接,没有TCP的三次握手,所以性能大大强于TCP,但是是以牺牲可靠性为前提。适用于丢失也无所谓的消息。
UDP配置格式
udp://localhost:8123
UDP配置参数说明
属性 | 默认值 | 描述 |
trace | false | 为true时,将会记录传输发送的所有命令。 |
uselocalhost | true | 为true时,本机机器名被解析为 localhost |
datagramSize | 4*1024 | 指定数据报的大小 |
HTTP(S)
需要穿越防火墙,可以考虑使用HTTP(S),但由于HTTP(S)是短连接,每次创建连接的成本较高,所以性能最差。通过XML传输数据。
HTTP配置格式
http://localhost:8080?param1=val1¶m2=val2
HTTPS配置格式
https://localhost:8080?param1=val1¶m2=val2
VM
虚拟机协议(方法直调),使用场景是 client和 broker在同一个Java虚拟机内嵌的情况,无需网络通信的开销。
VM配置格式
vm://brokerName?marshal=false&broker.persistent=false
VM配置参数说明
属性 | 默认值 | 描述 |
create | true | 如果不存在,则创建 broker |
waitForStart | -1 | 如果>0,则表示等待代理启动的超时(以亳秒为单位)。值-1和0表示不等待。仅在 Activemq5.2+支持 |
wireFormat | default | 命令的组装格式(协议) |
marshal | false | 强制发送的每个命令使用 Wireformat进行格式转换 |
OpenWire协议是什么
OpenWire是 Apache的一种跨语言的协议,允许从不同的语言和平台访问Activemq,是 Active MQ4.x以后的版本默认的传输协议。
http://activemq.apache.org/openwire-version-2-specification.html
http://activemq.apache.org/wire-protocol.html
OpenWire协议如何使用
OpenWire支持TCP、SSL、NIO、UDP、VM等传输方式,直接配置这些连接,就是使用的 OpenWire协议, Openwire有自己的配置参数,客户端和服务器端配置的参数名都通过前缀“ wireFormat.”表示。
http://activemq.apache.org/configuring-wire-formats.htm
示例
tcp://localhost:61616?wireFormat.cacheEnabled=false&wireFormat.tightEncodingEnabled=false
OpenWire配置参数说明
属性 | 默认值 | 描述 |
stackTraceEnabled | true | 是否应该把已经发生并且跟踪到的堆栈异常,通过 Broker发送到客户端 |
tcpNoDelayEnabled | true | socket的 Nodelay参数 |
cacheEnabled | true | 如果不断重复的值进行缓存,以便少编组(马上要进行的发送)发生 |
tightEncodingEnabled | true | 根据CPU使用情况,自动调整传输内容大小(压缩比例) |
prefixPacketSize | true | 在每个包被编组前(马上要被发送),每个包的大小是否应该作为前缀 |
maxInactivityDuration | 30000 | 连接的最大空闲时间,以毫秒为单位broker服务会根据配置关闭超时的连接。同时也可以通过心跳机制来保持连接。值<=0则禁用活动连接的监测 |
maxInactivityDurationInitalDelay | 10000 | 连接建立之后,多久开始进行超时检测 |
cacheSize | 1024 | 如果能被缓存,那么这个规定了缓存的最大数量。此属性中在Activemqi的4.1中开始添加使用 |
maxFrameSize | MAX_LONG | 可发送最大帧大小可以帮助防止 OOM DOS攻击 |
MQTT协议是什么
MQTT( Message Queuing Telemetry Transport)消息队列遥测传输是IBM开发的一个即时通讯协议,已成为物联网通信的标准。
为什么使用MQTT协议
MQTT的结构简单,相对于其它消息协议,它更加轻量级。适合在计算能力有限、低带宽、不可靠的网络环境使用。
MQTT服务质量
什么是服务质量
服务质量(QoS)级别是一种关于发送者和接收者之间信息投递的保证协议。
MQTT中有三种QS级别:
至多一次(0)
至少一次(1)
只有一次(2)
为什么要有服务质量
QoS是MQTT的一个主要功能,它使得在不可靠的网络下进行通信变得更为简单,因为即便是在非常不可靠的网络下,协议也可以掌控是否需要重发消息并保证消息到达。它也能帮助客户端根据网络环境和程序逻辑来自由选择QoS。
它是怎样工作的-- Qos level 0~2
每日一句
博客分组
标签云
- 最近综合
- 情绪巨婴是什么 12.18
- 普通蛋糕做法 05.31
- 玉米烤肠芝士面包做法 05.31
- Mysql安装教程 - 绿色版 06.18
- 我们学习知识为什么总是忘记呢?【学习金字塔】 05.12
- Typora开发版⽆法使⽤解决⽅法 05.04
- 为什么无知者越自信? -- 达克效应 05.10
- 马斯洛需求层次理论 04.29
- 随机综合
- Java学习总结(1.1.3) 线程中止 03.17
- 鸿蒙OS代码正式开源 09.11
- Mysql安装教程 - 绿色版 06.18
- Springboot安装与开始 03.08
- Android开发,为什么Android不直接链接mysql数据库 04.12
- Java学习总结(1.1.6) 线程封闭 03.19
- 最常见最有效的隐藏外连代码_防seo黑帽隐藏外连代码 10.09
- 我们学习知识为什么总是忘记呢?【学习金字塔】 05.12