ActiveMQ与虚拟通道

ActiveMQ从入门到精通 ActiveMQ MQ 1.入门概述 MQ=消息中间件, 消息: 微信/短信/语音 中间件: 在何种场景下使用消息中间件? 为什么要在系统中引入消息中间件 kafka , RabbitMQ ,RocketMQ ActiveMQ 解耦,削峰,异步, 链式调用时我们在写程序时候的一般流程,为了完成一个整体功能会将其拆分成多个函数,比如模块A调用模块B,模块B调用模块C,模块C调用模块D,但是在大型分布式应用中,系统间的RPC交互复杂, 一个概念背后要调用上百个接口也有可能,从单机架构过度到分 阅读详情

    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。

 

    默认情况下,ActiveMQ开启了VirtualTopic特性,此时Topic的默认命名空间为“VirtualTopic.>”,即命名模式为“VirtualTopic.<topicName>”,比如“VirtualTopic.order”;那么对于consumer而言,对应的Queue命名模式为“Consumer.*.VirtualTopic.<topicName>”,其中“*”的语义类似于clientId。代码示例如下:

//物理通道名称为:order

//producer端
Topic top = session.createTopic("VirtualTopic.order");
producer = session.createProducer(top);

//consumer端
//其中dbcenter为clientId
//此后我们可以创建多个consumer,它们使用同一个clientId
Queue queue = session.createQueue("Consumer.dbcenter.VirtualTopic.order");
MessageConsumer consumer = session.createConsumer(queue);

 

    当然,ActiveMQ的默认配置,还不能满足我们的日常需求,比如:

    1)一个现有的topic,如果需要转换为VirtualTopic

    2)希望物理topic与虚拟topic可以并存使用,比如一个Topic,已经有多个consumer,但是新加入了一个consumer,且此consumer需要使用VirtualTopic模式否则无法完成正常业务,如果将现有的producer和consumer的Topic地址都调整一遍是不太现实的,那么此时我们就需要通过调整配置来完成,即自定义VirtualTopic。(如下配置,将所有的topic映射为VirtualTopic)

 

  <broker xmlns="http://activemq.apache.org/schema/core">
    <destinationInterceptors>
      <virtualDestinationInterceptor>
        <virtualDestinations>
          <virtualTopic name=">" prefix="Consumer.*." selectorAware="false"/>
        </virtualDestinations>
      </virtualDestinationInterceptor>
    </destinationInterceptors>
  </broker>

 

<!-- ActiveMQ的默认方式,等效于如下配置 -->
<virtualTopic name="VirtualTopic.>" prefix="Consumer.*." selectorAware="false"/>

 

    调整配置之后,我们的producer端代码不需要任何修改,即现有的物理Topic已经被映射为虚拟topic,且topic命名中无需添加“VirtualTopic.”前缀。代码示例如下:

//producer端
Topic top = session.createTopic("order");
producer = session.createProducer(top);

//consumer端
//其中dbcenter为clientId
//此后我们可以创建多个consumer,它们使用同一个clientId
Queue queue = session.createQueue("Consumer.dbcenter.order");
MessageConsumer consumer = session.createConsumer(queue);

 

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

 

    其中还有一个重要的参数"selectorAware",它表示从Topic中将消息转发给Queue时,是否关注Consumer的selector情况。如果为false,那么Topic中的消息全部转发给Queue,否则只会转发匹配Queue Consumer的selector的消息。需要非常注意,当selectorAware为true时,如果消息不匹配任何selector或者Queue中没有任何Consumer活跃,那么消息将不会转发给Queue。

 

     此外,VirtualTopic仍然可以被正常的订阅者消费(默认配置情况下),即:

Topic topic = session.createTopic("VirtualTopic.order");
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的消息也不例外。

<networkConnectors>
  <networkConnector uri="static://(tcp://localhost:61617)">
    <excludedDestinations>
		<!-- prefix和VirtualTopic保持一致
		<queue physicalName="Consumer.*.VirtualTopic.>"/>
    </excludedDestinations>
  </networkConnector>
</networkConnectors>

 

 二. Composite Destinations

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

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

<broker persistent="false" useJmx="false" xmlns="http://activemq.apache.org/schema/core">
    <destinationInterceptors>
      <virtualDestinationInterceptor>
        <virtualDestinations>
          <compositeQueue name="order">
            <forwardTo>
              <queue physicalName="order.dbcenter" />
              <topic physicalName="order.statistic" />
            </forwardTo>
          </compositeQueue>
 <!-- 
 <compositeTopic name="order" forwardOnly="false">
            <forwardTo>
              <queue physicalName="order.dbcenter" />
              <topic physicalName="order.statistic" />
            </forwardTo>
          </compositeTopic>
 -->
        </virtualDestinations>
      </virtualDestinationInterceptor>
    </destinationInterceptors>
 
  </broker>

 

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

  

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

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

 

ActiveMQ高级特性:虚拟Destinations实现消费者分组与简单路由 ActiveMQ支持的虚拟Destinations分为有两种,分别是 Ø 虚拟主题(Virtual Topics) Ø 组合 Destinations(CompositeDestinations) 这两种虚拟Destinations可以看做对简单的topic和queue用法的补充,基于它们可以实现一些简单有用的EIP功能,虚拟主题类似于1对多的分支功能+消费端的cluster+failover,组合Destinations类似于简单的destinations直接的路由功能。 阅读详情

相关推荐

activemq 虚拟topic与路由功能

activemq 虚拟topic配置,可以将一个 topic转发为多个队列和多个topic或者将一个队列转发为多个topic和多个队列

ActiveMq Destination

Composite Destinations 在1.1版本中 ActiveMQ就支持composite destinations,这允许一个虚拟的destination代表一组真实的JMS destination。 例如你可以使用composite destinations 只需一个发送composite destinations操作就可以将一条消息发送到12个物理队列中。 或者发送到一个q...

weixin_40794981的博客 1435

基于SpringBoot开发的ActiveMQ虚拟主题客户端(包含发布者和订阅者)

基于SpringBoot开发的ActiveMQ虚拟主题客户端,达到消费者多点消费、负载均衡和故障转移的目的。 详情可以参考这里: https://my.oschina.net/noryar/blog/1573047 https://my.oschina.net/noryar/blog/1575003

【转】ActiveMQ与虚拟通道

郑重提示,本文转载自http://shift-alt-ctrl.iteye.com/blog/2065436 ActiveMQ提供了虚拟通道的特性(Virtual Destination),它允许一个逻辑通道(logical destination)映射成一个或者多个物理通道(physical destination);它可以非常灵活的解决"消息整合"方面的问题,它可以...

86

子网划分详解

还不会子网划分?看这篇就够了,保姆级教程

m0_47584619的博客 6093

FUXA实战:5步搞定基于Web的SCADA系统搭建(含Node.js版本避坑指南)

本文提供了一份基于开源工具FUXA搭建Web版SCADA系统的实战指南。文章重点解析了从环境准备到生产部署的五个核心步骤,并特别强调了Node.js版本选择对西门子S7 PLC通信兼容性的关键影响,帮助开发者避开常见陷阱,快速构建工业监控界面。

weixin_29172963的博客 140

ActiveMQ与虚拟通信

ActiveMQ提供了虚拟通道的特性(Virtual Destination),它允许一个逻辑通道(logical destination)映射成一个或者多个物理通道(physical destination);它可以非常灵活的解决"消息整合"方面的问题,它可以实现:     1) 提供了VirtualTopic特性,可以让一个订阅者的消息列表,作为Queue来消费。     2) 提供了Co...

Felix_阳的博客 338

别再只放按钮了!巧用微信小程序‘长按识别’功能,打造无缝加群体验

本文深入探讨了微信小程序'长按识别'功能在社群运营中的创新应用,通过简化加群流程至一步操作,显著提升用户转化率。文章详细解析了技术实现细节、UI/UX设计策略,并对比了与企业微信API的适用场景,为开发者提供打造无缝加群体验的完整解决方案。

weixin_42627853的博客 434

ActiveMQ群集,持久订阅者和虚拟主题可助您一臂之力

因此,您希望跨分布式主题使用ActiveMQ进行发布-订阅,并且要可靠。 您可以只使用永久订阅,对不对? 可以,但是,如果将群集与ActiveMQ一起使用,则可能会遇到意外行为。 我最近在一个客户端上,我注意到了这一行为,并且还注意到在使用Weblogic JMS集群时也存在相同的行为。 那么有什么问题,ActiveMQ可以解决什么问题呢? 好吧,我假设您阅读了标题,所以您可能有个主意……但...

最佳 Java 编程 215

Cadence PSpice 模型1:基于自带库新建二极管的PSpice模型图文教程

使用Cadence PSpice进行电路图的仿真时,难免会遇到软件自带库中没有合适的元器件的情况,这就需要设计师自己新建元器件模型,本文详细介绍使用PSpice软件修改自带库的元器件模型的参数以得到自己需要的PSpice模型库的方法。

fydar的博客 4413

SpringBoot 系列教程(二):SpringBoot使用Devtools实现热部署

1.devtools   spring为开发者提供了一个名为spring-boot-devtools的模块来使Spring Boot应用支持热部署,提高开发者的开发效率,无需手动重启Spring Boot应用。 2.项目搭建   本文是采用IDEA搭建的Spring Boot应用,通过spring-boot-devtools配置,可以支持修改java文件会自动重启程序,一些资源无需触发重启,...

Thinkingcao的专栏 1215

activemq 持久订阅_ActiveMQ群集,持久订阅者和虚拟主题可助您一臂之力

activemq 持久订阅 因此,您希望使用ActiveMQ跨分布式主题进行发布-订阅,并且要可靠。 您可以使用永久订阅,对吗? 可以,但是,如果您将群集与ActiveMQ一起使用,则可能会遇到意外的行为。 我最近在一个客户端上,我注意到了这一行为,并且还注意到在使用Weblogic JMS集群时也存在相同的行为。 那么问题是什么,ActiveMQ可以解决什么问题呢? 好吧,我假设您已经读过标...

最佳 Java 编程 184

QT应用编程: 基于UDP协议设计的大文件传输软件

一、环境介绍 QT版本: 5.12.6 编译器: MinGW 32 传输协议: UDP 功能介绍:软件由客户端和服务器组成,客户端通过 UDP协议不断循环地向服务端发送文件,文件传输速率可以达到10MB/s以上,文件传输后支持自动删除,客户端上可以支持每分钟创建一个文件并以时间戳命名,每个生成的文件可以设置大小,默认大小为6GB; 服务端收到文件之后,将文件进行存储到本地,可以指定时间自动删除文件;服务端可以动态计算传输速率,并写入日志文件; 服务器可以支持同时接收多个客户端的文件上传。...

2803

ActiveMQ学习笔记

微服务架构后,链式调用是我们在写程序时候的一般流程,为了完成一个整体功能会将其拆分成多个函数(或子模块),比如模块A调用模块B,模块B调用模块C,模块C调用模块D。但在大型分布式应用中,系统间的RPC交互繁杂,一个功能背后要调用上百个接口并非不可能,从单机架构过渡到分布式微服务架构的通例,这些架构存在以下问题。1)系统之间接口耦合比较严重每新增一个下游功能,都要对上游的相关接口进行改造;

小鲁蛋的博客 992

第16课:动手实战中文句法依存分析

句法分析是自然语言处理(NLP)中的关键技术之一,其基本任务是确定句子的句法结构或者句子中词汇之间的依存关系。主要包括两方面的内容:一是确定语言的语法体系,即对语言中合法句子的语法结构给予形式化的定义;另一方面是句法分析技术,即根据给定的语法体系,自动推导出句子的句法结构,分析句子所包含的句法单位和这些句法单位之间的关系。 句法分析被用在很多场景中,比如搜索引擎用户日志分析和关键词识别,比如信息抽...

春华秋实 2437

SAP Gateway 故障排查全景图:从 Error Log 到 E2E 追踪,一套面向实战的工具与方法论

本文针对SAP Gateway Foundation(SAP_GWFND)的故障排查需求,梳理了从现象到根因的系统化排查路径。文章首先强调建立标准化排障流程的重要性,随后提供工具矩阵及使用顺序指引:对于请求中断优先查看Error Log(/IWFND/ERROR_LOG和/IWBEP/ERROR_LOG),性能问题使用Performance Trace(/IWFND/TRACES),通知异常则检查Notification Monitor。重点工具包括: Error Log作为中断类错误首要定位器; Appl

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 247

MQ之ActiveMQ

1.ActiveMQ主要作用 解耦 削峰 异步

怪咖的博客 494

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

消息中间件activeMQ

能完成主要的三件事: 1.要做到系统解耦,当新的模块接进来时,可以做到代码改动最小;能够解耦 2.设置流量缓冲池,可以让后端系统按照自身吞吐能力进行消费,不被冲垮;能够削峰 3.强弱依赖梳理能将非关键调用链路的操作异步化并提升整体系统的吞吐能力;能够异步 消息发送者可以发送一个消息而无需等待响应。消息发送者将消息送到一条虚拟的通道(主题或队列)上; 消息接收者则订阅或监听该通道。一条信息可能最终转...

weixin_43724246的博客 184

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

消息中间件之ActiveMQ-基础篇

消息中间件之ActiveMQ-基础篇 注:该博客参考 尚硅谷周阳老师,仅供个人学习使用,转载请标明作者和此段文字 一、消息中间件是什么? MQ = 消息中间件 1. MQ产品总类 kafka、RabbitMQ、RocketMQ、ActiveMQ ...

吃糖不加牛奶的博客 322

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

ActiveMQ连接协议说明

1  概述 ,ActiveMQ提供一种连接机制,这种连接机制使用传输连接器(transport connector)实现客户端与代理(client-to-broker)之间的通信; ActiveMQbroker的主要作用是为客户端程序提供一种通信机制; 使用网络连接器(network connector)实现代理与代理之间的通信.代理可以简单的看出启动了一个socket监听, 一个jms中

漫天雪_昆仑巅 7159
上一篇: Mysql索引失效(备忘)
下一篇: ActiveMQ分布式网络(Forward Bridge)
shift_alt_ctrl
博客等级 码龄10年 0粉丝 83原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值