ActiveMQ处理消息积压问题

1、为什么消息会积压?
平台中每个交易的发生可能会产生一到多条的消息通知数据,这些通知数据会通过消息队列(ActiveMQ)来中转消费并处理,那么在交易量突发洪峰的情况下会产生大量的消息通知数据,如果消息队列(ActiveMQ)的消费能力被阻塞的话会严重影响到数据的吞吐量,从而积压大量数据无法被快速处理!

2、为什么配置多个消费者还是无法缓解?
①:经过分析消息队列的数据消费处理模块的代码,消息的消费处理是通过监听器SessionAwareMessageListener异步回调onMessage方法而接收消息的,但是在回调的方法onMessage上加了synchronized同步锁,问题就在这里,由于整个onMessage方法被锁,导致程序只能通过串行(一次只能消费一条数据)处理数据,而无法通过多线程并发处理数据,从而影响了整个队列的数据消费能力。

public synchronized void onMessage(Message message, Session session)

解决:去掉synchronized同步锁,因为多个消费者并发处理的数据是不同的,而且多个消费者线程并发回跳onMessage方法的时候并未使用到共享的变量,全部在各自线程的方法栈中,理论上不会出现安全性问题。

消息会被重复消费吗?
通过分析ActiveMQ的消费者消息接收处理的源代码发现,一条消息是否已经消费是通过ack确认机制来保证的,如果是通过异步回调的方式接收消息的话,在onMessage回调函数返回之后会立即进行ack确认提交,那么只要保证onMessage函数内部不抛出异常,及需要内部捕获异常,那么消息就不会被重复消息。

②优化ActiveMQ的queuePrefetch 参数:
为了提高网络的传输效率,ActiveMQ默认为Consumer批量push 多条消息,也就是说你设置prefetch为10,有150条消息,你就算配置了50个消费者,也只有15个消费者真正在工作,因为每个消费者每次都是拿10条消息,这就造成了积压问题。

解决:修改queuePrefetch参数为1,这样每个消费者每次只拿一条消息消费,其他消费者就可共同参与消费。

  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值