“深入理解RabbitMQ交换机的原理与应用“

深入理解RabbitMQ交换机的原理与应用
- 引言
- 1. RabbitMQ交换机简介介绍
- 1.1 什么是RabbitMQ?
- 1.1.1 消息中间件的作用
- 1.1.2 RabbitMQ的特点和优势
- 1.2 RabbitMQ的基本概念
- 1.2.1 队列
- 1.2.2 交换机
- 1.2.3 路由键
- 1.3 交换机的作用和分类
- 1.3.1 直连交换机(direct exchange)
- 1.3.2 扇出交换机(fanout exchange)
- 1.3.3 主题交换机(topic exchange)
- 1.3.4 头交换机(headers exchange)
- 1.3.5 死信交换机
- 2. RabbitMQ交换机应用
- 2.1直连交换机实践
- 2.2 主题交换机实践
- 2.3 扇形交换机实践
- 总结
引言
在当今的分布式系统和微服务架构中,消息中间件扮演着至关重要的角色。RabbitMQ作为一个功能强大的消息中间件,其交换机是其中核心的组件之一。本文将深入探讨RabbitMQ交换机的原理和应用,帮助读者更好地理解和应用消息队列技术。
1. RabbitMQ交换机简介介绍
1.1 什么是RabbitMQ?
RabbitMQ是一个开源的消息代理软件,它遵循AMQP(高级消息队列协议)标准,用于在分布式系统中存储和转发消息。作为消息中间件,RabbitMQ扮演着消息传递和消息队列的角色,允许应用程序之间进行异步通信。
1.1.1 消息中间件的作用
消息中间件的作用在于解耦消息的发送者和接收者,实现异步通信,提高系统的可伸缩性和弹性。它可以协调不同服务之间的通信,确保消息的可靠传递,并提供消息的持久化、路由和传输等功能。
1.1.2 RabbitMQ的特点和优势
RabbitMQ具有高可靠性、灵活的路由、消息持久化、集群和分布式部署支持等特点。它的优势在于支持多种消息传递模式,如点对点、发布/订阅和路由等,同时提供了丰富的插件和管理工具。
1.2 RabbitMQ的基本概念
1.2.1 队列
队列是消息的容器,用于存储消息直到消费者准备接收它们。消息可以被一个或多个消费者订阅。
1.2.2 交换机
交换机是消息的分发中心,它接收来自生产者的消息,并将它们路由到一个或多个队列。
1.2.3 路由键
路由键是生产者在将消息发送到交换机时附加的关键字,交换机根据路由键将消息路由到一个或多个队列。
1.3 交换机的作用和分类

交换机负责接收来自生产者的消息,并将它们路由到一个或多个队列。RabbitMQ提供了不同类型的交换机,包括直连交换机、扇出交换机、主题交换机和头交换机。
1.3.1 直连交换机(direct exchange)

直连交换机根据消息的路由键将消息路由到特定的队列。它是最简单的交换机类型,路由键与队列绑定的路由键完全匹配时,消息才会被路由到相应的队列。
1.3.2 扇出交换机(fanout exchange)
扇出交换机会将消息路由到与之绑定的所有队列,忽略消息的路由键。这种模式适合广播消息给多个消费者的场景。
1.3.3 主题交换机(topic exchange)
主题交换机根据消息的路由键和通配符将消息路由到一个或多个队列。它提供了更灵活的路由规则,可以根据路由键的模式进行匹配。

1.3.4 头交换机(headers exchange)
头交换机使用消息的属性(headers)来进行匹配,而不是路由键。这种交换机类型提供了更复杂的匹配规则,可以根据消息的属性进行匹配和路由。
1.3.5 死信交换机


2. RabbitMQ交换机应用
2.1直连交换机实践
创建好队列与交换机,并且绑定
@Beanpublic Queue queue1(){return new Queue("queue1");}@Beanpublic Queue queue2(){return new Queue("queue2");}@Beanpublic DirectExchange drectexchange(){return new DirectExchange("drectexchange");}@Beanpublic Binding bingding1(){return BindingBuilder.bind(queue1()).to(drectexchange()).with("a");}@Beanpublic Binding bingding2(){return BindingBuilder.bind(queue2()).to(drectexchange()).with("b");}
生产者方法
@RequestMapping("/send3")public String send3(){//向消息队列发送消息amqpTemplate.convertAndSend("drectexchange","a","hello");return "哈哈;";}
消费者监听
package com.example.consumer;import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.rabbit.annotation.RabbitHandler;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;@Component
@SuppressWarnings("all")
@Slf4j
@RabbitListener(queues = "queue1")
public class ReceiverQ1 {
@RabbitHandler
public void process(String msg) {
log.warn("Q1接收到:" + msg);
}
}
package com.example.consumer;import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.rabbit.annotation.RabbitHandler;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;@Component
@SuppressWarnings("all")
@Slf4j
@RabbitListener(queues = "queue2")
public class ReceiverQ2 {
@RabbitHandler
public void process(String msg) {
log.warn("Q2接收到:" + msg);
}
}
运行一遍send3方法

2.2 主题交换机实践
前提准备,打开RabbitMQ服务,参考 构建高可用消息队列系统 01
进入实战
创建好队列与交换机,并且绑定
@Beanpublic TopicExchange topicExchange(){return new TopicExchange("topicExchange");}@Beanpublic Binding bingding3(){return BindingBuilder.bind(queue1()).to(topicExchange()).with("*.*.a");}@Beanpublic Binding bingding4(){return BindingBuilder.bind(queue2()).to(topicExchange()).with("*.*.b");}@Beanpublic Binding bingding5(){return BindingBuilder.bind(queue1()).to(topicExchange()).with("mq.#");}@Beanpublic Binding bingding6(){return BindingBuilder.bind(queue2()).to(topicExchange()).with("mq.#");}
生产者方法
@RequestMapping("/send4")public String send4(String rex){//向消息队列发送消息amqpTemplate.convertAndSend("topicExchange",rex,"hello");return "哈哈;";}
消费者监听在直连交换机上有
测试1


测试2


测试3
mq打头


2.3 扇形交换机实践
创建好队列与交换机,并且绑定
@Beanpublic FanoutExchange fanoutExchange(){return new FanoutExchange("fanoutExchange");}@Beanpublic Binding bingding7(){return BindingBuilder.bind(queue1()).to(fanoutExchange());}@Beanpublic Binding bingding8(){return BindingBuilder.bind(queue2()).to(fanoutExchange());}
生产者方法
生产者调用convertAndSend时第二个参数必须要有,可以给null值,否则报错
@RequestMapping("/send5")public String send5(){//向消息队列发送消息amqpTemplate.convertAndSend("fanoutExchange","","hello");return "哈哈;";}
消费者监听在直连交换机上有
测试


总结
RabbitMQ交换机作为消息中间件的核心组件,其灵活的路由规则和丰富的特性为分布式系统和微服务架构提供了强大的消息通信支持。通过深理解RabbitMQ交换机的原理和应用,可以更好地设计和构建可靠的消息传递系统,为复杂的应用场景提供稳定高效的消息通信机制。
相关文章:
“深入理解RabbitMQ交换机的原理与应用“
深入理解RabbitMQ交换机的原理与应用 引言1. RabbitMQ交换机简介介绍1.1 什么是RabbitMQ?1.1.1 消息中间件的作用1.1.2 RabbitMQ的特点和优势 1.2 RabbitMQ的基本概念1.2.1 队列1.2.2 交换机1.2.3 路由键 1.3 交换机的作用和分类1.3.1 直连交换机(direct…...
Programming Abstractions in C阅读笔记:p248-p253
《Programming Abstractions in C》学习第69天,p248-p253总结,总计6页。 一、技术总结 “A generalized program for two-player games”如标题所示,该小节强调要学会从一个复杂的程序中抽象出通用的内容——这也是本书的主旨——“Program…...
面试题目,你对前端工程化的了解
前端工程化是通过工具和流程来提高软件开发效率、降低维护成本以及改善项目可维护性的方法。在前端领域,前端工程化通常包括以下方面内容 版本控制 使用 git 来管理代码的版本,追踪变更,协作开发等项目脚手架 使用项目的脚手架进行项目的初始…...
2023年春秋杯网络安全联赛冬季赛 Writeup
文章目录 Webezezez_phppicup Misc谁偷吃了外卖modules明文混淆 Pwnnmanagerbook Reupx2023 CryptoCF is Crypto Faker 挑战题勒索流量Ezdede 可信计算 Web ezezez_php 反序列化打redis主从复制RCE:https://www.cnblogs.com/xiaozi/p/13089906.html <?php c…...
docker安装Rabbitmq教程(详细图文)
目录 1.下载Rabbitmq的镜像 2.创建并运行rabbitmq容器 3.启动web客户端 4.访问rabbitmq的微博客户端 5.遇到的问题 问题描述:在rabbitmq的web客户端发现界面会弹出如下提示框Stats in management UI are disabled on this node 解决方法 (1&#…...
java web mvc-05-JSF JavaServer Faces 入门例子
拓展阅读 Spring Web MVC-00-重学 mvc mvc-01-Model-View-Controller 概览 web mvc-03-JFinal web mvc-04-Apache Wicket web mvc-05-JSF JavaServer Faces web mvc-06-play framework intro web mvc-07-Vaadin web mvc-08-Grails 开源 The jdbc pool for java.(java …...
yolov8 训练voc数据集
yolov8训练 from ultralytics import YOLO# 加载模型 # model YOLO(yolov8n.yaml) # 从YAML构建新模型 # model YOLO(yolov8n.pt) # 加载预训练模型(推荐用于训练) model YOLO(yolov8n.yaml).load(yolov8n.pt) # 从YAML构建并转移权重# 训练模型…...
Python笔记12-多线程、网络编程、正则表达式
文章目录 多线程网络编程正则表达式 多线程 现代操作系统比如Mac OS X,UNIX,Linux,Windows等,都是支持“多任务”的操作系统。 进程: 就是一个程序,运行在系统之上,那么便称之这个程序为一个运…...
X射线中关于高频高压发生器、高清晰平板探测器、大热容量X射线球管、远程遥控系统的解释
高频高压发生器(High Frequency High Voltage Generator) 在医用诊断X射线设备中扮演着关键角色,它主要用于产生并控制用于X射线成像的高压电能。 这种发生器采用高频逆变技术,通过将输入的低电压、大电流转换为高电压、小电流&am…...
【算法】最短路计数(搜索)复习
题目 给出一个 N 个顶点 M 条边的无向无权图,顶点编号为 1 到 N。 问从顶点 1 开始,到其他每个点的最短路有几条。 输入格式 第一行包含 2 个正整数 N,M,为图的顶点数与边数。 接下来 M 行,每行两个正整数 x,y,表…...
html火焰文字特效
下面是代码: <!DOCTYPE html> <html><head><meta charset"UTF-8"><title>HTML5火焰文字特效DEMO演示</title><link rel"stylesheet" href"css/style.css" media"screen" type&quo…...
Redis双写一致性
所有的情况都是再并发情况下存在温蒂 一、先更新数据库,再更新缓存场景-不推荐 当有两个线程A、B,同时对一条数据进行操作,一开始数据库和redis的数据都为1,当线程A去修改数据库,将1改为2,然后线程A在修改…...
html+css+javascript实现贪吃蛇游戏
文章目录 一、贪吃蛇游戏二、JavaScript三、HTML四、CSS五、热门文章 一、贪吃蛇游戏 这是一个简单的用HTML、CSS和JavaScript实现的贪吃蛇游戏示例。 HTML部分: <!DOCTYPE html> <html> <head><title>贪吃蛇游戏</title><styl…...
【K8S】Kubernetes 中滚动发布由浅入深实战
目录 一、Kubernetes中滚动发布的需求背景1.1 滚动发布1.2 滚动发布、蓝绿发布、金丝雀发布的区别 二、Kubernetes中实现滚动发布2.1 定义Kubernetes中的版本2.2 创建 Deployment 资源对象2.2.1 在 Yaml 中定义 Deployment 资源对象2.2.2 执行命令创建 Deployment 资源对象 三、…...
MSP430仿真器使用常见问题
一、 主要是驱动安装问题 有用户反应驱动安装不上,按照用户手册操作一直不能安装成功。 可以尝试如下步骤进行安装。 1. 双击设备管理器中无法安装或者提示有错误的430仿真器设备 选择驱动程序——更新驱动程序 选择手动安装 选择从电脑设备驱动列表中安装 弹出下…...
芯驰E3340软件编译以及更新步骤
打开已有工程File->Open Solution: 东南项目:e3340\boards\e3_324_ref_display\proj\jetour-t1n-fl3\sf\SES 编译:build->build sf 增加头文件和宏定义: 编译完成sf后,进行编译bootloader 东南项目:e3340\boa…...
HCIA——18实验:NAT
学习目标: NAT 学习内容: NAT 1.要求——基本的 2.模型 3.IP分配、规划、优化 1)思路 R2为ISP路由器,其上只能配置ip地址,不得冉进行其他的任何配置—ospf配置 认证 、汇总、沉默接口、加快收敛、缺省路由 PC1-PC2…...
在VBA中使用SQL
VBA在处理大量的数据/计算时如果使用常规方法会比较慢,因此需要对其进行性能优化以提高运行速度,一般的方法是数组计算或者sql计算。SQL计算的速度最快,限制也是最多的,数组速度其次,灵活性也更高 如果要在vba中调用sql处理数据基本可以遵循一个套路,只要修改其中的SQL语…...
vue项目中使用Element多个Form表单同时验证
一、项目需求 在项目中一个页面中需要实现多个Form表单,并在页面提交时需要对多个Form表单进行校验,多个表单都校验成功时才能提交。 二、实现效果 三、多个表单验证 注意项:多个form表单,每个表单上都设置单独的model和ref&am…...
自然语言处理--概率最大中文分词
自然语言处理附加作业--概率最大中文分词 一、理论描述 中文分词是指将中文句子或文本按照语义和语法规则进行切分成词语的过程。在中文语言中,词语之间没有明显的空格或标点符号来分隔,因此需要通过分词工具或算法来实现对中文文本的分词处理。分词的…...
AI-调查研究-01-正念冥想有用吗?对健康的影响及科学指南
点一下关注吧!!!非常感谢!!持续更新!!! 🚀 AI篇持续更新中!(长期更新) 目前2025年06月05日更新到: AI炼丹日志-28 - Aud…...
idea大量爆红问题解决
问题描述 在学习和工作中,idea是程序员不可缺少的一个工具,但是突然在有些时候就会出现大量爆红的问题,发现无法跳转,无论是关机重启或者是替换root都无法解决 就是如上所展示的问题,但是程序依然可以启动。 问题解决…...
R语言AI模型部署方案:精准离线运行详解
R语言AI模型部署方案:精准离线运行详解 一、项目概述 本文将构建一个完整的R语言AI部署解决方案,实现鸢尾花分类模型的训练、保存、离线部署和预测功能。核心特点: 100%离线运行能力自包含环境依赖生产级错误处理跨平台兼容性模型版本管理# 文件结构说明 Iris_AI_Deployme…...
论文浅尝 | 基于判别指令微调生成式大语言模型的知识图谱补全方法(ISWC2024)
笔记整理:刘治强,浙江大学硕士生,研究方向为知识图谱表示学习,大语言模型 论文链接:http://arxiv.org/abs/2407.16127 发表会议:ISWC 2024 1. 动机 传统的知识图谱补全(KGC)模型通过…...
ElasticSearch搜索引擎之倒排索引及其底层算法
文章目录 一、搜索引擎1、什么是搜索引擎?2、搜索引擎的分类3、常用的搜索引擎4、搜索引擎的特点二、倒排索引1、简介2、为什么倒排索引不用B+树1.创建时间长,文件大。2.其次,树深,IO次数可怕。3.索引可能会失效。4.精准度差。三. 倒排索引四、算法1、Term Index的算法2、 …...
自然语言处理——Transformer
自然语言处理——Transformer 自注意力机制多头注意力机制Transformer 虽然循环神经网络可以对具有序列特性的数据非常有效,它能挖掘数据中的时序信息以及语义信息,但是它有一个很大的缺陷——很难并行化。 我们可以考虑用CNN来替代RNN,但是…...
mac 安装homebrew (nvm 及git)
mac 安装nvm 及git 万恶之源 mac 安装这些东西离不开Xcode。及homebrew 一、先说安装git步骤 通用: 方法一:使用 Homebrew 安装 Git(推荐) 步骤如下:打开终端(Terminal.app) 1.安装 Homebrew…...
android13 app的触摸问题定位分析流程
一、知识点 一般来说,触摸问题都是app层面出问题,我们可以在ViewRootImpl.java添加log的方式定位;如果是touchableRegion的计算问题,就会相对比较麻烦了,需要通过adb shell dumpsys input > input.log指令,且通过打印堆栈的方式,逐步定位问题,并找到修改方案。 问题…...
Bean 作用域有哪些?如何答出技术深度?
导语: Spring 面试绕不开 Bean 的作用域问题,这是面试官考察候选人对 Spring 框架理解深度的常见方式。本文将围绕“Spring 中的 Bean 作用域”展开,结合典型面试题及实战场景,帮你厘清重点,打破模板式回答,…...
Oracle11g安装包
Oracle 11g安装包 适用于windows系统,64位 下载路径 oracle 11g 安装包...
