高可用(主从)与负载均衡架构图
消息发送中的接收Topic订阅结果消息队列URL地址、消息接收队列URL地址、消息代理的发送与接收队列URL地址以及消息转发器发送的Topic结果消息队列URL地址,均需设置为Failover 地址。由于消息队列组件ActiveMQ是设置为主从的,因此不论什么组件连接消息队列的URL地址均需配置为主从Failover地址。
- <broker xmlns="http://activemq.apache.org/schema/core" brokerName="localhost" dataDirectory="${activemq.data}" advisorySupport="false">
5. 消息队列组件ActiveMQ配置
通过改动消息队列组件ActiveMQ的配置文件activemq.xml。以“效率优先”的原则调整相关參数。配置说明例如以下:
5.1 ActiveMQ消息通知配置
消息通知实现了ActiveMQ的Broker上各种操作的记录跟踪和通知。可是在使用暂时队列实现同步消息时我们发现ActiveMQ产生了大量advisory通知消息,而且这些消息重复在网络中传输。这有可能与ActiveMQ 同步消息ACK机制有关。
取消消息通知的配置方法,在配置文件里添加例如以下配置:
- <broker xmlns="http://activemq.apache.org/schema/core" brokerName="localhost" dataDirectory="${activemq.data}" advisorySupport="false">
5.2删除不活动的队列配置
ActiveMQ的Queue在不使用之后,能够通过web控制台或是JMX方式来删除掉。
也能够通过配置。使得Broker能够自己主动探測到没用的队列(一定时间内为空的队列)并删除掉,回收响应资源。因为ActiveMQ使用时自己主动创建Destination。而且默认情况下不会删除掉。这样的仅仅添加不降低。导致在queue创建频繁的情况下,本功能很实用。
配置例如以下:
- <broker xmlns="http://activemq.apache.org/schema/core" schedulePeriodForDestinationPurge="10000" advisorySupport="false">
- <destinationPolicy>
- <policyMap>
- <policyEntries>
- <policyEntry queue=">" gcInactiveDestinations="true" inactiveTimoutBeforeGC="10000"/>
- </policyEntries>
- </policyMap>
- </destinationPolicy>
- </broker>
參数说明:
1) schedulePeriodForDestinationPurge:10000 每十秒检查一次,
默觉得0,此功能关闭
2) gcInactiveDestinations:true 删除掉不活动队列。默觉得false
3) inactiveTimoutBeforeGC:30000 不活动30秒后删除,默觉得60秒
5.3死信队列配置
DLQ-死信队列(Dead Letter Queue)用来保存处理失败或者过期的消息。出现下面情况时,消息会被再投递
1)A transacted session is used and rollback() is called.
2)A transacted session is closed before commit is called.
3)A session is using CLIENT_ACKNOWLEDGE and Session.recover() is called.
当一个消息被redelivered超过maximumRedeliveries(缺省为6次)次数时,会给broker发送一个"Poison ack"。这个消息被觉得是a poison pill,这时broker会将这个消息发送到DLQ,以便兴许处理。
缺省的死信队列是ActiveMQ.DLQ。假设没有特别指定。死信都会被发送到这个队列。缺省持久消息过期,会被送到DLQ,非持久消息不会送到DLQ
缺省全部队列的死信消息都被发送到同一个缺省死信队列(ActiveMQ.DLQ)。不便于管理。能够通过individualDeadLetterStrategy或sharedDeadLetterStrategy策略来进行改动。
生产环境的配置例如以下:
- <policyEntry queue=">">
- <deadLetterStrategy>
- <!-- Use the prefix 'DLQ.' for the destination name, and make
- the DLQ a queue rather than a topic -->
- <individualDeadLetterStrategy queuePrefix="DLQ." useQueueForQueueMessages="true" />
- </deadLetterStrategy>
- <!--简单丢弃过期消息,而不将它们放到DLQ中,完全跳过DLQ-->
- <!--<deadLetterStrategy>
<sharedDeadLetterStrategy processExpired="false" />
</deadLetterStrategy>-->
- </policyEntry>
queuePrefix:设置死信队列前缀
useQueueForQueueMessages: 设置使用队列保存死信。还能够设置useQueueForTopicMessages,使用Topic来保存死信
5.4 消息队列数过多问题
默认的消息队列配置中使用一个独立的线程负责将消息存储中的消息提取到消息队列中,而后再被分发到对其感兴趣的消息消费者。假设有大量的消息队列,建议通过启用optimizeDispatch这个属性改善这个特性,演示样例代码例如以下所看到的:
- <destinationPolicy>
- <policyMap>
- <policyEntries>
- <policyEntry queue=">" optimizedDispatch="true"/>
- </policyEntries>
- </policyMap>
- </destinationPolicy>
代码清单中使用通配符“>”表示该配置会递归的应用到全部的消息队列中。
原文地址:http://www.cnblogs.com/lytwajue/p/7090931.html