【转】ActiveMQ与虚拟通道

ActiveMQ提供了虚拟通道的特性(Virtual Destination),它允许一个逻辑通道(logical destination)映射成一个或者多个物理通道(physical destination);它可以非常灵活的解决"消息整合"方面的问题,它可以实现:

    1) 提供了VirtualTopic特性,可以让一个订阅者的消息列表,作为Queue来消费。

    2) 提供了Composite特性,可以把一个逻辑通道中的消息,转发到任意多的物理通道中。

 

一. VirtualTopic

   Topic最大的限制就是同一个ClientId的订阅者,任何时刻只能有一个活跃。所以我们在分布式部署时,就会很麻烦,比如一个应用部署成多个实例,且它们都有相同的Topic Consumer配置,那么意味着

一个实例部署成功后,其它的实例都会因为无法订阅Topic而导致故障;同时也意味着,如果这个Topic

Consumer失效后,我们不能自动让其他Consumer的接管它。但是Queue却没有这些限制,因为Queue可以同时有任意多个消费者,它们可以并发的消费消息,从而实现“负载均衡”。如果我们期望Topic也能如此,那么可以用VirtualTopic。

Java代码  

  1. <broker xmlns="http://activemq.apache.org/schema/core">  
  2.   <destinationInterceptors>  
  3.     <virtualDestinationInterceptor>  
  4.       <virtualDestinations>  
  5.         <virtualTopic name=">" prefix="VConsumers.*." selectorAware="false"/>  
  6.       </virtualDestinations>  
  7.     </virtualDestinationInterceptor>  
  8.   </destinationInterceptors>  
  9. </broker>  

 

   
对于所有的VirtualTopic,它们的namespace一定是"VirtualTopic.",Broker将会根据此namespace来判定逻辑通道是否为VirtualTopic,反过来说,如果你希望一个逻辑通道是一个VirtualTopic,那么它必须以“VirtualTopic.”作为前缀。比如“VirtualTopic.order”,那么它就是一个VirtualTopic,它的物理通道名称为"order"。

 

    对于Producer端,需要按照正常的Topic发送消息,通道名称为逻辑通道全名:

Java代码  

  1. Topic topic = session.createTopic("VirtualTopic.order");  
  2. MessageProducer producer = session.createProducer(topic);  
  3. //producer.send(message);  

 

     VirtualTopic对Consumer而言,是一个逻辑的Queue,Queue的全名有上述配置文件中的“prefix” + Client标识 + 逻辑虚拟通道;假如“Client标识”为"dbcenter"【相当于ClientId】,用来订阅Order消息,那么最终逻辑Queue的全名为:"VConsumers.dbcenter.VirtualTopic.order",其中需要注意prefix中的"*"占位符就是用来替换“Client标识”的;Broker端默认的prefix为"Consumer.*."。当然我们还可以postfix【后缀】,不过通常没有必要。

Java代码  

  1. Queue queue = session.createQueue("VConsumers.dbcenter.VirtualTopic.order");  
  2. MessageConsumer consumer = session.createConsumer(queue);  

 

   
对于Order通道而言,“dbcenter”相当于是一个订阅者;Broker将dbcenter订阅的消息转发到了“VConsumers.dbcenter.VirtualTopic.order”队列中;最重要的一点,这个虚拟Queue完全具有队列的所有特性,它的Consumer可以并行消费。

 

   
其中还有一个重要的参数"selectorAware",它表示从Topic中将消息转发给Queue时,是否关注Consumer的selector情况。如果为false,那么Topic中的消息全部转发给Queue,否则只会转发匹配Queue

Consumer的selector的消息。需要非常注意,当selectorAware为true时,如果消息不匹配任何selector或者Queue中没有任何Consumer活跃,那么消息将不会转发给Queue。

 

     VirtualTopic仍然可以被正常的订阅者消费,即:

Java代码  

  1. Topic topic = session.createTopic("VirtualTopic.order");  
  2. TopicSubscriber subscriber = session.createDurableSubscriber(topic,"dbcenter");  

 

   
 同时需要注意,VirtualTopic只会转发“Client标识”注册之后的消息,且即使Queue消费了消息,VirtualTopic中的消息仍然不会被删除(看起来仍然是Dequeued=0),对于Broker而言,逻辑Queue不被认为是一个“Durable

Subscriber”,只有真正的Subscriber消费消息后,Topic中的消息才会Dequeue。不过消息Dequeue后,不会影响Queue中的消息,因为这是基于Copy的。

 

    到目前为止,我尚不清楚,如果VirtualTopic中没有真正的Subscriber,这些消息该如何Dequeue。

 

   
当真正的subscriber和Queue都同时存在VirtualTopic中的时候,而且你的broker架构采用了“forward-brige”结构,那么你需要增加如下配置来避免消息的重复转发问题。在forward-brige架构中,任何通道中的消息都会forward到其他network
node中(其他broker上),当然这个虚拟的Queue的消息也不例外。

Java代码  

  1. <networkConnectors>  
  2.   <networkConnector uri="static://(tcp://localhost:61617)">  
  3.     <excludedDestinations>  
  4.         <!-- prefix和VirtualTopic保持一致  
  5.         <queue physicalName="VConsumer.*.VirtualTopic.>"/>  
  6.     </excludedDestinations>  
  7.   </networkConnector>  
  8. </networkConnectors>  

 

 二. Composite Destinations

    复合通道,它允许一条消息在多个物理通道间转发,就像一个通道映射成多个一样(one-many);比如复合通道A,映射成B和C,那么发往A的消息会同时转发给B和C,那么消费者可以直接通过B或者C获取消息;

这是一种实现消息复制转发、通道映射的便捷办法。复合通道包括CompositeQueue和CompositeTopic两种。

Java代码  

  1. <broker persistent="false" useJmx="false" xmlns="http://activemq.apache.org/schema/core">  
  2.     <destinationInterceptors>  
  3.       <virtualDestinationInterceptor>  
  4.         <virtualDestinations>  
  5.           <compositeQueue name="order">  
  6.             <forwardTo>  
  7.               <queue physicalName="order.dbcenter" />  
  8.               <topic physicalName="order.statistic" />  
  9.             </forwardTo>  
  10.           </compositeQueue>  
  11.  <!--   
  12.  <compositeTopic name="order" forwardOnly="false">  
  13.             <forwardTo>  
  14.               <queue physicalName="order.dbcenter" />  
  15.               <topic physicalName="order.statistic" />  
  16.             </forwardTo>  
  17.           </compositeTopic>  
  18.  -->  
  19.         </virtualDestinations>  
  20.       </virtualDestinationInterceptor>  
  21.     </destinationInterceptors>  
  22.    
  23.   </broker>  

 

   
上述配置forwardOnly属性表示发往CompositeQueue中的消息是否“仅仅转发,而不本地保留”,如果forwardOnly为true,那么消息将不会在order队列中保留,即order队列中不会有任何消息。如果为false,那么消息将会转发完成后,添加到order中,消费者仍然可以消费order队列中的消息。无论是Compsite通道还是转发的通道,它们和普通的通道没有任何区别,开发者仍然可以像使用普通的通道一样使用它们(消费消息和发送消息)。

  

    很多时候,我们希望在转发消息时,能够使用selector,此时我们可以使用filteredDestination,这样我们可以消息转发时控制消息。

Java代码  

  1. <compositeQueue name="MY.QUEUE">  
  2.     <forwardTo>  
  3.          <filteredDestination selector="orderType = 1" queue="food.order"/>  
  4.         <filteredDestination selector="status = 1" topic="order.statistic"/>  
  5.     </forwardTo>  
  6. </compositeQueue>  

原文链接:[http://wely.iteye.com/blog/2328781]

时间: 2024-10-14 16:46:08

【转】ActiveMQ与虚拟通道的相关文章

【转载】 JMS 概述

本文转载自http://shift-alt-ctrl.iteye.com/blog/1902820   一.JMS使用场景:    JMS是为"消息"而生,从使用的角度来说,任何可以与业务解耦的数据均可以作为"消息"存储;任何结构化(格式严格,适合解析)但未索引化(不能被随意检索)的数据均可以交付给JMS存储,但尽管JMS不是为存储而生.     1) 异构系统(应用)中,如果数据的交互无法通过DB共享/调用接口等方式实现时,可以考虑使用JMS作为数据的中转中心,并

JMS 概述

一.JMS使用场景:     JMS是为"消息"而生,从使用的角度来说,任何可以与业务解耦的数据均可以作为"消息"存储;任何结构化(格式严格,适合解析)但未索引化(不能被随意检索)的数据均可以交付给JMS存储,但尽管JMS不是为存储而生.     1) 异构系统(应用)中,如果数据的交互无法通过DB共享/调用接口等方式实现时,可以考虑使用JMS作为数据的中转中心,并使用JMS API来交付消息和消费消息.主要作用为"业务解耦"或"系统解

城域光网络技术概述

城域网是数据骨干网和长途电话网在城域范围内的延伸和覆盖,它承担着集团用户.商用大楼.智能小区等业务接入和通路出租等纷繁复杂的任务,需要通过各类网关实现话音.数据.图像.多媒体.IP接入和各种增值业务及智能业务,并与各运营商的长途网和骨干网实现互通.城域网不仅是传统长途网与接入网的连接桥梁,更是传统电信网与新兴数据网络的交汇点及今后三网融合的基础. 近年来,以10G SDH和DWDM技术为代表的光纤传输技术有了重大突破,骨干网带宽从Gb/s向Tb/s发展:在企业和居民用户端的网络速率,则随着G比特

内存管理 之 存储器硬件知识

接下来,为了顺应Linux Kernel的学习,在操作系统方面首先学习的是内存管理.首先主要讲解物理内存的相关知识.本节主要讲解存储器的基础硬件知识,下一节讲解存储器的层次结构.   存储器是计算机系统的重要组成部分,它在计算机系统中的作用是存放程序和数据.存储器不仅使计算机具有记忆功能,而且是计算机高速自动运行的基础. 作为计算机的核心部件之一,存储器直接关系到整个计算机系统性能的高低.如何以合理的成本搭建出容量和速度都满足要求的存储器系统,始终是计算机体系结构设计中的关键问题之一:一方面,人

全方位讲解硬件防火墙的选择

防火墙是指设置在不同网络(如可信任的企业内部网和不可信的公共网)或网络安全域之间的一系列部件的组合.它是不同网络或网络安全域之间信息的唯一出入口,通过监测.限制.更改跨越防火墙的数据流,尽可能地对外部屏蔽网络内部的信息.结构和运行状况,有选择地接受外部访问,对内部强化设备监管.控制对服务器与外部网络的访问,在被保护网络和外部网络之间架起一道屏障,以防止发生不可预测的.潜在的破坏性侵入.防火墙有两种,硬件防火墙和软件防火墙,他们都能起到保护作用并筛选出网络上的攻击者.在这里主要给大家介绍一下我们在

防火墙的选购指南

防火墙通常是运行在一台单独计算机之上的一个特别的服务软件,用来保护由许多台计算机组成的内部网络,它使企业的网络规划清晰明了,它可以识别并屏蔽非法请求,有效防止跨越权限的数据访问.它既可以是非常简单的过滤器,也可能是精心配置的网关,但它们的原理是一样的,都是监测并过滤所有内部网和外部网之间的信息交换. 在市场上,防火墙的售价极为悬殊,从几万元到数十万元,甚至到百万元.因为各企业用户使用的安全程度不尽相同,因此厂商所推出的产品也有所区分,甚至有些公司还推出类似模块化的功能产品,以符合各种不同企业的安

桌面虚拟化中的呼叫中心语音应用

有市场统计数据显示,今天国内的呼叫中心市场已经超过30万以上的坐席,也许你对这个数字表现得不理解,但是相信你一定会认同:呼叫中心已经无处不在,并且关系到你我生活方方面面,如10086,银行卡,信用卡,水电费,燃气费,甚至是叫车电话都在使用呼叫中心技术. 当然还有可能让你厌恶的推销电话,说不准他们也是一个大型的呼叫中心呢J 即便你没有参观过大规模的呼叫中心,但是电视,电影里的呼叫中心场景你也一定不会陌生. 几百号客服人员,面对着显示屏,头带耳机,一边回答用户的问题,一边使用鼠标键盘进行业务查询或操

什么是vpdn:基于GPRS的VPDN技术

摘 要 目前的虚拟拨号专用网(VPDN,Virtual Private Dial-up Network)主要是采用PSTN/ISDN承载的VPDN.本文在分析研究GPRS工作原理及VPDN工作原理的基础上,给出基于GPRS网承载的VPDN的业务呼叫实现过程,GPRS VPDN省内业务和漫游业务管理流程及实现. 1 前言 从移动通信的发展方向来看,移动数据业务必将是未来发展的主流和焦点.据分析,在未来的10年里,世界移动通信和互联网产业仍将持续快速发展,未来将是一个移动互联的世界,移动上网终端将超

电脑为什么总是掉线

上网会经常遇到掉线.网页打不开.下载中断.或者在线视.音频流中断.qq掉线.游戏掉线等现象. 我们不妨假定楼主是使用ADSL上网.其实其他方式上网经常掉线的原因和下列原因大致相同.下面我们来分析一下ADSL掉线的原因. 3lian素材  一,线路问题 首先检查一下家里线路,看屋内接头是否接好,线路是否经过了什么干扰源,比如空调.冰箱.电视等,尽量与这些用电设备保持一定的距离.也可以自行把室内的线路使用抗干扰能力更强的网线代替.确保线路连接正确.电话线入户后连接接线盒,然后再到话音分离器分离,一线