内容简介:对基于JMS消息发布订阅-虚拟主题(1.25)
场景描述: 在基于JMS进行消息发布订阅的时候,如果采用Topic模式,我们为每个客户端分配一个ClientID值,并启用持久化订阅模式。但是如果客户端本身是一个集群部署架构,那就会出现集群中多台机器都在监听同一个Topic,而且ClientID是一样的。我们需要达到的效果就是消息不会再同一个集群中进行重复分发。也就是我们说的需要Topic同时兼顾队列的能力。
这是在我们基于JMS消息发布订阅模式中必须要支持的一个关键技术场景。否则就会出现消息在一个集群中重复分发,因此需要对Topic的订阅客户端具备分组能力,在同一个组中只随机分发一次即可。
解决方案-ActiveMQ消息中间件
可参考: http://blog.csdn.net/kimmking/article/details/9773085
ActiveMQ支持的虚拟Destinations分为有两种,分别是
Ø 虚拟主题(Virtual Topics)
这两种虚拟Destinations可以看做对简单的topic和queue用法的补充,基于它们可以实现一些简单有用的EIP功能,虚拟主题类似于1对多的分支功能+消费端的cluster+failover,组合Destinations类似于简单的destinations直接的路由功能。
虚拟主题(Virtual Topics)
ActiveMQ中,topic只有在持久订阅(durablesubscription)下是持久化的。存在持久订阅时,每个持久订阅者,都相当于一个持久化的queue的客户端,它会收取所有消息。这种情况下存在两个问题:
a.同一应用内consumer端负载均衡的问题:同一个应用上的一个持久订阅不能使用多个consumer来共同承担消息处理功能。因为每个都会获取所有消息。queue模式可以解决这个问题,broker端又不能将消息发送到多个应用端。所以, 既要发布订阅,又要让消费者分组 ,这个功能jms规范本身是没有的。
b.同一应用内consumer端failover的问题:由于只能使用单个的持久订阅者,如果这个订阅者出错,则应用就无法处理消息了,系统的健壮性不高。
为了解决这两个问题,ActiveMQ中实现了虚拟Topic的功能。使用起来非常简单。对于消息发布者来说,就是一个正常的Topic,名称以VirtualTopic.开头。例如VirtualTopic.TEST。
对于消息接收端来说,是个队列,不同应用里使用不同的前缀作为队列的名称,即可表明自己的身份即可实现消费端应用分组。例如Consumer.A.VirtualTopic.TEST,说明它是名称为A的消费端,同理Consumer.B.VirtualTopic.TEST说明是一个名称为B的客户端。可以在同一个应用里使用多个consumer消费此queue,则可以实现上面两个功能。又因为不同应用使用的queue名称不同(前缀不同),所以不同的应用中都可以接收到全部的消息。每个客户端相当于一个持久订阅者,而且这个客户端可以使用多个消费者共同来承担消费任务。
解决方案-Weblogic消息中间件
首先,对于订阅端建议启用持久化订阅模式,对于 持久化和非持久化 区别为:
a.非持久订阅模式: 只有当客户端处于激活状态,也就是和JMS 服务器保持连接的状态下,才能接收到发送到某个Topic的消息,而当客户端处于离线状态时,则这个时间段发到Topic的消息将会永远接收不到。
b.持久订阅模式: 客户端向JMS 注册一个识别自己身份的ID,当这个客户端处于离线时,JMS 服务器会为这个ID 保存所有发送到主题的消息,当客户再次连接到JMS 服务器时,会根据自己的ID 得到所有当自己处于离线时发送到主题的消息,即消息永远能接收到。
在启用持久化订阅模式后,为每个客户端分配独立的ClientID值。同时由于客户订阅端本身有可能是集群配置,因此我们需要对这种情况启用订阅共享策略,即客户端多台机可以共享同一个ClientID值接收消息,同时消息本身又不会接收重复。
具体关键设置如下图所示:
另外对于消息接收确认,主要有两种方法:
- AUTO_ACKNOWLEDGE 一旦消息处理中返回了应用程序接收方法,Session 对象即确认消息接收。
- CLIENT_ACKNOWLEDGE Session对象依赖于应用程序对已收到的消息调用确认方法。一旦调用该方法,会话将确认所有自上次确认后收到的消息。该方法允许应用程序通过一次调用接收、处理和确认一批消息。
实际上最好的方法是启用CLIENT_ACKNOWLEDGE,通过程序去确认,这样可以方便接收端到接收到数据自己处理异常的情况下,JMS能够重发消息。如果是自动确认,JMS只管接收程序接收到,那么接收程序本身处理异常后,JMS不会再对消息进行重发处理。
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:- 消息队列和发布订阅
- 微信小程序订阅消息推送
- 4.Redis的消息发布和订阅
- 理解 Redis(9) - Publish Subscribe 消息订阅
- 使用Redis作为消息队列实现生产消费与发布订阅
- Apache Kafka 0.11.0.1,分布式消息发布订阅系统
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。