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

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

内容简介:对基于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不会再对消息进行重发处理。


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

查看所有标签

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

Domain-Driven Design Distilled

Domain-Driven Design Distilled

Vaughn Vernon / Addison-Wesley Professional / 2016-6-2 / USD 36.99

Domain-Driven Design (DDD) software modeling delivers powerful results in practice, not just in theory, which is why developers worldwide are rapidly moving to adopt it. Now, for the first time, there......一起来看看 《Domain-Driven Design Distilled》 这本书的介绍吧!

HTML 压缩/解压工具
HTML 压缩/解压工具

在线压缩/解压 HTML 代码

图片转BASE64编码
图片转BASE64编码

在线图片转Base64编码工具

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

URL 编码/解码