ActiveMQ的非持久化订阅的思考

项目中用到了大量的client,由于client和AMQ相连,AMQ对大量queue的支持不是很好,所以在项目中用到了发布/订阅+消息选择器的方法来进行针对某个或某几个client的消息分发。

所谓的发布/订阅,指的就是多个client同时订阅一个TOPIC,生产者往这个TOPIC里发送数据的时候,所有的client都能接收到相同的消息。形式很像广播,所以在消息中间件里,这种模式也叫广播模式。

在AMQ遵循的JMS规范中,广播模式有两种形式:持久化订阅和非持久化订阅。

  • 非持久化订阅:消费者只有在线的时候能接收到消息,一旦离线,服务器认为该消费者已离开,不会为其保留消息。等消费者下一次上线时,也只能收到从他上线以后生产者发送的消息。
  • 持久化订阅:服务器为离线的消费者保留消息,当消费者离线时,服务器会记录该消费者的离线时间,并为其保留离线期间的所有消息(保存在磁盘上),等其上线后按顺序发给这个消费者。想起之前写过的一个聊天工具用的就是持久订阅。

项目里用到的是非持久化订阅,设计时考虑的主要原因有两个:

  1. 持久化订阅极度消耗资源,因为agent的数量比较多,所以一旦为每个消费者保留消息,如果出现消费者再也不上线的情况,消息就会永远保存在服务器上。AMQ的官网上也提到了这种情况:

Durable topic subscribers that are offline for a long period of time are usually not desired in the system. The reason for that is that broker needs to keep all the messages sent to those topics for the said subscribers. And this message piling can over time exhaust broker store limits for example and lead to the overall slowdown of the system.

  1. 非持久化订阅的前期是agent在线,在设计时考虑agent一定要上线才能执行任务,对agent异常的场景考虑不足。

最近项目里几个人都问我AMQ能不能实现为离线agent保留消息,其实是可以的,也是最近才发现的功能,目前想了以下几种方法:

1. 使用持久化订阅

AMQ的官方既然提到了持久化订阅的问题,自然也考虑了一下解决方法。在官方提供的方法里,可通过设置消息的有效期自动清理离线的消费者的方法来降低系统负载。

  • 消息有效期:每条消息可以在生产者端设置有效期,比如我们希望为离线的agent保留15分钟数据,那只要在生产者端把有效期设置为15分钟,等agent上线后就可以接收到在其上线前15分钟内的消息。
  • 自动清理长期离线的消费者:可在服务器上配置该功能,主要的能力就是可以自动清理长期离线的消费者,有两个配置:
    offlineDurableSubscriberTimeout 消费者离线时间
    offlineDurableSubscriberTaskSchedule 服务端多长时间清理一次

但是这个方案有两个问题还待测试:

  1. 我们使用的是AMQ集群,持久化订阅是否会在集群内生效还不确定。因为每一次Agent重连时,连接的都可能是不同的MQ,持久化订阅的配置会否通过集群传播至所有的MQ呢?
  2. 平均两千个持久化订阅一台4C8G的AMQ能不能抗住,也需要测试。
  3. 持久化订阅要求Agent至少上线过一次,也就是在MQ上注册过一次,因此如果Agent在离线期间出现了clientID变化,MQ会认其为新的消费者,不会把离线消息发给它。

2. 使用AMQ的Retroactive Consumer功能

翻译是“可追溯”消费者,该功能只对Topic有效,如果consumer是可追溯的,那么它可以获取实例创建之前的消息。通常而言,非持久化订阅不可能获取实例创建之前的消息,因为服务器根本不知道它的存在。对于服务器而言,如果一个Topic通道创建,且有发布者发布消息,那么服务器将会在内存中(非持久化)或者磁盘中(持久化)保存已经发布的消息,直到所有的订阅者都消费者,才会清除原始消息内容。那么retroactive类型的订阅者,就可以获取这些原本不属于自己但broker上还保存的旧消息,就像我们订阅一种Feed,可以立即获取旧的内容列表一样。如果此订阅者不是持久化订阅,它可以获取最近发布的一些消息;如果是持久化订阅,它可以获取存储器中尚未删除的所有的旧消息。

“可回溯”消费者与clientID无关,就算离线时clientID变化也不会影响到消息的回溯。

此外,AMQ支持几种消息回溯的方法:

  1. 保留一定大小的消息
  2. 保留一定条数的消息
  3. 保留一定时间的消息
  4. 只保留一条消息
  5. 只保留消息属性中带上特定字段的消息

这个功能有一个问题,貌似不能保证所有满足条件的消息都被发送至“可追溯”消费者。且在集群模式下也有一定的问题,也是待测试的方案。

5:00pm更新:基本功能验证成功,可以收到离线前的消息,试了保留100条消息和保留1条消息都成功了,生产者和消费者在同一个集群不同机器也可以成功。但集群有个问题,消费者会收到多份同样的消息。消息数量与集群中服务器数量相同。比如3台mq的集群,设置保留10条消息,那新的agent上线就会收到3*10条消息,需要应用自己判断。

如果出现了agent大量掉线重连的场景,对网络带宽应该也有冲击。

3.由应用封装一层任务重新获取机制

在保持原有的代码不变的情况下,考虑在一个缓存(比如redis)设置一个有序集合,每次agent上线时可从该缓存中取出上一条消息或前几条消息并再次处理。

= =对架构冲击比较大,估计不靠谱。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,588评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,456评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,146评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,387评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,481评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,510评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,522评论 3 414
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,296评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,745评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,039评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,202评论 1 343
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,901评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,538评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,165评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,415评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,081评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,085评论 2 352

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,646评论 18 139
  • 姓名:周小蓬 16019110037 转载自:http://blog.csdn.net/YChenFeng/art...
    aeytifiw阅读 34,720评论 13 425
  • 为了避免意外宕机以后丢失信息,需要做到重启后可以恢复消息队列,消息系统一般都会采用持久化机制。ActiveMQ的消...
    曹振华阅读 2,921评论 0 4
  • 作者:我 建议看完上篇的《她——》,再看本篇的《他——》。 今天,晴。我,在搬家。 全部家当不多,只有一些简单的桌...
    不语繁客阅读 256评论 0 0
  • 父母如何培养孩子习惯,如何陪伴孩子成长,如何指导孩子做作业……类似的文章有许多,但也有家长感慨,学习了那么多的知识...
    云上文化阅读 438评论 0 0