使用细节
Topic加强 可追溯消息
避免topic下错过消息. 官方文档
消费者设置
Destination topic = session.createTopic("test?consumer.retroactive=true");
可用的恢复策略
策略 | Sample Configuration | 描述 |
---|---|---|
FixedSizedSubscriptionRecoveryPolicy | 在RAM中为按时间顺序清除的消息历史记录保留固定数量的内存。 | |
FixedCountSubscriptionRecoveryPolicy | 保持最后消息的固定计数。 | |
LastImageSubscriptionRecoveryPolicy | 保存最后一条消息。 | |
NoSubscriptionRecoveryPolicy | 禁用消息恢复。 | |
QueryBasedSubscriptionRecoveryPolicy | 执行特定于用户的查询机制来加载他们可能错过的任何消息。消息选择器的详细信息 | |
TimedSubscriptionRecoveryPolicy | 在内存中保留一个定时的消息缓冲区,并使用它来恢复新的订阅。恢复时间以毫秒为单位。 | |
RetainedMessageSubscriptionRecoveryPolicy | 保持ActiveMQ.Retain属性设置为true的最后一条消息 |
1、保留固定字节的消息
<policyEntry topic=">">
<subscriptionRecoveryPolicy>
<fixedSizedSubscriptionRecoveryPolicy maximumSize="1024"/>
</subscriptionRecoveryPolicy>
</policyEntry>
2、保留固定数量的消息
<policyEntry topic=">">
<subscriptionRecoveryPolicy>
<fixedCountSubscriptionRecoveryPolicy maximumSize="100"/>
</subscriptionRecoveryPolicy>
</policyEntry>
3、保留时间
<subscriptionRecoveryPolicy>
<timedSubscriptionRecoveryPolicy recoverDuration="60000" />
</subscriptionRecoveryPolicy>
4、保留最后一条
<subscriptionRecoveryPolicy>
<lastImageSubscriptionRecoveryPolicy/>
</subscriptionRecoveryPolicy>
慢速消费
1、SlowConsumerStrategy
对于慢消费者,broker会启动一个后台线程用来检测所有的慢速消费者,并定期的关闭慢消费者。
AbortSlowConsumerStrategy abortConnection:中断慢速消费者,慢速消费将会被关闭。
<slowConsumerStrategy>
<!-- 不关闭底层链接 -->
<abortSlowConsumerStrategy abortConnection="false"/>
</slowConsumerStrategy>
AbortSlowConsumerStrategy maxTimeSinceLastAck:如果慢速消费者最后一个ACK距离现在的时间间隔超过阀值,则中断慢速消费者。
<slowConsumerStrategy>
<!-- 30秒滞后 -->
<abortSlowConsumerStrategy maxTimeSinceLastAck="30000"/>
</slowConsumerStrategy>
2、PendingMessageLimitStrategy:消息限制策略(面向慢消费者)
此策略只对Topic有效,只对未持久化订阅者有效,当通道中有大量的消息积压时,broker可以保留的消息量。为了防止Topic中有慢速消费者,导致整个通道消息积压。
ConstantPendingMessageLimitStrategy:保留固定条数的消息,如果消息量超过limit,将使用消息剔除策略移除消息。
<policyEntry topic="ORDERS.>">
<pendingMessageLimitStrategy>
<constantPendingMessageLimitStrategy limit="50"/>
</pendingMessageLimitStrategy>
</policyEntry>
PrefetchRatePendingMessageLimitStrategy:保留prefetchSize倍数条消息。
<prefetchRatePendingMessageLimitStrategy multiplier="2.5"/>
消息堆积内存上涨故障排查
-
检查消息是否持久化
-
检查消息 消费速度与生产速度
-
调整xms xmx参数
磁盘满时
当非持久化消息堆积到一定程度,ActiveMQ会将非持久化消息写入临时文件,但是在重启的时候不会恢复
当存储持久化数据的磁盘满时对于消息采用不同的策略:
-
持久化消息: 生产者阻塞,消费正常,当消费一部分消息后,腾出空间,生产者继续
-
非持久化消息:由于临时文件造成磁盘满了,生产者阻塞,消费异常,无法提供服务
开启事务
在发送非持久化消息的时候,可以有效防止消息丢失
prefetchSize影响消费倾斜
慢速消费的时候可以将prefetchSize
设为1
,每次取一条
同时prefetchSize
造成消费者内存溢出
AUTO_ACKNOWLEDGE造成消息丢失/乱序
消息消费失败后,无法复原消息,可以手动ack 避免broker把消息自动确认删除
注意:
-
receive()方法接受到消息后立即确认
-
listener的onmessage方法执行完毕才会确认
手动ack的时候要等connection断开才会重新推送给其他的consumer,所以有可能会导致消费顺序错乱
exclusive 和selector有可能造成消息堆积