消息中间件之ActiveMQ — 06

使用细节

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有可能造成消息堆积

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值