之前写过一篇文章讨论VirtualTopic,但觉得不够透彻,这里再根据实验结果进行一次横向对比破除模糊和选择困难症。

文章中核心对比要素是:消息副本和负载均衡

Queue的特点和优势

ActiveMQ中Queue适用于“一对一”场景,单条消息无副本,只会被一个消费者消费。如果单个队列同时有多个消费者连接,则消息会按照一定的顺序依次发送给不同消费者消费,例如10条消息发送给5个消费者,那么消费者(1,2,3,4,5)分别获得(2,1,3,2,2)条消息,这就实现了负载均衡。

所以Queue的特点是:无副本,可负载

Topic的特点和优势

ActiveMQ中Topic适用于“一对多”场景,单条消息有副本,同时被多个消费者消费,如果单个Topic同时有多个消费者连接,则消息按照副本形式全量发送给不同消费者,例如10条消息发送给5个消费者,那么消费者(1,2,3,4,5)分别获得(10,10,10,10,10)条消息,显然无法实现负载均衡。

所以Topic的特点是:有副本,不可负载

VirtualTopic的特点和优势

Queue是无副本,可负载, Topic是有副本,不可负载, 那么还有一种场景需要有副本,可负载,为了满足这种需求,VirtualTopic机制被加入了进来,VirtualTopic使用生产者发送的Topic实现了有副本, 使用消费者消费的Queue实现了可负载,所以VirtualTopic的特点是:有副本,可负载

这里补充一下VirtualTopic的使用说明:

VirtualTopic是一种内嵌机制,默认开启无需配置,使用者通过使用特殊命名的Topic和Queue来使用VirtualTopic机制,默认的命名方式是:

Topic:   VirtualTopic.>
Queue: Consumer.*.VirtualTopic.> # * 和 > 表示通配符
# 例如如果Topic命名为: VirtualTopic.Test,那么Queue就要命名为Consumer.A.VirtualTopic.Test 才能收到来自Topic分发的消息

当然我们可以自己配置相应的命名方式:

vim activemq.xml

<destinationInterceptors>
<virtualDestinationInterceptor>
<virtualDestinations>
<virtualTopic name="NewVirtualTopic.>" prefix="VirtualTopicConsumers.*."/>
</virtualDestinations>
</virtualDestinationInterceptor>
</destinationInterceptors> # <virtualTopic name="NewVirtualTopic.>" prefix="VirtualTopicConsumers.*."/> 中 name表示 Topic的命名方式,prefix表示 Queue相对于Topic的前缀
# 例如Topic 需要命名为 NewVirtualTopic.Test , Queue需要命名为 VirtualTopicConsumers.A.NewVirtualTopic.Test
# * 和 > 都是通配符,可以混用

总结

到这里,我们可以按照 消息副本和负载均衡两个关键点来对三者进行区分:

无副本,可负载 使用 Queue

有副本,不可负载 使用 Topic

有副本,可负载 使用VirtualTopic

这两个区分点可以说是这三种机制的核心特点,并且不论是否持久化都成立。我们可以具此匹配不同的业务场景酌情使用,至于剩下的那种情况应该是没有需求的。

ActiveMQ Queue vs Topic vs VirtualTopic的更多相关文章

  1. ActiveMQ queue和topic,持久订阅和非持久订阅

    消息的 destination 分为 queue 和 topic,而消费者称为 subscriber(订阅者).queue 中的消息只会发送给一个订阅者,而 topic 的消息,会发送给每一个订阅者. ...

  2. ActiveMQ的queue以及topic两种消息处理机制分析

    1    queue与topic的技术特点对比 对比项 Topic Queue 概要 Publish Subscribe messaging 发布订阅消息 Point-to-Point 点对点 有无状 ...

  3. activemq安装运行及其在springboot中的queue和topic使用

    安装activemq 运行 springboot使用 依赖 配置 Producer Consumer ComsumerTopic 使用 安装activemq http://activemq.apach ...

  4. SpringBoot整合ActiveMq实现Queue和Topic两种模式(看不懂你来打我)

    目录 一.前言 二.ActiveMq的下载和使用 三.依赖准备 四.yml文件配置 五.配置Bean 六.创建生产者(Queue+Topic) 七.创建消费者(Topic模式下) 八.测试结果(Top ...

  5. 【ActiveMQ入门-5】ActiveMQ学习-Queue与Topic的比较

    Queue与Topic的比较 1.JMS Queue执行load balancer语义: 一条消息仅能被一个consumer收到. 如果在message发送的时候没有可用的consumer,那么它将被 ...

  6. queue与topic的技术特点对比

    1    queue与topic的技术特点对比 Topic Queue 概要 Publish Subscribe messaging 发布订阅消息 Point-to-Point 点对点 有无状态 to ...

  7. springboot使用activemq同时接收queue和topic消息

    原文链接:https://blog.csdn.net/jia_costa/article/details/79354478 新建springboot项目, pom文件如下 <?xml versi ...

  8. ActiveMQ——activemq的详细说明,queue、topic的区别(精选)

    JMS中定义了两种消息模型:点对点(point to point, queue)和发布/订阅(publish/subscribe,topic).主要区别就是是否能重复消费. 点对点:Queue,不可重 ...

  9. ActiveMQ queue 分页

    分页:即获取部分数据,queue按页从message cursor读取消息,然后分发给consumer. 页大小: public abstract class BaseDestination impl ...

随机推荐

  1. 如何下载官网最新版 win10 系统?

    如何下载官网最新版 win10 系统?步骤: 一. 下载 遨游浏览器 将UA切换成,手机访问:推荐 UC浏览器,UA设置: Mozilla/5.0 (Linux; U; Android 8.0.0; ...

  2. Linux 常用操作和命令

    腾讯云部署 java web 环境:https://blog.csdn.net/niceLiuSir/article/details/78879844 Tomcat部署和配置:https://blog ...

  3. Archer和ArcherUI配置说明

    如果Bladex的网关端口是80,则需要修改Archer服务端口,并修改ArcherUI的vue.config.js的端口

  4. EasyDSS高性能RTMP、HLS(m3u8)、HTTP-FLV、RTSP流媒体服务器前端源码重构(六)- webpack-dev-server 自适应支持手机端访问

    关于EasyDSS EasyDSS商用流媒体服务器解决方案是一套集流媒体点播.转码与管理.直播.录像.检索.时移回看于一体的一套完整的商用流媒体服务器解决方案,EasyDSS高性能RTMP流媒体服务器 ...

  5. [转]MathJax与LaTex公式简介

    链接地址:https://www.cnblogs.com/linxd/p/4955530.html

  6. 【环境搭建与软件安装】windows系统基于Anaconda安装tensorflow-gpu

    https://github.com/tensorflow/tensorflow/issues/21832 原来是tensorflow-gpu-1.10.0,准备改为1.9.0试试,同样的问题: 应该 ...

  7. SQL Server跨服务器操作数据库

    今天给大家来分享一下跨服务器操作数据库,还是以SQL Server的管理工具(SSMS)为平台进行操作. 什么是跨服务器操作? 跨服务器操作就是可以在本地连接到远程服务器上的数据库,可以在对方的数据库 ...

  8. swoole实战1-初识swoole

    原文地址:https://www.jianshu.com/p/008d5702d01f 安装swoole 以mac操作系统为例,如果你是mac新手,推荐阅读 程序员如何优雅使用mac 环境要求:php ...

  9. java面试 (七)- 关于String

    1 String的定义(Java8中) // final的类,不能被继承// 继承了序列化接口,comparable接口,public final class String implements ja ...

  10. Jenkins通过完全复制快速创建新项目