Message dispatch高级特性之 Message cursors
概述
ActiveMQ发送持久消息的典型处现方式是:当消息的消费者准备就绪时,消息发送系统把存储的
消息按批次发送给消费者,在发送完一个批次的消息后,指针的标记位置指向下一批次待发送消息的位
置,进行后续的发送操作。这是一种比较健壮和灵活的消息发送方式,但大多数管况下,消息的消费者
不是一直处于这种理想的活跃状态
因此,从 ActiveMQ5.0.0版本开始,消息发送系统采用一种混合型的发送模式,当消息消费者处
理活跃状态时,允许消息发送系统直接把持久消息发送给消费者,当消费者处于不活跃状态下,切换使
用 Cursors来处理消息的发送
当消息消费者处于活跃状态并且处理能力比较强时,祓持久存储的消息直接被发送到与消费者
关联的发队列。如图下:
当消息已经出现积压,消费者再开始活跃:或者消责者的消费速度比消息的发送速度慢
时,消息将从 Pending Cursor中提取,并发送与消费者关联的发送队列。见下图
根据游标的保存方式不同,可分为三种:
Store-based cursors
broker默认采用的游标。它将游标信息保存在存储中。
针对速度不同的消费者,这种游标机制采取的方式不同。
对于快速消费者,因为消费速度很快,存储中的消息数量会很少,所以不需要游标。
这时,消息发送到broker时,先保存在持久存储中,然后直接发送给了消费者。
而对于慢消费者,消息的持久存储中会保存大量的消息,所以需要使用游标来指定下一次批量读取消息的位置。
VM cursors
若消费者能跟上生产者生产的速度,这时持久存储中消息虽然不是很多,
但是若能也能在内存中保存一些游标,对获取存储中的消息的性能会有很大的提升。
File-based cursors
对VM cursors 的一种改进。当内存中的游标达到一定限额后,就会将一些游标存储到临时文件中。
配置使用
在缺省情况下, ActiveMQ会根据使用的 Message store来决定使用何种类型的 Message Cursors,
但是你可以根据 destination来配置 Message cursors,例如:
1:对Topic subscribers
<destinationPolicy> <policyMap> <policyEntries> <policyEntry topic="org.apache.>" producerFlowControl="false" memoryLimit="1mb"> <dispatchPolicy> <strictOrderDispatchPolicy /> </dispatchPolicy> <deadLetterStrategy> <individualDeadLetterStrategy topicPrefix="Test.DLQ." /> </deadLetterStrategy> <pendingSubscriberPolicy> <vmCursor /> </pendingSubscriberPolicy> <pendingDurableSubscriberPolicy> <vmDurableCursor/> </pendingDurableSubscriberPolicy> </policyEntry> </policyEntries> </policyMap> </destinationPolicy>
配置说明:
有效的 Subscriber类型是 vmCursor和 fileCursor,缺省是 store based cursor。有效的持久
化 Subscriber的 cursor types是 storeDurabTeSubscriberCursor, vmDurableCursor和
fileDurableSubscriberCursor,缺省是 store based cursor.
<destinationPolicy> <policyMap> <policyEntries> <policyEntry queue="org.apache.>"> <deadLetterStrategy> <individualDeadLetterStrategy queuePrefix="Test.DLQ."/> </deadLetterStrategy> <pendingQueuePolicy> <vmQueueCursor /> </pendingQueuePolicy> </policyEntry> </policyEntries> </policyMap> </destinationPolicy>
配置说明:有效的类型是storeCursor, vmQueueCursor 和 fileQueueCursor