一句话总结: VirtualTopic是为了解决持久化模式下多消费端同时接收同一条消息的问题。
 
想象这样一个场景:
 
生产端产生了一笔订单,作为消息MessageOrder发了出去。
这笔订单既要入订单系统归档,又要入结算系统收款,那怎么办呢?
 
现在分析该消息的需求:
 
持久化:订单很重要,丢了可不行
同时接收:既要归档,又要结算
生产端只需向一个Destination发送:一把钥匙开一把锁,保持发送的一致性,否则容易乱套
 
方案A: 使用Topic订阅模式,虽然满足1对多同时接收,然而持久化模式下只能有一个持有clientID的消费者连接,不满足持久化需求
方案B: 使用单队列,队列是1对1模式,消息只能给一个消费者,不满足同时接收的需求
方案C: 使用多队列,显然生产者不太愿意一条消息发送很多次,分别发送给不同的队列,万一队列A发送成功,队列B发送失败怎么办?一致性无法保证,容易乱套
 
所以,JMS现有规范无法解决这个问题,于是,ActiveMQ使用VirtualTopic作为JMS规范的补充登场。
 
那VirtualTopic如何同时满足上述需求呢?
 
简单说来,就是将Topic和Queue相结合,各取所长。
 
在方案C中,我们发现使用多队列可以满足持久化和同时接收两个需求,但意味着生产者要发送消息给多个队列,一致性不好,那既然生产者不想分发,那么由Broker来分发可好?
 
VirtualTopic就是这样一种存在,对生产者而言它是Topic,对消费者而言它是Queue,内部的处理机制就是由Broker将接收到的消息二次分发给每一个Queue,然后由不同的Queue对应不同的应用实现持久化,不同的消费端只关心并连接到自己的Queue接收消息即可。
 
现在来复盘开始提出的场景:

显然,三个需求都得到了解决。
 
总结一下:
1. 虚拟Topic是一种特殊命名的Topic,系统根据命名规则将该Topic内的消息分发给当前存在的名称对应的Queue,分发是非持久化的,新加入的Queue是接收不到过去的消息的。
2. 虚拟Topic还是Topic,不是什么新的存在,具有普通Topic的所有功能,只是名字特殊而已。
3. 虚拟Topic的功能完全是中间件本身额外附加的机制,对于生产者和消费者都是无感知的。
4. 对于运维人员来说,还是正常监控队列即可,虚拟Topic是非持久化的,不存在积压。
 

 

ActiveMQ之VirtualTopic是什么?的更多相关文章

  1. ActiveMQ高级特性

    一.常用配置属性 以下配置文件目录均为:${activemq_home}/conf/activemq.xml 1.定期扫描清理 ActiveMQ中有一项功能:Delete Inactive Desti ...

  2. MQ 入门实践

    MQ Message Queue,消息队列,FIFO 结构. 例如电商平台,在用户支付订单后执行对应的操作: 优点: 异步 削峰 解耦 缺点 增加系统复杂性 数据一致性 可用性 JMS Java Me ...

  3. ActiveMQ VirtualTopic

    参考网址: http://activemq.apache.org/virtual-destinations.html http://blog.csdn.net/kimmking/article/det ...

  4. ActiveMQ Queue vs Topic vs VirtualTopic

    之前写过一篇文章讨论VirtualTopic,但觉得不够透彻,这里再根据实验结果进行一次横向对比破除模糊和选择困难症. 文章中核心对比要素是:消息副本和负载均衡 Queue的特点和优势 ActiveM ...

  5. MQ学习(二)----ActiveMQ简介(转)

    1.  什么是ActiveMQ ActiveMQ是一种开源的,实现了JMS1.1规范的,面向消息(MOM)的中间件,为应用程序提供高效的.可扩展的.稳定的和安全的企业级消息通信.ActiveMQ使用A ...

  6. ActiveMQ in Action(6) - Features

    关键字: activemq 2.6 Features    ActiveMQ包含了很多功能强大的特性,下面简要介绍其中的几个.2.6.1 Exclusive Consumer    Queue中的消息 ...

  7. 【转】ActiveMQ与虚拟通道

    郑重提示,本文转载自http://shift-alt-ctrl.iteye.com/blog/2065436 ActiveMQ提供了虚拟通道的特性(Virtual Destination),它允许一个 ...

  8. ActiveMQ的Destination高级特性

    1.    Composite Destinations  组合目的地 组合队列Composite Destinations : 允许用一个虚拟的destination代表多个destinations ...

  9. ActiveMQ消息的消费原理

    消费端消费消息: 在 初识ActiveMQ 中我提到过,两种方法可以接收消息,一种是使用同步阻塞的ActiveMQMessageConsumer#receive方法.另一种是使用消息监听器Messag ...

随机推荐

  1. POJ.1986 Distance Queries ( LCA 倍增 )

    POJ.1986 Distance Queries ( LCA 倍增 ) 题意分析 给出一个N个点,M条边的信息(u,v,w),表示树上u-v有一条边,边权为w,接下来有k个询问,每个询问为(a,b) ...

  2. Access to a protected network share using Win32 C++

    WNetAddConnection2 DWORD WNetAddConnection2A( LPNETRESOURCEA lpNetResource, LPCSTR lpPassword, LPCST ...

  3. 1044 Shopping in Mars

    Shopping in Mars is quite a different experience. The Mars people pay by chained diamonds. Each diam ...

  4. MySQL服务无法启动,错误代码1067

    偶然间一次服务器意外重启 重启过后发现MySQL服务停止 手动启动之,发现无法启动 错误代码1067,进程意外终止 遂开始排查问题,首先想到的可能就是my.ini文件出了问题 但是已经忘了写过什么东西 ...

  5. __metaclass__ 实现单列模式

    class Singleton(type): """Singleton. @see: http://stackoverflow.com/questions/6760685 ...

  6. Java Socket Timeout 总结

    原文出处:囚兔 摘要: Java的网络编程Socket常常用于各种网络工具,比如数据库的jdbc客户端,redis客户端jedis,各种RPC工具java客户端,这其中存在一些参数来配置timeout ...

  7. Windows 2012 R2 安装net4.6.1

    下载并安装Net4.6.1 根据提示下载如下,并安装 https://support.microsoft.com/zh-cn/help/2919355/windows-rt-8-1--windows- ...

  8. 简便开发插件 -- lombok

    lombok是一款可以精减java代码.提升开发人员生产效率的辅助工具,可以利用注解在编译期自动生成setter/getter/toString()/constructor代码. 彻底将开发人员从繁琐 ...

  9. css overflow用法

    1. overflow-y: auto 侧边栏滚动效果:overflow-y:auto 2. overflow-y: scroll 如果使用overflow:scroll的话,滚动条就一直都在,页面不 ...

  10. 求助大佬3——hash姿势

    某同学的hash姿势: 完整代码:http://www.cnblogs.com/TheRoadToTheGold/p/6370487.html long long get_hash1(long lon ...