对基于JMS消息发布订阅-虚拟主题(1.25)

栏目: Java · 发布时间: 6年前

内容简介:对基于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值接收消息,同时消息本身又不会接收重复。

具体关键设置如下图所示:

对基于JMS消息发布订阅-虚拟主题(1.25)

另外对于消息接收确认,主要有两种方法:

  • AUTO_ACKNOWLEDGE    一旦消息处理中返回了应用程序接收方法,Session 对象即确认消息接收。
  • CLIENT_ACKNOWLEDGE    Session对象依赖于应用程序对已收到的消息调用确认方法。一旦调用该方法,会话将确认所有自上次确认后收到的消息。该方法允许应用程序通过一次调用接收、处理和确认一批消息。

实际上最好的方法是启用CLIENT_ACKNOWLEDGE,通过程序去确认,这样可以方便接收端到接收到数据自己处理异常的情况下,JMS能够重发消息。如果是自动确认,JMS只管接收程序接收到,那么接收程序本身处理异常后,JMS不会再对消息进行重发处理。


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

九败一胜

九败一胜

李志刚 / 北京联合出版公司 / 2014-9-1 / 42.00元

所有的创业者都面临着很多问题,困惑不是个人的,是有共性的。 除了自身去摸索着石头走路,他们还可以通过学习,从那些在创业路上走得更远的创业者身上学到经验、教训。 这本书的主角——王兴,恰好就是一个很好的学习对象。出生于1979年的王兴,很早就创业了,2004他就开始和同学一块创业,2005年做出了校内网;2007年,他又做出了饭否网——这是中国最早的类似twitter的网站。 ......一起来看看 《九败一胜》 这本书的介绍吧!

URL 编码/解码
URL 编码/解码

URL 编码/解码

正则表达式在线测试
正则表达式在线测试

正则表达式在线测试

HSV CMYK 转换工具
HSV CMYK 转换工具

HSV CMYK互换工具