[.Net/C# 团队]2000人开发交流Qq群:348041382

架构师

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 73|回复: 2

ActiveMQ持久订阅设置

[复制链接]
发表于 2017-1-9 11:12:10 | 显示全部楼层 |阅读模式

ActiveMQ持久订阅设置
通过为发布者设置 PERSISTENT传送模式,为订阅者时使用持久订阅,这样可以保证 Pub/Sub 程序接收所有发布的消息。
消息订阅分为非持久订阅(non-durable subscription)和持久订阅(durable subscription),非持久订阅只有当客户端处于激活状态,也就是和 ActiveMQ 保持连接状态才能收到发送到某个主题的消息,而当客户端处于离线状态,这个时间段发到主题的消息将会丢失,永远不会收到。持久订阅时,客户端向ActiveMQ 注册一个识别自己身份的 ID,当这个客户端处于离线时,ActiveMQ会为这个 ID 保存所有发送到主题的消息,当客户端再次连接到ActiveMQ 时, 会根据自己的 ID 得到所有当自己处于离线时发送到主题的消息。持久订阅会增加开销,同一时间在持久订阅中只有一个激活的用户。 建立持久订阅的步骤:
1. 为连接设置一个客户 ID;
2. 为订阅的主题指定一个订阅名称;
上述组合必须唯一。
代码实现持久化订阅

(1)使用queue,即队列时,每个消息只有一个消费者,所以,持久化很简单,只要保存到数据库即可

。然后,随便一个消费者取走处理即可。某个消费者关掉一阵子,也无所谓。

(2)使用topic,即订阅时,每个消息可以有多个消费者,就麻烦一些。

首先,假设消费者都是普通的消费者,
------------------------
<1>activemq启动后,发布消息1,可惜,现在没有消费者启动着,也就是没有消费者进行了订阅。那么

,这个消息就被抛弃了。

<2>消费者1启动了,连接了activemq,进行了订阅,在等待消息~~

activemq发布消息2,OK,消费者1收到,并进行处理。消息抛弃。

<3>消费者2也启动了,连接了activemq,进行了订阅,在等待消息~~

activemq发布消息3,OK,消费者1,消费者2都收到,并进行处理。消息抛弃。

<4>消费者1关掉了。

activemq发布消息4,OK,消费者2收到,并进行处理。消息抛弃。

<5>消费者1又启动了。

activemq发布消息5,OK,消费者1,消费者2都收到,并进行处理。消息抛弃。
-----------------------------
总结一下:
activemq只是向当前启动的消费者发送消息。
关掉的消费者,会错过很多消息,并无法再次接收这些消息。

如果发送的消息是重要的用户同步数据,错过了,用户数据就不同步了。

那么,如何让消费者重新启动时,接收到错过的消息呢?

答案是持久订阅。
-----------------------------

普通的订阅,不区分消费者,场地里有几个人头,就扔几个馒头。
持久订阅,就要记录消费者的名字了。
张三说,我是张三,有馒头给我留着,我回来拿。
李四说,我是李四,有馒头给我留着,我回来拿。
activemq就记下张三,李四两个名字。

那么,分馒头时,还是一个人头给一个馒头。
分完了,一看张三没说话,说明他不在,给他留一个。
李四说话了,那就不用留了。

张三回来了,找activemq,一看,这不张三吧,快把他的馒头拿来。
可能是一个馒头,也可能是100个馒头,就看张三离开这阵子,分了多少次馒头了。

activemq区分消费者,是通过clientID和订户名称来区分的。
-----------------------------
// 创建connection
connection = connectionFactory.createConnection();
connection.setClientID("bbb"); //持久订阅需要设置这个。
connection.start();

// 创建session
Session session = connection.createSession(false,Session.AUTO_ACKNOWLEDGE);

// 创建destination
Topic topic = session.createTopic("userSyncTopic"); //Topic名称

//MessageConsumer consumer = session.createConsumer(topic); //普通订阅
MessageConsumer consumer = session.createDurableSubscriber(topic,"bbb"); //持久订阅


还有一点,消息的生产者,发送消息时用使用持久模式
MessageProducer producer = ...;
producer.setDeliveryMode(DeliveryMode.PERSISTENT);
不设置,默认就是持久的

(5)使用相同的“clientID”,则认为是同一个消费者。两个程序使用相同的“clientID”,则同时只能有一个连接到activemq,第二个连接的会报错。

(6)activemq的设置在conf/activemq.xml中,默认消息是保存在data/kahadb中,重启activemq消息不会丢。

可以访问http://localhost:8161/admin/index.jsp:查看当前的队列、Topic和持久订户的信息、发送消息等等,很方便。

可以复制activemq-jdbc.xml中的内容过来,修改一下,就可以把消息保存在其它数据库中了。
码农网,只发表在实践过程中,遇到的技术难题,不误导他人。
MB充值,下载附件内容!
 楼主| 发表于 2017-1-9 13:41:53 | 显示全部楼层
1    queue与topic的技术特点对比
名称
Topic
Queue
概要
Publish Subscribe messaging 发布订阅消息
Point-to-Point 点对点
有无状态
topic数据默认不落地,是无状态的。
Queue数据默认会在mq服务器上以文件形式保存,比如Active MQ一般保存在$AMQ_HOME\data\kr-store\data下面。也可以配置成DB存储。
完整性保障
并不保证publisher发布的每条数据,Subscriber都能接受到。
Queue保证每条数据都能被receiver接收。
消息是否会丢失
一般来说publisher发布消息到某一个topic时,只有正在监听该topic地址的sub能够接收到消息;如果没有sub在监听,该topic就丢失了。
Sender发送消息到目标Queue,receiver可以异步接收这个Queue上的消息。Queue上的消息如果暂时没有receiver来取,也不会丢失。
消息发布接收策略
一对多的消息发布接收策略,监听同一个topic地址的多个sub都能收到publisher发送的消息。Sub接收完通知mq服务器
一对一的消息发布接收策略,一个sender发送的消息,只能有一个receiver接收。receiver接收完后,通知mq服务器已接收,mq服务器对queue里的消息采取删除或其他操作。

码农网,只发表在实践过程中,遇到的技术难题,不误导他人。
MB充值,下载附件内容!
 楼主| 发表于 2017-1-9 13:42:15 | 显示全部楼层
Topic和queue的最大区别在于topic是以广播的形式,通知所有在线监听的客户端有新的消息,没有监听的客户端将收不到消息;而queue则是以点对点的形式通知多个处于监听状态的客户端中的一个。

2    topic和queue方式的消息处理效率比较
        通过增加监听客户端的并发数来验证,topic的消息推送,是否会因为监听客户端的并发上升而出现明显的下降,测试环境的服务器为ci环境的ActiveMQ,客户端为我的本机。
        从实测的结果来看,topic方式发送的消息,发送和接收的效率,在一个订阅者和100个订阅者的前提下没有明显差异,但在500个订阅者(线程)并发的前提下,效率差异很明显(由于500线程并发的情况下,我本机的cpu占用率已高达70-90%,所以无法确认是我本机测试造成的性能瓶颈还是topic消息发送方式存在性能瓶颈,造成效率下降如此明显)。
        Topic方式发送的消息与queue方式发送的消息,发送和接收的效率,在一个订阅者和100个订阅者的前提下没有明显差异,但在500个订阅者并发的前提下,topic方式的效率明显低于queue。
        Queue方式发送的消息,在一个订阅者、100个订阅者和500个订阅者的前提下,发送和接收的效率没有明显变化。
Topic实测数据:


发送者发送的消息总数
所有订阅者接收到消息的总数
消息发送和接收平均耗时
单订阅者
100
100
101ms
100订阅者
100
10000
103ms
500订阅者
100
50000
14162ms

Queue实测数据:


发送者发送的消息总数
所有订阅者接收到消息的总数
消息发送和接收平均耗时
单订阅者
100
100
96ms
100订阅者
100
100
96ms
500订阅者
100
100
100ms

码农网,只发表在实践过程中,遇到的技术难题,不误导他人。
MB充值,下载附件内容!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

免责声明:
码农网所发布的一切软件、编程资料或者文章仅限用于学习和研究目的;不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。本站信息来自网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑中彻底删除上述内容。如果您喜欢该程序,请支持正版软件,购买注册,得到更好的正版服务。

Mail To:help@itsvse.com

手机版|小黑屋|网站地图|架构师 ( 鲁ICP备14021824号-2

GMT+8, 2017-1-24 10:48

Powered by Discuz! X3.2

© 2001-2014 Comsenz Inc.

快速回复 返回顶部 返回列表