ActiveMQ学习笔记(15)----Message Dispatch高级特性(一)
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高级特性(一)的更多相关文章
- 分布式-信息方式-ActiveMQ的Message dispatch高级特性之(指针) Message cursors
Message dispatch高级特性之 Message cursors概述 ActiveMQ发送持久消息的典型处现方式是:当消息的消费者准备就绪时,消息发送系统把存储的 消息 ...
- ActiveMQ学习笔记(16)----Message Dispatch高级特性(二)
1. Optimized Acknowledgetment ActiveMQ缺省支持批量确认消息,由于批量确认会提高性能,如果希望在应用程序中禁止经过优化的确认方式,可以采用以下几种方式: 1. 在C ...
- Python学习笔记(二)——高级特性
知识点 切片 切片 取一个list或tuple的部分元素. 原理:调用__getitem__,__setitem__,__delitem__和slice函数. 根据官方的帮助文档(https://do ...
- Python学习笔记(十)—— 高级特性
一.切片 1.定义: 经常取指定索引范围的操作,用循环十分繁琐,因此,Python提供了切片(Slice)操作符. 2.语法: A[1:3] 取出1到3,都是正数的情况下,缺填的为0(第一个),end ...
- python学习笔记(三)---高级特性
一.切片 取无数多个list元素 不用一个个取得笨方法就用切片 对这种经常取指定索引范围的操作,用循环十分繁琐,因此,Python提供了切片(Slice)操作符,能大大简化这种操作. 对应上面的问题, ...
- ActiveMQ学习笔记(5)——使用Spring JMS收发消息
摘要 ActiveMQ学习笔记(四)http://my.oschina.net/xiaoxishan/blog/380446 中记录了如何使用原生的方式从ActiveMQ中收发消息.可以看出,每次 ...
- redis学习笔记(详细)——高级篇
redis学习笔记(详细)--初级篇 redis学习笔记(详细)--高级篇 redis配置文件介绍 linux环境下配置大于编程 redis 的配置文件位于 Redis 安装目录下,文件名为 redi ...
- C#可扩展编程之MEF学习笔记(五):MEF高级进阶
好久没有写博客了,今天抽空继续写MEF系列的文章.有园友提出这种系列的文章要做个目录,看起来方便,所以就抽空做了一个,放到每篇文章的最后. 前面四篇讲了MEF的基础知识,学完了前四篇,MEF中比较常用 ...
- Ext.Net学习笔记15:Ext.Net GridPanel 汇总(Summary)用法
Ext.Net学习笔记15:Ext.Net GridPanel 汇总(Summary)用法 Summary的用法和Group一样简单,分为两步: 启用Summary功能 在Feature标签内,添加如 ...
随机推荐
- Vue.js 2.x Development Build With Hot Reloading For External Server (using Webpack template)
This article assuming you created your project using webpack template. vue init webpack <PROJECT_ ...
- MySQL监控SQL及命中率脚本
[root@hank-yoon scrips]# vi mysqlstat.sh/export/servers/mysql/bin/mysqladmin -P3306 -uyoon -pyoon ...
- Mongodb 启动关闭脚本并设置开机自动启动Mongodb
配置文件内容:[root@yoon etc]# cat mongod.conf logpath=/export/log/mongodb.loglogappend=truefork = truedbpa ...
- 发现个很变态的css问题,记录下。
注意看Ul:nth-child(){} 本来是一一对应的,因为后来改版在div中加了<h1></h1>标记后,竟然自动后移了.... 不可思议,莫明奇妙
- java根据出生日期计算年龄
/** * @author jerry.chen * @param brithday * @return * @throws ParseException * 根据生日获取年龄; */ public ...
- Unity 点击屏幕发射射线 代码
1,创建一根射线 2,检查射线与其他物体的碰撞,得到碰撞信息 3,通过碰撞信息对碰撞到的物体进行处理 using System.Collections; using System.Collection ...
- Kattis -Backspace
Backspace Bjarki having trouble Shortly before the programming contest started, Bjarki decided to up ...
- [转]Python常用字符串
转自:http://blog.csdn.net/daemonpei/article/details/6325762 字符串相关操作: + :string1+string2 #联接字符串,将后一个串链接 ...
- Shiro:授权的相关实现
Shiro:授权的相关实现 一.使用Shiro过滤器实现授权 设置好授权拦截跳转的请求地址 /** * 创建ShiroFilterFactoryBean */ @Bean public ShiroFi ...
- VUE:事件处理和表单输入绑定
事件处理 <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <titl ...