ActiveMQ系列—ActiveMQ性能优化(中3)(消费者和生产者性能总结)

8、消费者和生产者性能总结

本小节我们介绍了基于ActiveMQ构建的消息队列系统中,生产者和消费者需要关注的重要性能点。但是整个ActiveMQ中的性能还需要各位读者在实际工作中,一点一点的去挖掘。这里我们根据已经介绍过的性能关注点进行总结:

  • 发送NON_PERSISTENT Message和发送PERSISTENT Message是有性能差异的。引起这种差异的原因是前者不需要进行持久化存储;但是这样的性能差异在某些情况下会缩小,例如发送NON_PERSISTENT Message时,由于消费者性能不够导致消息堆积,这时NON_PERSISTENT Message会被转储到物理磁盘上的“temp store”区域。

  • 发送带有事务的消息和发送不带有事务的消息,在服务器端的处理性能也是有显著区别的。引起这种差异的原因是带有事务的消息会首先记录在服务器端的“transaction store”区域,并且服务器端会带有redo日志,这样保证发送者端在发送commit指令或者rollback指令时,服务器会完整相应的处理。

  • ActiveMQ中,为消息生产者所设定的ProducerFlowControl策略非常重要,它确定消息在ActiveMQ服务端产生大量堆积的情况下,ActiveMQ将减缓接收消息,保证了ActiveMQ能够稳定的工作。您可以通过配置文件设置ProducerFlowControl策略的生效阀值,甚至可以关闭ProducerFlowControl策略(当然不建议这样做)。

  • 消息生产者端和消息消费者端都可以通过“异步”方式和服务器进行通讯(但是意义不一样)。在生产者端发送异步消息,一定要和ProducerWindowSize(回执窗口期)的设置共同使用;在消费者异步接受消息时,要记住有Prefetch这个关键的预取数值,并且PrefetchSize在非必要情况下不要设置为1。很显然适合的PrefetchSize将改善服务端和消费者端的性能。

  • JMS规范中,消息消费者端也是支持事务的。所谓消费者端的事务是指:一组消息要么全部被commit(这时消费者会向服务端发送ACK表示),要么全部被rollback(这时同一个消费者端会向自己重发这些消息,并且这些消息的redeliveryCounter属性+1);进行消息的重发是非常消耗消费者端性能的一件事情,这是因为在这个连接会话中,被Prefetch但是还没有被处理的消息将一直等待重发的消息最终被确认。

  • 为了避免带有错误业务信息的消息被无止境的重发,从而影响整个消息系统的性能。在ActiveMQ中为超过MaximumRedeliveries阀值(默认值为6,但是很明显默认值太高了,建议设置为3)的消息准备了“死信队列”。

  • 只有服务器收到了一条或者一组消息的ACK标示,才会认为这条或者这组消息被成功过的处理了。在消费者端有4种ACK工作模式,建议优先选择AUTO_ACKNOWLEDGE。如果您这样做了,那么请一定重新改小预取数量、设置OptimizeAcknowledge为true、重设OptimizeAcknowledgeTimeOut时间。这样才能保证AUTO_ACKNOWLEDGE方式工作在“延迟确认”模式下,以便优化ACK性能。

你可能感兴趣的:(activeMQ)