ActiveMQ 中的消息游标(Message cursors)

转载 2015年11月18日 22:37:06
在Activemq以前的版本中,broker会把待发送的消息保存在内存中。这种方式的缺陷是当消费者消费的速度赶不上生产者的速度时,会在broker的内存中积攒大量的消息,当达到一个限额后,broker就不再接收消息。这时生产者就被阻塞了,直到broker将内存清理能保存消息后才能继续发送。 
   在5.0版本后,Activemq实现了一种新的内存模型来防止慢消费者阻塞快速生产者。通常消息在未发生或者发送后未收到消费者的确认信息时都会持久保存消息到存储中。当有消费者来可以消费消息时,broker会批量从存储中取出消息,发送给消费者。游标就是指向下次批量获取消息时的存储位置。 

根据游标的保存方式不同,可分为三种: 
Store-based cursors 
broker默认采用的游标。它将游标信息保存在存储中。针对速度不同的消费者,这种游标机制采取的方式不同。对于快速消费者,因为消费速度很快,存储中的消息数量会很少,所以不需要游标。这时,消息发送到broker时,先保存在持久存储中,然后直接发送给了消费者。而对于慢消费者,消息的持久存储中会保存大量的消息,所以需要使用游标来指定下一次批量读取消息的位置。 
VM cursors 
若消费者能跟上生产者生产的速度,这时持久存储中消息虽然不是很多,但是若能也能在内存中保存一些游标,对获取存储中的消息的性能会有很大的提升。 
File-based cursors 
对VM cursors 的一种改进。当内存中的游标达到一定限额后,就会将一些游标存储到临时文件中。 

Activemq默认使用store-based游标。当然也可为不同的Destination修改游标策略。通过修改destinationPolicy节点来更改默认配置。destinationPolicy节点包含多ge policyMap节点。policyMap包含一个policyEntries节点,policyEntries节点包含多个policyEntry 节点。policyEntry 就是具体的一个游标策略了。Topics的消费者分为持久订阅者和临时订阅者,所以有两套配置。Queues只有一类消费者,所以只有一套配置。对于持久订阅者可以使用PendingDurableSubscriberMessageStoragePolicy来指定游标策略。可配置的策略有vmDurableCursor和fileDurableSubscriberCursor. 

对于临时订阅者可以使用pendingSubscriberPolicy 来指定。可配置的策略有vmCursor和fileCursor。下面是关于Topics的一些xml配置: 
Xml代码  收藏代码
  1. <beans ... >  
  2.   <broker ...>  
  3.     ...  
  4.     <destinationPolicy>  
  5.       <policyMap>  
  6.         <policyEntries>  
  7.           <policyEntry topic="com.iona.>">  
  8.             ...  
  9.             <pendingSubscriberPolicy>  
  10.               <vmCursor />  
  11.             </pendingSubscriberPolicy>  
  12.             <PendingDurableSubscriberMessageStoragePolicy>  
  13.               <fileDurableSubscriberPolicy />  
  14.             </PendingDurableSubscriberMessageStoragePolicy>  
  15.             ...  
  16.           </policyEntry>  
  17.           ...  
  18.         </policyEntries>  
  19.       </policyMap>  
  20.     </destinationPolicy>  
  21.     ...  
  22.   </broker>  
  23.   ...  
  24. </beans>  


Queues 同样也有vm和file两种类型的游标存储策略。pendingQueuePolicy 节点的可配置子节点有vmQueueCursor和fileQueueCursor 
Xml代码  收藏代码
  1. <beans ... >  
  2.   <broker ...>  
  3.     ...  
  4.     <destinationPolicy>  
  5.       <policyMap>  
  6.         <policyEntries>  
  7.           <policyEntry queue="com.iona.>">  
  8.             ...  
  9.             <pendingQueuePolicy>  
  10.               <vmQueueCursor />  
  11.             </pendingQueuePolicy>  
  12.             ...  
  13.           </policyEntry>  
  14.           ...  
  15.         </policyEntries>  
  16.       </policyMap>  
  17.     </destinationPolicy>  
  18.     ...  
  19.   </broker>  
  20.   ...  

  1. </beans>  

转载: http://berdy.iteye.com/blog/814370

相关文章推荐

ActiveMQ消息游标

在Activemq以前的版本中,broker会把待发送的消息保存在内存中。这种方式的缺陷是当消费者消费的速度赶不上生产者的速度时,会在broker的内存中积攒大量的消息,当达到一个限额后,broker...

[jms那点事儿] JMS ( java message service )入门 + activemq消息持久化

JMS 即 java message service 是为java提供了一种创建、发送、接收消息的通用方法。可以将复杂的系统进行业务分离,变成灵活的高度解耦合的布局。同时对我们的日常业务需求开发,提供...
  • quzishen
  • quzishen
  • 2011年01月11日 12:42
  • 13035

ActiveMQ消息特性:通知消息(Advisory Message)

通知消息(Advisory Message) 简单的说就是实现了ActiveMQ的broker上各种操作的记录跟踪和通知。 使用这个功能,你可以实时的知道broker上 创建或销毁了连接,添加...
  • KimmKing
  • KimmKing
  • 2012年12月27日 15:16
  • 13724

ActiveMQ消息特性:延迟和定时消息投递(Delay and Schedule Message Delivery)

有时候我们不希望消息马上被broker投递出去,而是想要消息60秒以后发给消费者,或者我们想让消息没隔一定时间投递一次,一共投递指定的次数。。。 类似这种需求,ActiveMQ提供了一种brok...

项目程序运行一段时间就报错:超出打开游标的最大数(maximum open cursors exceeded)

项目程序运行一段时间就报错:超出打开游标的最大数(maximum open cursors exceeded)的解决办法...

关于ORACLE游标的问题(ORA-01000: maximum open cursors exceeded)

昨天在开发过程中,经常碰到ORA-01000: maximum open cursors exceeded这个错误。一看报错,知道是游标超过最大数了,以前在做DB2开发的时候,也曾遇到过类似的问题。虽...

Message Cursors

Message CursorsA common problem in previous versions of ActiveMQ was running out of RAM buffer whe...
  • xgbjmxn
  • xgbjmxn
  • 2011年01月26日 19:38
  • 541

Java+Message+Service+JMS+java消息服务

  • 2016年08月02日 17:24
  • 986KB
  • 下载

ActiveMQ: configure PostgreSQL for Message Persistence

We are gathered here today to discuss the use of datastores with ActiveMQ. ActiveMQ(AMQ) supports v...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:ActiveMQ 中的消息游标(Message cursors)
举报原因:
原因补充:

(最多只允许输入30个字)