RabbitMQ中常用的三种交换机【Fanout、Direct、Topic】

目录

1、引入

2、Fanout交换机

案例:利用SpringAMQP演示Fanout交换机的使用

3、Direct交换机

案例:利用SpringAMQP演示Direct交换机的使用

4、Topic交换机

案例:利用SpringAMQP演示Topic交换机的使用


1、引入

        真实的生产环境都会经过exchange来发送消息,而不是直接发送到队列,交换机常用类型:

  • Fanout:广播
  • Direct:定向
  • Topic:话题

为什么需要用到交换机:

        我们上一篇文章案例中可以看到,消息发送者如果直接把消息发到队列中,消息就只能被一个消费者消费者,而生产环境下是存在一个消息发出去后,有好几个消费者都可以拿到这个消息去消费的~


2、Fanout交换机

Fanout交换机 会将接收到的消息广播到每一个与其绑定的queue上

案例:利用SpringAMQP演示Fanout交换机的使用

需求:

  • 在RabbitMQ控制台中,声明队列fanout.queue1和fanout.queue2
  • 在RabbitMQ控制台中,声明交换机fan.fanout,将两个队列与其绑定
  • 在consumer服务中,编写两个消费者方法,分别监听fanout.queue1和fanout.queue2
  • 在publisher中编写测试方法,向fan.fanout发送消息

控制台中的操作就不说了,直接看代码:

consumer:

@RabbitListener(queues = "fanout.queue1")public void listenfan1(String msg) throws InterruptedException {System.out.println("接收到消息:" + msg);}@RabbitListener(queues = "fanout.queue2")public void listenfan2(String msg) throws InterruptedException {System.err.println("接收到消息:" + msg);}

publisher:

 @Testpublic void fanoutdemo(){//交换机名String exchangeName = "fan.fanout";//消息String message = "are you ok ?  I am ok !";//发送消息rabbitTemplate.convertAndSend(exchangeName,null, message);}

结果:两个消费者都收到了


3、Direct交换机

        Direct交换机 会将接收到的消息根据规则路由到指定的Queue,因此成为定向路由:

  • 每一个Queue都与Exchange设置一个BindingKey
  • 发布者发送消息时,指定消息的RoutingKey
  • Exchang将消息路由到BindingKey与消息RoutingKey一致的队列

举例:

        现在有一个支付服务,要求支付成功后,给用户发送一条短信。此时支付服务会把支付结果发送到交换机中,而短信服务就会去监听这个交换机,但是交换机不会把所有的消息都路由给短信服务,而只把支付成功的消息路由给这个短信服务。这种情况下,就需要使用到这个Direct交换机,短信服务下的队列和这个交换机设置一个key(例如:success),支付服务发消息时,支付成功RoutingKey设为success,失败为fail,交换机就会只把key为success的消息路由给短信服务了~

如下:

上图中,就是,key为blue,消费者1去消费;key为yellow,消费者1去消费;key为red,两个消费者都能拿到这个消息一起去消息~

案例:利用SpringAMQP演示Direct交换机的使用

需求:

  • 在RabbitMQ控制台中,声明队列dir.queue1和dir.queue2
  • 在RabbitMQ控制台中,声明交换机dir.direct,将两个队列与其绑定
  • 在consumer服务中,编写两个消费者方法,分别监听dir.queue1和dir.queue2
  • 在publisher中编写测试方法,向dir.direct发送消息

控制台中的操作,注意:

直接看代码:

consumer:

@RabbitListener(queues = "dir.queue1")public void listendir1(String msg) throws InterruptedException {System.out.println("接收到" + msg);}@RabbitListener(queues = "dir.queue2")public void listendir2(String msg) throws InterruptedException {System.err.println("接收到" + msg);}

publisher:

@Testpublic void directdemo(){//交换机名String exchangeName = "dir.direct";//发送消息rabbitTemplate.convertAndSend(exchangeName,"red", "消息:red");rabbitTemplate.convertAndSend(exchangeName,"blue","消息:blue");rabbitTemplate.convertAndSend(exchangeName,"yellow","消息:yellow");}

结果:red都能收到,blue、yellow指定的queue才能收到


4、Topic交换机

        Topic交换机与Direct交换机类似,区别在于RoutingKey可以是多个单词的列表,并且以 . 分割

Queue与交换机指定BindingKey时可以使用通配符:

  • # : 代指0个或多个单词
  • * : 代指一个单词

 

案例:利用SpringAMQP演示Topic交换机的使用

需求:

  • 在RabbitMQ控制台中,声明队列topic.queue1和topic.queue2
  • 在RabbitMQ控制台中,声明交换机topic.topic,将两个队列与其绑定
  • 在consumer服务中,编写两个消费者方法,分别监听topic.queue1和topic.queue2
  • 在publisher中编写测试方法,利用不同的RoutingKey向topic.topic发送消息

控制台中的操作,注意:

 consumer:

@RabbitListener(queues = "topic.queue1")public void listentopic1(String msg) throws InterruptedException {System.out.println("接收到" + msg);}@RabbitListener(queues = "topic.queue2")public void listentopic2(String msg) throws InterruptedException {System.err.println("接收到" + msg);}

publisher:

@Testpublic void topicdemo(){//交换机名String exchangeName = "topic.topic";//发送消息rabbitTemplate.convertAndSend(exchangeName,"china.whether", "消息:中国天气预报");rabbitTemplate.convertAndSend(exchangeName,"china.news","消息:中国新闻");rabbitTemplate.convertAndSend(exchangeName,"LD.whether","消息:外国天气预报");rabbitTemplate.convertAndSend(exchangeName,"LD.news","消息:外国新闻");}

结果:

一个只能接到新闻,一个只能接到和中国相关的消息~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/870470.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

1. openstack

openstack 一、云的简介1、优势2、类型2.1 根据提供的服务范围2.2 根据提供服务不同 二、openstack核心组件1、核心组件2、nova组件2.1 nova核心进程 3、glance组件4、cinder组件5、neutron组件6、swift组件7、cellometer组件8、keystone组件9、heat组件10、dashboard 一、云的…

韦东山嵌入式linux系列-LED 驱动程序框架

1 回顾字符设备驱动程序框架 图中驱动层访问硬件外设寄存器依靠的是 ioremap 函数去映射到寄存器地址,然后开始控制寄存器。 那么该如何编写驱动程序? ① 确定主设备号,也可以让内核分配;② 定义自己的 file_operations 结构体&…

【LeetCode:1071. 字符串的最大公因子 + 模拟 + 最大公约数】

🚀 算法题 🚀 🌲 算法刷题专栏 | 面试必备算法 | 面试高频算法 🍀 🌲 越难的东西,越要努力坚持,因为它具有很高的价值,算法就是这样✨ 🌲 作者简介:硕风和炜,…

水库大坝安全监测险情应对措施

汛期暴雨洪涝灾害发生后,为保证大坝及下游人民生命财产安全,应及时进行大坝安全现场检查和快速评估。评估内容包括大坝沉降和水平变形、裂缝、坝坡是否塌滑、下游坡是否存在集中渗漏或大面积渗水、溢洪道启闭设备能否正常运行、近坝库岸是否有大的滑坡体…

react学习——26react-redux实现求和案例(完整版)

1、目录结构 2、components/count/index.js import React, {Component} from "react"; export default class Count extends Component {//加法increment()>{const {value} this.selectNumthis.props.jia(Number(value))}//减法decrement()>{const {value} …

一场夏测杀出个“双冠王”,极越01成为纯电SUV标杆

文 | AUTO芯球 作者 | 雷慢 万万没想到,懂车帝夏测运动会杀出一匹最大的黑马,竟然是极越01。 当前正在进行的懂车帝夏测运动会,在“纯电SUV/MPV续航达成率”赛事中,极越01以85.8%的续航达成率获得第一名。并且由于赛制规则限制…

应力 (Stress) 是指单位面积上所承受的力

应力 (Stress) 是指单位面积上所承受的力 flyfish 轴向力 轴向力 (Axial Force) 是指沿着物体的纵轴施加的力。对于一根杆或柱子,轴向力可以是拉力或压力,具体取决于力的方向。 拉力 (Tensile Force):使物体拉长的力。 压力 (Compressive…

Vue中实现在线画流程图实现

概述 最近在调研一些在线文档的实现,包括文档编辑器、在线思维导图、在线流程图等,前面的文章基于语雀编辑器的在线文档编辑与查看实现了文档编辑器。在本文,分享在Vue框架下基于metaeditor-mxgraph实现在线流程图。 实现效果 实现 1. 添加…

LabVIEW开发CAN总线多传感器液位检测系统

设计并实现了一个基于CAN总线和LabVIEW的多传感器液位检测系统。该系统利用STM32F107单片机进行模拟信号与数字信号的转换,通过TJA1050实现CAN总线通信,并使用USB-CAN分析仪连接PC。LabVIEW用于数据采集、人机交互界面的设计、数据分析和仪器标定。系统能…

Paimon下载使用和基础操作说明

简介 Apache Paimon 是一种湖格式,支持使用 Flink 和 Spark 构建实时湖仓一体架构 用于流式处理和批处理操作。Paimon创新性地将湖格式与LSM(Log-structured merge-tree)相结合 结构,将实时流式更新引入 Lake 架构。 Paimon提供以…

05_TypeScript 中的数据类型

TypeScript 中的数据类型 一、概述二、详解布尔类型(boolean) true / false数字类型(number)字符串类型(string)数组类型(array)元组类型(tuple) 属于数组的一…

linux高级编程(网络)

数据的封包和拆包 封包: 应用层数据(例如HTTP请求)被传递给传输层。传输层(TCP)在数据前添加TCP头部(包含端口号、序列号等)。网络层(IP)在TCP段前添加IP头部&#xff…

C#Winform窗体中嵌入exe文件

1,效果以嵌入Modbus Slave为例: 2,代码: public partial class Form1 : Form{//设置嵌入exe的常量private const int nIndex -16;private const int dwNewLong 0x10000000;Process m_AppProcess;public Form1(){InitializeCompo…

VIM模式之间的切换

命令行界面下,常用的文本编辑器是 VI / VIM(VI增强版),VI 是 Linux 最通用的文本编辑器,VIM相较于VI,提供了代码高亮等功能,两者用法完全兼容; 1. 进入 VIM 工作界面 vim 文件名 2. 进入编辑模式 三种方…

ENSP中OSPF配置

题目 划分网段,配置ip OSPF配置按照区域划分,这个网段也要按照区域个数划分,如这一题,分成两个区域,所以将192.168.1.0/24划分先为两个网段,然后在具体的划分区域中的网段。 以交换机为中心的三条线属于一…

[Qt] Qt Creator中,新建QT文件时选择界面模版下的各选项

在Qt Creator中,新建文件时选择界面模版下的各选项具有特定的意义,这些选项主要帮助开发者根据项目需求快速生成不同类型的文件。以下是对这些选项的详细解释: 0. Qt Item Model 意义:列表模型是Qt中用于表示和操作数据的强大抽…

Android 使用 Debug.startMethodTracing 分析方法耗时

参考 Generate Trace Logs by Instrumenting Your App 官网提供了 trace 工具来分析方法耗时。 生成 trace 文件 package com.test.luodemo.trace;import androidx.appcompat.app.AppCompatActivity;import android.os.Bundle; import android.os.Debug; import android.uti…

js vue table单元格合并

实现效果 关键代码 <table classtable table-bordered><thead><tr><th>检测项目</th><th>详细说明</th><th>检测结果</th><th>检测说明</th></tr></thead><tbody><tr ng-repeatrow in…

【car】深入浅出学习机械燃油车知识、结构、原理、维修、保养、改装、编程

汽车的五大总成通常是指发动机、变速器、前后桥、车架和悬挂系统。 发动机&#xff1a;是汽车的动力来源&#xff0c;负责将燃料的化学能转化为机械能&#xff0c;驱动汽车行驶。常见的发动机类型有内燃机&#xff08;如汽油发动机、柴油发动机&#xff09;和电动机&#xff0…