ActiveMQ系列—ActiveMQ性能优化(中3)(消费者和生产者性能总结)
2017-09-20 20:46
645 查看
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性能。
相关文章推荐
- 【java线程系列】java线程系列之线程间的交互wait()/notify()/notifyAll()及生产者与消费者模型
- activemq消息生产者与消息消费者简单例子
- jQuery-1.9.1源码分析系列(三) Sizzle选择器引擎——总结与性能分析
- java 多线程并发系列之 生产者消费者模式的两种实现
- Java的高并发编程系列(六)生产者消费者面试题解析
- 第二十三节: EF性能篇(三)之基于开源组件 Z.EntityFrameWork.Plus.EF6解决EF性能问题 第四节:一些指令总结 定时调度系列之Quartz.Net详解 第十七节:易混淆的概念(静态和非静态、拆箱和装箱) 那些年我们一起追逐的多线程(Thread、ThreadPool、委托异步调用、Task/TaskFactory、Parallerl、async和await)
- java多线程总结六:经典生产者消费者问题实现
- java多线程总结六:经典生产者消费者问题实现
- SpringCloud系列十一:SpringCloudStream(SpringCloudStream 简介、创建消息生产者、创建消息消费者、自定义消息通道、分组与持久化、设置 RoutingKey)
- activeMQ的创建生产者和消费者的demo(队列模式)
- 【java线程系列】java线程系列之线程间的交互wait()/notify()/notifyAll()及生产者与消费者模型
- Chapter 5 生产者消费者系列之传统实现
- Java多线程系列(三)—生产者消费者模型
- Java 集合系列08之 List总结(LinkedList, ArrayList等使用场景和性能分析)
- ActiveMQ系列—ActiveMQ性能优化(下1)(消息存储方案 KahaDB)
- TT和LG编程系列之线程(生产者和消费者问题)
- 分布式服务框架学习笔记9 ActiveMQ入门2 管理、生产者/消费者模式
- 生产者-消费者模式 系列 之二 ReentrantLock, Condition 篇
- 进程、线程知识点总结和同步(消费者生产者,读者写者三类问题)、互斥、异步、并发、并行、死锁、活锁的总结
- 【Active入门-2】ActiveMQ学习-生产者与消费者