传输协议: 即client-broker的通讯协议
思考:什么场景使用什么协议?
TCP协议特点:高可靠性 高稳定性 高传输效率 应用广泛
NIO协议特点:连接量大的时候,会出现受线程数限制的情况,NIO比TCP性能好
UDP:允许出现数据包丢失的情况可以使用
HTTP:待补充
VM:待补充
SSL:待补充
举个例子,添加NIO协议:
1、 在/conf/activemq.xml的标签下添加nio协议(类似tcp:0.0.0.0:61616),修改完成后,重启。
2、建新连接工厂时选择 new ActiveMQConnectionFactory(“nio:172.1.1.19:61618”);
持久化
存储方式:
1、AMQ 基于文件的存储方式(5.0版本前的默认)
2、Kahadb (5.0版本后的默认),在/conf/activemq.xml的标签下查看相关配置
3、JDBC消息存储:消息表 消息响应表 锁定表
3.1 在/conf/activemq.xml的标签下配置持久化方式及数据源
3.2 会自动在配置的数据库生成相关表
3.3 导入相关依赖的jar包到/lib/目录下
3.4 生产者生产消息后,消息表会生成数据;消费者消费了消息后,消息表会清空对应的消息
4、带缓存的JDBC持久化
<persistenceFactory>
<journalPersistenceAdapterFactory dataSource = "#mysql-ds" dataDirectory="activemq-data" />
</persistenceFactory>
5、MEMORY基于内存的方式
几种持久化方式对比 :journal性能优于jdbc,jdbc一般用于master-slave模式。一般使用journal
ActiveMQ集群
1、queue consumer cluster (队列消费者集群)
消息者集群,多开几个消费者监听,就是集群
2、broker cluster (broker集群)
集群模式 1:静态网络连接
2种连接器 :TransportConnector(tcp/udp,生产者或消费者和broker之间)和NetworkConnector(borker与broker之间)
activemq-xml配置
<networkConnectors>
<networkConnector uri="static:(tcp://192.1.1.19:61616)"/>
</networkConnectors>
超过3台时
<networkConnector uri="static:(tcp://192.1.1.19:61616,tcp://...)"/>
注意:多台broker之间要做双向配置,如brokerA要配brokerB的地址,brokerB要配brokerA的地址
消息回流
brokerA和borkerB集群,生产者1往brokerA发10条消息,然后消费者1从brokerA取2条消息,取了2条后,消费者1挂掉,剩下8条消息就会转到borkerB,消费者1起来后,再去borkerA取消息就取不到了。为了解决这个问题,需要配置消息回流,让消息从borkerB回流到borkerA。
borkerA和borkerB都要做以下配置(queue=”>” 表示任何队列)
<policyEntry queue=">" enableAudit="false">
<networkBridgeFilterFactory>
<conditionalNetworkBridgeFilterFactory replayWhenNoConsumers="true"/>
</networkBridgeFilterFactory>
</policyEntry>
管道订阅(负载均衡)
<networkConnectors>
<networkConnector uri="static:(tcp://192.1.1.19:61616)" conduitSubscriptions="true"/>
</networkConnectors>
注意:conduitSubscriptions=”true” 表示消息均衡分摊到所有broker;conduitSubscriptions=”false” 表示消息均衡分摊到所有消费者
容错连接(failover protocol)
new ActiveMQConnectionFactory("failover:(tcp://192.1.1.19:61616,tcp://192.1.1.18:61616)?randomize=false");
注意:randomize=false 相当于master-slave模式;randomize=true 就是均衡负载
其他参数
1. initialReconnectDelay
2. maxReconnectDelay
3. useExponentialBackOff
思考:TransportConnector和NetworkConnector的连接方式有几种?
集群模式2:动态网络连接
<networkConnectors>
<networkConnector uri="multicas://default"/>
</networkConnectors>
如果集群的broker太多,此种方式可自动发现其他broker。(用的比较少)
Master-Slave模式
1、文件共享 Share file system master slave
通过共享存储目录实现master和slave的热备,所有broker都在不断获取共享目录的控制权,谁抢到了控制权,谁就是master
2、JDBC Master
通过配置多台broker的JDBC连接到同一个DB,谁先起来先抢到DB的锁,谁就是master
Destinantion 高级特性
组合队列,会把消息分发到多个队列
destinantion = session.createQueue("queue1,queue2,queue3");