AMQ学习笔记 - 06. 可靠消息传送
概述
故障分析
1.两个跃点
- 发送跃点
Producer将消息发送到JMS Provider的目的地 - 接收跃点
Consumer从JMS Provider的目的地获取消息
2.三个隐患阶段
- 发送阶段
Producer发送消息到目的地,可能会失败。 - 消息缓存阶段
JMS Provider异常导致目的地中缓存的数据丢失。 - 接收阶段
Consumer从目的地接收消息,可能会失败。
可靠传送保障机制
1.Acknowledge - 确认
这个机制可以用于解决发送阶段、接收阶段的安全隐患。
1.1.对于Producer
1.2.对于Consumer
- AUTO_ACKNOWLEDGE
自动确认:会话对收到的每条Message,自动发送接收确认;然后会话线程阻塞,直到收到了JMS Provider发来的处理确认。
接收确认的发送时机:同步接收中,调用receive()方法成功返回;异步接收中,MessageListener的onMessage(Message)方法被调用,并成功返回。 - CLIENT_ACKNOWLEDGE
客户端确认:客户端调用Message#acknowledge()发送接收确认[1];然后会话线程阻塞,直到收到了JMS Provider发来的处理确认。
接收确认的发送时机:显示调用Message#acknowledge()方法。
注:
[1] 每次确认不是只对当前的Message进行确认,而是对自上次确认以来的所有Message进行确认. - DUPS_OK_ACKNOWLEDGE
消息可重复确认:这个机制行为上表现的和AUTO_ACKNOWLEDGE一样,具有延迟确认的特点。这个机制可能会导致收到重复的消息。
接收确认的发送时机:测试中,PTP Mode每一条消息都会即时确认;Pub/Sub Mode在接收的消息数,每超过prefetch size阀值[1]一半的时候确认一次。
注:
[1] 在brokerURL中可以指定参数jms.prefetchPolicy.topicPrefetch作为prefetch size阀值。你可能会猜测:应该也有参数jms.prefetchPolicy.queuePrefetch,可以让DUPS_OK_ACKNOWLEDGE在PTP Mode中也批量确认。但是实验的结果是每一条消息都会即时确认,就好像DUPS_OK_ACKNOWLEDGE只是针对Pub/Sub设定的。
1.3.确认机制的设置
- AUTO_ACKNOWLEDGE - 自动确认
- CLIENT_ACKNOWLEDGE - 客户端确认
- DUPS_OK_ACKNOWLEDGE - 可重复确认
- createSession(boolean transacted, int acknowledgeMode):Session
transacted - 设置事务,后面才会谈到事务,这里设置false就好了
acknowledgeMode - 设置确认机制
1.4.确认机制的获取
- getAcknowledgeMode():int
返回结果有4种,除了上述的3种确认机制之外,还有一个Session.SESSION_TRANSACTED表示Session启用了事务。
1.5.测试
2.Transaction - 事务
对比内容\事务 | JDBC事务 | JMS事务 |
范围 | java.sql.Connection实例的生命周期之内 | javax.jms.Session实例的生命周期之内 |
设置和获取 | java.sql.Connection:
|
javax.jms.Connection:
javax.jms.Session:
|
操作 | java.sql.Connection:
|
javax.jms.Session:
|
对比内容\机制 | 确认机制 | 事务机制 |
本质 | 确保消费者能够获取到消息,在收到消费者的确认之后,才会将消息从目的地移除。 | 将多个操作绑在一起,成为原子操作,从而有相同的操作结果(成功或失败)。 |
客户端编程 | 在Producer端是透明的,只能在Consumer端进行控制。 | 可以在Producer和Consumer端实施控制。 |
功能性 | 确认消息已收到。 | 事务的commit,提供类似于批量确认的功能。 不要单纯为了批量确认而使用事务,要从业务的需要上考虑使用事务。 |
- 如果第一个参数为true,表示启用事务,第二个参数就会被忽略(建议传入Session.SESSION_TRANSACTED)
- 如果第一个参数为false,表示不启用事务,第二个参数用于设置确认模式,就有效了。
2.1.使用模型
try {
// ...
javax.jms.Connection connection = ...;
javax.jms.Session session = connection.createSession(true, Session.SESSION_TRANSACTED); // send or receive operates session.commit(); // commit at lase
} catch(JMSException e) {
session.rollback(); // rollback when exception happens
} finally {
// close resources
}
2.2.测试
3.持久化模式
3.1.持久化设置
- setDeliveryMode(int):void
- 设置此producer实例的默认递送模式 - send(Message message):void
- 以默认的deliveryMode发送消息 - send(Message message, int deliveryMode, int priority, long timeToLive):void
- 以指定的deliveryMode发送消息
- static int NON_PERSISTENT
非持久化模式 - static int PERSISTENT
持久化模式
producer.setDeliveryMode(DeliveryMode.NON_PERSISTENT); // 非持久化
producer.setDelicertMode(DeliveryMode.PERSISTENT); // 持久化
3.2.测试
参考
- 第 2 章 客户端编程模型
本文的骨架是参考这篇文章整理的 - ActiveMQ讯息传送机制以及ACK机制
这篇文章对ACK的机制讲的比较细,我尝试了optimizeACK + prefetch + AUTO_ACKNOWLEDGE的预取机制,以及DUPS_OK_ACKNOWLEDGE在Pub/Sub模式下的延迟确认机制。 - ActiveMQ持久化
介绍了几种常见的持久化方案。
AMQ学习笔记 - 06. 可靠消息传送的更多相关文章
- 机器学习实战(Machine Learning in Action)学习笔记————06.k-均值聚类算法(kMeans)学习笔记
机器学习实战(Machine Learning in Action)学习笔记————06.k-均值聚类算法(kMeans)学习笔记 关键字:k-均值.kMeans.聚类.非监督学习作者:米仓山下时间: ...
- iOS学习笔记06—Category和Extension
iOS学习笔记06—Category和Extension 一.概述 类别是一种为现有的类添加新方法的方式. 利用Objective-C的动态运行时分配机制,Category提供了一种比继承(inher ...
- AMQ学习笔记 - 04. 消息选择器
概述 消息选择器使用类似于SQL语法,为Consumer指定基于Message属性的筛选条件. 消息选择器 发送的时候,给消息添加一些属性:在接收的时候,根据属性进行过滤. API javax.jms ...
- AMQ学习笔记 - 05. 客户端模板化
概述 客户端编程模型中,大部分的步骤都是相同的.将相同的部分做成模板,将不同的部分预留接口,实现者就只需要针对不同的部分提供实现. 设计 类图 发送方客户端 说明: 基于模板的思想,SendTempl ...
- AMQ学习笔记 - 14. 实践方案:基于ZooKeeper + ActiveMQ + replicatedLevelDB的主从部署
概述 基于ZooKeeper + ActiveMQ + replicatedLevelDB,在Windows平台的主从部署方案. 主从部署可以提供数据备份.容错[1]的功能,但是不能提供负载均衡的功能 ...
- AMQ学习笔记 - 02. JMS客户端编程模型
概述 客户端编程模型,是讲如何使用JMS API实现Java应用程序和JMS Provider的通信. 消息传送模式 消息传送模式又称为消息传送域,JMS API定义了两种模式:PTP和Pub/Sub ...
- JMS学习六(ActiveMQ消息传送模型)
ActiveMQ 支持两种截然不同的消息传送模型:PTP(即点对点模型)和Pub/Sub(即发布 /订阅模型),分别称作:PTP Domain 和Pub/Sub Domain. 一.PTP消息传送模型 ...
- AMQ学习笔记 - 01. 相关背景
概述 介绍中间件.MOM.JMS.ActiveMQ,及相互的关系. 中间件 由于业务的不同.技术的发展.硬件和软件的选择有所差别,导致了异构组件或应用并存的局面.要使这些异构的组件协同工作,一个有效的 ...
- [Golang学习笔记] 06 程序实体3 类型断言和类型转换
类型断言: 语法:<目标类型的值>,<布尔参数> := <表达式>.( 目标类型 ) // 安全类型断言<目标类型的值> := <表达式>. ...
随机推荐
- 深入了解android平台的jni---图像灰度化处理
一.涉及到的jni编程知识 Java基本类型的数组,在JNI中都是jArray的类型格式.具体类型如下: typedef jarray jbooleanArray; typedef jarray jb ...
- OpenRisc-67-OR的汇编
引言 之前我们写过OR的裸机程序,写过基于OR的linux设备驱动程序,也反汇编过OR的机器码. 本小节,我们将通过一个简单的实验,对OR的汇编(指令集)做一个简单的梳理和測试. 1,基本思想 要想了 ...
- [Oracle] - 性能优化工具(2) - ASH
ASH和AWR的关系 ASH以V$SESSION为基础,每秒採样一次,记录活动会话等待的事件.不活动的会话不会採样,採样工作由新引入的后台进程MMNL来完毕. ASH内存记录数据始终是有限的,为了保存 ...
- cocos2d-x make: *** [clean-box2d_static-armeabi] Error 1
/cygdrive/d/android-ndk-r8e/build/core/build-binary.mk:52: recipe for target `clean-cocos_curl_stati ...
- SQL Sever 2008 数据库文件的备份和还原
数据库文件备份保存的方式我知道的有两种,第一种就是我们知道到的简单的分离,生成.mdf和.ldf文件,然后使用的时候直接进行附加数据库就可以了. 那么还有生成备份的文件.bak 的,这个操作要在步骤: ...
- 教程:如何减小iOS应用程序的大小?
本文译自:Reducing the size of my App Q: 怎样才能让我的程序安装包小一点,让程序的下载和安装更快速? A: 本文收集了一些减小程序安装包大小的相关技巧(当第一次下载和安装 ...
- 海量数据处理算法—Bit-Map
原文:http://blog.csdn.net/hguisu/article/details/7880288 1. Bit Map算法简介 来自于<编程珠玑>.所谓的Bit-map就是用一 ...
- linux文件操作命令--转
引用地址:http://bbsunchen.iteye.com/blog/1010993 想自己一开始处理文件的时候,看文件有多少行,都要写个perl脚本,好不麻烦啊...以此文纪念自己傻逼的科研生活 ...
- java 数组初始化
一维数组 1) int[] a; //声明,没有初始化 2) int[] a=new int[5]; //初始化为默认值,int型为0 3) int[] a={1,2,3,4,5} ...
- layer.js,,,分享一个好用的弹出层
基本属性: <!DOCTYPE html> <html> <head> <head> <meta content="text/html; ...