`

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) - windows9834 - 寒江孤影

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

ActiveMQ 中的消息游标(Message cursors) - windows9834 - 寒江孤影

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

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

ActiveMQ 中的消息游标(Message cursors) - windows9834 - 寒江孤影


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

ActiveMQ 中的消息游标(Message cursors) - windows9834 - 寒江孤影

 

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

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

ActiveMQ 中的消息游标(Message cursors) - windows9834 - 寒江孤影

 

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>
分享到:
评论

相关推荐

    ActiveMQ队列消息过期时间设置和自动清除解决方案.docx

    在 ActiveMQ 中,可以通过设置时间戳插件来实现消息过期时间设置。该插件可以根据消息的过期时间来删除消息。配置示例如下: ... &lt;!-- 86,400,000ms = 1 day --&gt; ... 其中,ttlCeiling 表示过期时间...

    springboot集成activemq实现消息接收demo

    而ActiveMQ是Apache出品的一款开源消息中间件,它遵循JMS(Java Message Service)规范,用于处理应用程序之间的异步通信。本教程将详细介绍如何在Spring Boot项目中集成ActiveMQ,实现消息接收的Demo。 首先,我们...

    ActiveMQ消息过期时间设置和自动清除解决方案

    本文档详细介绍了在Apache ActiveMQ 5.15.3版本中如何进行消息过期时间的设置,以及如何配置自动清除机制,特别是针对死信队列的处理方式。 #### 1. 消息过期设置 ##### 参数详解 - **Message 过期则客户端不能...

    activeMQ发送消息返回消息

    ActiveMQ是Apache软件基金会开发的一款开源消息中间件,它基于Java消息服务(JMS)规范,用于在分布式系统中提供高效、可靠的消息传递。在ActiveMQ中,发送和接收消息是一个核心功能,它允许应用程序之间进行异步...

    用C#实现的ActiveMQ发布/订阅消息传送

    在IT行业中,消息队列(Message Queue)是一种重要的中间件技术,它允许应用程序之间通过异步通信进行数据交换。在本场景中,我们关注的是如何使用C#编程语言结合ActiveMQ来实现发布/订阅模式的消息传送。ActiveMQ是...

    SpringBoot快速玩转ActiveMQ消息队列

    在IT行业中,消息队列(Message Queue)是一种重要的中间件技术,它允许应用程序之间通过异步通信进行数据交换。在本教程中,我们将专注于如何在SpringBoot框架下快速集成并使用ActiveMQ,一个广泛使用的开源消息...

    一个jms activemq Topic 消息实例

    一个jms activemq Topic 消息实例 关于jms JMS 是接口,相当于jdbc ,要真正使用它需要某些厂商进行实现 ,即jms provider 常见的jms provider 有 ActiveMQ JBoss 社区所研发的 HornetQ (在jboss6 中默认即可以...

    spring使用activeMQ实现消息发送

    在IT行业中,Spring框架是Java应用开发的基石,而ActiveMQ则是Apache组织开发的一款开源的消息中间件,用于处理异步通信和消息队列。本文将深入探讨如何在Spring环境中使用ActiveMQ来实现消息的发送与接收,以提高...

    ActiveMQ学习笔记之九--发送消息到队列中

    在IT行业中,Apache ActiveMQ是一个广泛使用的开源消息代理和队列服务器,它是Java Message Service (JMS) 的实现,能够处理各种消息传递模式,包括点对点和发布/订阅。这篇"ActiveMQ学习笔记之九--发送消息到队列中...

    activemq消息持久化所需Jar包

    2. **JMS接口**:Java Message Service (JMS) 是一种标准API,用于在分布式环境中发送、接收和管理消息。在ActiveMQ中,`javax.jms-api.jar` 提供了与JMS相关的接口和类。 3. **数据库连接驱动**:ActiveMQ支持多种...

    go语言实现使用activemq 收发消息

    在本文中,我们将深入探讨如何使用Go语言实现与ActiveMQ的通信,主要关注消息的收发功能。ActiveMQ是Apache软件基金会开发的一款开源消息中间件,支持多种协议,包括我们这里提到的STOMP(Simple Text Oriented ...

    activeMQ收发工具.rar

    它基于Java Message Service (JMS) 规范,提供了可靠的消息传递功能,适用于分布式系统中的应用间通信。本压缩包“activeMQ收发工具.rar”包含了用于测试和操作ActiveMQ的实用工具,主要是一个jar包文件,方便用户在...

    ActiveMQ收发消息Demo

    ActiveMQ是Apache软件基金会开发的一款开源消息中间件,它遵循开放消息传递协议(Open Message Broker Protocol,即AMQP)和Java消息服务(Java Message Service,JMS)规范,用于在分布式系统中高效地处理和传输...

    7道消息队列ActiveMQ面试题!

    ActiveMQ是一款非常流行的开源消息队列中间件,它实现了JMS(Java Message Service,Java消息服务)1.1规范,面向消息的中间件(Message Oriented Middleware,MOM)是指利用高效可靠的消息传递机制进行与平台无关的...

    使用WebSocket协议接收ActiveMQ消息

    ActiveMQ是Apache软件基金会开发的消息队列产品,它遵循开放标准,如JMS(Java Message Service)和AMQP(Advanced Message Queuing Protocol),提供跨语言的API和协议支持,可以处理各种消息传递模式,如点对点、...

    简单的activemq点对点的同步消息模型

    ActiveMQ是Apache软件基金会开发的一款开源消息中间件,它遵循开放消息传递协议(Open Message Broker Protocol,即AMQP)和Java消息服务(Java Message Service,JMS)规范,用于实现应用程序之间的异步通信和数据...

    JMS之Spring +activeMQ实现消息队列

    "JMS之Spring + ActiveMQ实现消息队列"涉及到的关键知识点包括:Spring框架的JMS支持、ActiveMQ的使用、ConnectionFactory的配置、JmsTemplate和MessageListener的实现,以及消息队列在解决系统解耦和异步处理中的...

    SpringBoot+ActiveMq+MQTT实现消息的发送和接收

    这是一个典型的分布式系统中的消息通信场景,其中SpringBoot作为应用程序框架,ActiveMQ作为消息中间件,而MQTT(Message Queuing Telemetry Transport)则是一种轻量级的发布/订阅消息协议,适用于低带宽、高延迟或...

    Spring+ActiveMQ消息队列+前台接收消息

    在IT行业中,消息队列(Message Queue)是一种重要的中间件技术,它允许应用程序之间通过异步通信进行数据交换。在本教程中,我们将探讨如何整合Spring框架与ActiveMQ消息队列,实现前后台的消息传递。这有助于提升...

    SpringBoot整合ActiveMQ(消息中间件)实现邮件发送功能

    在本项目中,"SpringBoot整合ActiveMQ(消息中间件)实现邮件发送功能"是一个典型的企业级应用示例,它展示了如何将SpringBoot框架与Apache ActiveMQ集成,以实现基于消息队列的邮件发送服务。下面我们将详细探讨这个...

Global site tag (gtag.js) - Google Analytics