1. Message Cursors

  1.1 概述

  ActiveMQ发送持久化消息的典型的厝里方式是:当消息的消费者准备就绪时,消息发送系统把存储的消息按批次发送给消费者,在发送完一个批次的消息后,指针的标记位置指向下一个批次的待发消息的位置,进行后续的发送操作。这是一种 比较健壮和灵活的消息发送方式,但是大多数的情况下,消息的消费者不一定一直都处于这种理想的活跃状态。

  因此,从ActiveMQ5.0.0版本开始,消息发送系统采用一种混合型的发送模式,当消息消费者处于活跃状态时,允许消息发送系统直接把持久化消息发送给消费者,当消费者处于不活跃状态下时,切换使用Cursors来处理消息的发送。

  当消息的消费者处于活跃状态并且处理能力较强时,被持久化存储的消息直接发送到与消费者相关联的发送队列,如下:

  

  当消息已经出现积压,消费者再开始活跃,或者是消费者的消费速度比消息的发送速度慢时,消息将从Pending Cursor中提取,并发送与消费者关联的发送队列。见下图:

  

  1.) Store-base

    从ActiveMQ5.0 开始,默认使用此种类型的cursor,其能够满足大多数场景的使用要求。同时支持非持久消息的处理,Store-based内嵌了File-based的模式,非持久消息直接被Non-persistent pending Cursor所处理。工作模式见下图:

  

  2). VM

  相关消息引用存储在内存中,当满足条件时,消息直接被发送到消费者与值相关的发送队列,处理速度非常快,但出现慢消费或者消费者长时间处于不活跃状态的情况下,无法适应。工作模式见下图:

  

  3) .File-based

   当内存设置达到设置的限制,消息被存储到磁盘中的临时文件中。工作模式见下图:

  

  4). 配置使用

  在缺省的情况下,ActiveMQ会根据使用的Message Store来决定使用何种类型的Message Cursors,但是可以根据destination来配置Message Cursors,例如:

  1. 对Topic subscripbers

 <destinationPolicy>
<policyMap>
<policyEntries>
<policyEntry topic="org.apache" producerFlowControl="false" memoryLimit="1mb">
<dispatchPolicy>
<<strictOrderDispatchPolicy/>
</dispatchPolicy>
<deadLetterStrategy>
<individualDealLetterStrategy topicPrefix="Test.DLQ"/>
</deadLetterStrategy>
<pendingSubscriberPolicy>
<vmCursor/>
</pendingSubscriberPolicy>
<pendingDurableSubscriberPolicy>
<vmDurableCursor/>
</pendingDurableSubscriberPolicy>
</policyEntry>
</policyEntries>
</policyMap>
</destinationPolicy>

  配置说明:

  有效的Subscriber类型是vmCursor和fileCursor,缺省是store based cursor。有效的持久化subscribe的cursor types是storeDurableSubscriberCursor,vmDurableCursor和fileDurableSubscriberCursor,缺省是store based cursor.

  2. 对于queue的配置

<destinationPolicy>
<policyMap>
<policyEntries> <policyEntry queue="org.apache.>" >
<deadLetterStrategy>
<individualDealLetterStrategy topicPrefix="Test.DLQ"/>
</deadLetterStrategy>
<pendingQueuePolicy>
<vmQueueCursor/>
</pendingQueuePolicy>
</policyEntry>
</policyEntries>
</policyMap>
</destinationPolicy>

2. Async Sends

  ActiveMQ支持异步和同步发送消息,是可以配置,通常对于快的消费者,是直接把消息同步发送过去,但是对于一个慢消费者,你使用同步发送消息可能出现producer堵塞等现象,慢消费者适合异步发送。

  配置使用:

  1. ActiveMQ默认设置dispatchAsync=true是最好的性能设置。如果你处理Fast Consumer则使用dispatchAsync=false

  2. 在Connection URI级别来配置使用Async Send

    factory = new ActiveMQConnectionFactory("tcp://127.0.0.1:61616?jms.useAsyncSend=true");

  3. 在ConnectionFactory级别来配置使用Async Send

    factory.setUseAsyncSend(true);(此方法是存在于ActiveMQConnectionFactory中的)

  4. Connection级别来配置使用Async Send

    connection.setUseAsyncSend(true); (此方法存在于ActiveMQConnection中)

3. Dispatch Policies (消息分发策略)

  3.1 严格顺序分发策略(Strict Order Dispatch Policy)

  通常ActiveMQ会保证topic consumer以相同的顺序接收来意同一个producer的消息,并且有时候也需要保证不同的topic consumer以相同的数据接收消息,但是,由于多线程和异步处理,不同的topic consumer可能会以不同的顺序接收来自不同producer的消息。

  Strict order dispatch policy 会保证每个topic consumer会以相同的顺序接收消息,代价就是性能上的损失。以下是一个配置例子:

<policyEntry topic="ORDERS.>">
<dispatchPolicy>
<strictOrderDispatchPolicy/>
</dispatchPolicy>
</policyEntry>

  对于Queue的配置为:

<policyEntry queue=">" stricOrderDispatch="false"/>

  3.2  轮询的分发策略(Round Robin Dispatch Policy)

   ActiveMQ的prefetch缺省参数,是针对处理大量消息时的高性能和高吞吐量而设置的,所以缺省的prefetch参数比较大,而且缺省的dispatche policies会尝试尽可能快的填满缓冲。

  然而有些情况下,例如只有少量的消息而且单个消息的处理时间比较长,那么在缺省的prefetch和dispatch policies下,这些少量的消息总是倾向于被分发到个边的consumer上,这样就会因为负载的不均衡而导致处理时间的增加。

  Round Robin dispatch policy会尝试平均分发消息,以下是一个例子:

<policyEntry topic="FOO.>">
<dispatchPolicy>
<roundRobinDispatchPolicy/>
</dispatchPolicy>
</policyEntry>

ActiveMQ学习笔记(15)----Message Dispatch高级特性(一)的更多相关文章

  1. 分布式-信息方式-ActiveMQ的Message dispatch高级特性之(指针) Message cursors

    Message dispatch高级特性之 Message cursors概述            ActiveMQ发送持久消息的典型处现方式是:当消息的消费者准备就绪时,消息发送系统把存储的 消息 ...

  2. ActiveMQ学习笔记(16)----Message Dispatch高级特性(二)

    1. Optimized Acknowledgetment ActiveMQ缺省支持批量确认消息,由于批量确认会提高性能,如果希望在应用程序中禁止经过优化的确认方式,可以采用以下几种方式: 1. 在C ...

  3. Python学习笔记(二)——高级特性

    知识点 切片 切片 取一个list或tuple的部分元素. 原理:调用__getitem__,__setitem__,__delitem__和slice函数. 根据官方的帮助文档(https://do ...

  4. Python学习笔记(十)—— 高级特性

    一.切片 1.定义: 经常取指定索引范围的操作,用循环十分繁琐,因此,Python提供了切片(Slice)操作符. 2.语法: A[1:3] 取出1到3,都是正数的情况下,缺填的为0(第一个),end ...

  5. python学习笔记(三)---高级特性

    一.切片 取无数多个list元素 不用一个个取得笨方法就用切片 对这种经常取指定索引范围的操作,用循环十分繁琐,因此,Python提供了切片(Slice)操作符,能大大简化这种操作. 对应上面的问题, ...

  6. ActiveMQ学习笔记(5)——使用Spring JMS收发消息

      摘要 ActiveMQ学习笔记(四)http://my.oschina.net/xiaoxishan/blog/380446 中记录了如何使用原生的方式从ActiveMQ中收发消息.可以看出,每次 ...

  7. redis学习笔记(详细)——高级篇

    redis学习笔记(详细)--初级篇 redis学习笔记(详细)--高级篇 redis配置文件介绍 linux环境下配置大于编程 redis 的配置文件位于 Redis 安装目录下,文件名为 redi ...

  8. C#可扩展编程之MEF学习笔记(五):MEF高级进阶

    好久没有写博客了,今天抽空继续写MEF系列的文章.有园友提出这种系列的文章要做个目录,看起来方便,所以就抽空做了一个,放到每篇文章的最后. 前面四篇讲了MEF的基础知识,学完了前四篇,MEF中比较常用 ...

  9. Ext.Net学习笔记15:Ext.Net GridPanel 汇总(Summary)用法

    Ext.Net学习笔记15:Ext.Net GridPanel 汇总(Summary)用法 Summary的用法和Group一样简单,分为两步: 启用Summary功能 在Feature标签内,添加如 ...

随机推荐

  1. uploadifive上传文件

    uploadifive是一个款基于H5的上传文件的插件.优点是,可以在PC端,也可以在手机上进行操作.缺点是,IE9以下的兼容性不好. View: <!DOCTYPE html> < ...

  2. Unity 自己旋转 方法

    transform.Rotate(Vector3.up * Time.deltaTime * 100);

  3. Pyhton学习——Day61

    class Pagination(object): def __init__(self,totalCount,currentPage,perPageItemNum=10,maxPageNum=7): ...

  4. .net基础总复习(1)

    第一天 1.new关键字 (1) 创建对象 (2) 隐藏从父类那里继承过来的成员 2.访问修饰符 public: 公开的,公共的. private:私有的,只能在当前类的内部访问,类中的成员, 如果不 ...

  5. Extjs toolbar 如何添加竖杆分隔符

    如下: { xtype:'button', text:'学生档案', iconCls:'file', handler:function(){ console.log(222) }, }, {xtype ...

  6. CefSharp的简单应用,制作自动学习视频软件(基于Chromium)

    CefSharp在NuGet的简介是“The CefSharp Chromium-based browser component”,机翻的意思就是“基于Cefsharp Chromium的浏览器组件” ...

  7. 二、frps 完整配置文件

    # [common] is integral section [common] # A literal address or host name for IPv6 must be enclosed # ...

  8. 阿里云Linux系统Nginx配置多个域名的方法

    Nginx绑定多个域名,可通过把多个域名规则写一个配置文件里实现,也可通过分别建立多个域名配置文件实现,为了管理方便,建议每个域名建一个文件,有些同类域名则可写在一个总的配置文件里. 1. 比如我想建 ...

  9. js实现导航固定定位

                                                                                   js实现导航固定定位 <!DOCTY ...

  10. HDU 4390 Number Sequence (容斥原理+组合计数)

    HDU 4390 题意: 大概就是这样.不翻译了: Given a number sequence b1,b2-bn. Please count how many number sequences a ...