当前位置: 首页 > news >正文

ActiveMQ之VirtualTopic

一句话总结: 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是非持久化的,不存在积压。

相关文章:

  • LM_Funny-2-01 递推算法:从数学基础到跨学科应用
  • DeepSeek V3原理
  • 代码随想录day14
  • SolidWorks速成教程P4-4【装配体 | 第四节】——装配体内修改模型编辑配合方法配合报错的解决方法
  • 在华为云部署应用,通过阿里云代理调用第三方接口的利弊与解决方案
  • module ‘cv2.dnn‘ has no attribute ‘DictValue‘解决办法
  • 电力交易员需要哪些证书
  • 安装MinkowskiEngine记录
  • 解决DeepSeek服务器繁忙的有效方法
  • mapbox基础,使用geojson加载circle圆点图层
  • 燧光 XimmerseMR SDK接入Unity
  • nginx 搭建
  • vue中为组建添加样式的方式
  • AI 百炼成神:逻辑回归, 垃圾邮件分类
  • 深入浅出gRPC:原理、HTTP/2协议与四种通信模式详解
  • 【复现DeepSeek-R1之Open R1实战】系列6:GRPO源码逐行深度解析(上)
  • 单证处理新突破:外贸软件助力释放人力价值
  • 【嵌入式Linux应用开发基础】vfork()函数
  • Java+SpringBoot+数据可视化的家庭记账小程序(程序+论文+安装+调试+售后等)
  • Socket通讯协议理解及客户端服务器程序流程
  • 巴基斯坦称回应挑衅,对印度发起军事行动
  • 临港新片区:发布再保险、国际航运、生物医药3个领域数据出境操作指引
  • 三星“七天机”质保期内屏幕漏液被要求自费维修,商家:系人为损坏
  • 央行:当前我国债券市场定价效率、机构债券投资交易和风险管理能力仍有待提升
  • 谜语的强制力:弗洛伊德与俄狄浦斯
  • 诺和诺德一季度减重版司美格鲁肽收入增83%,美国市场竞争激烈下调全年业绩预期