ActiveMQ 中的消息游标(Message cursors)

转载自:http://windows9834.blog.163.com/blog/static/273450042013119111750498/

官方:http://activemq.apache.org/message-cursors.html
       在Activemq以前的版本中,broker会把待发送的消息保存在内存中(在非持久化消息的情况下)。这种方式的缺陷是当消费者消费的速度赶不上生产者的发送速度时,会在 broker的内存中积攒大量的消息,当达到一个限额后,broker就不再接收消息。这时生产者就被阻塞了,直到broker将内存中的消息被消费后才能继续发送。 
       在5.0.0版本后,Activemq实现了一种新的内存模型来防止慢消费者阻塞快速生产者。通常消息在未消费或者发送后未收到消费者的确认信息时都会持久保存消息到存储中。当有消费者来消费消息时,broker会分页一批一批的从存储中取出消息,放入消息处理队列。游标就是指向下次批量获取消息时的存储位置。 

ActiveMQ 中的消息游标(Message cursors)

上图中表示当消费者的消费速度能跟上生产者的速度时,消息直接持久化存储后,就直接发送到消费者相关的接收代理调度队列。

ActiveMQ 中的消息游标(Message cursors)

 这个图表示,当消费者的消费速度跟不上生产者的速度时,那么消息持久化后再通过游标分页到调度队列,当消费队列空时,再通过游标一页一页的从持久化存储中获取消息。

根据游标的保存方式不同,可分为三种类型:
Store-based cursors 
broker默认采用的游标。它将游标信息保存在存储中。针对速度不同的消费者,这种游标机制采取的方式不同。对于快速消费者,因为消费速度很快,存储中 的消息数量会很少,所以不需要游标。这时,消息发送到broker时,先保存在持久存储中,然后直接发送给了消费者。而对于慢消费者,消息的持久存储中会 保存大量的消息,所以需要使用游标来指定下一次批量读取消息的位置。 
VM cursors 
若消费者能跟上生产者生产的速度,这时持久存储中消息虽然不是很多,但是若能也能在内存中保存一些游标,对获取存储中的消息的性能会有很大的提升。 
那么VM Cursors在ActiveMQ4.x中是如何工作的呢?发送消息保存在内存中,并在需要的时候传递给调度队列。这可以是非常快的,但也有不利的一面,不能够处理非常缓慢的消费者或消费者已经很长一段时间处于非活动状态:

ActiveMQ 中的消息游标(Message cursors)


File-based cursors 
对VM cursors 的一种改进。当内存中的游标达到一定限额后,就会将一些游标存储到磁盘上的临时文件中。使用这种类型的游标时,消息储存可能会变慢,但消费者处理一般都会更快。通过缓冲到磁盘,它可以让消息代理来处理不受内存限制的大量消息,而生产者发送消息的速度会受到影响:

ActiveMQ 中的消息游标(Message cursors)

Paging for Non-Persistent Messages(非持久性的消息分页调度)

Store based cursor也可以处理非持久性的消息,也就是没有存储在磁盘中的消息,非持久性消息被直接传递给游标,所以Store based cursor也只是嵌入了File based cursor的功能。

ActiveMQ 中的消息游标(Message cursors)

Configuring Cursors

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

对于临时订阅者可以使用pendingSubscriberPolicy 来指定。可配置的策略有vmCursor和fileCursor。下面是关于Topics的一些xml配置:

<beans ... >
<broker ...>
    ...
<destinationPolicy>
<policyMap>
<policyEntries>
<policyEntrytopic="com.iona.>">
            ...
<pendingSubscriberPolicy>
<vmCursor/>
</pendingSubscriberPolicy>
<PendingDurableSubscriberMessageStoragePolicy>
<fileDurableSubscriberPolicy/>
</PendingDurableSubscriberMessageStoragePolicy>
            ...
</policyEntry>
          ...
</policyEntries>
</policyMap>
</destinationPolicy>
    ...
</broker>
  ...
</beans>

Queues 同样也有vm和file两种类型的游标存储策略。pendingQueuePolicy 节点的可配置子节点有vmQueueCursor和fileQueueCursor

<beans ... >
<broker ...>
        ...   
<destinationPolicy>
<policyMap>
<policyEntries>
<policyEntryqueue="com.iona.>">  
                ...   
<pendingQueuePolicy>
<vmQueueCursor/>
</pendingQueuePolicy>
                ...   
</policyEntry>
              ...   
</policyEntries>
</policyMap>
</destinationPolicy>
        ...   
</broker>
      ...   
</beans>

相关推荐