“深入理解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直连交换机实践

创建好队列与交换机,并且绑定

 @Bean
    public Queue queue1(){
        return new Queue("queue1");
    }
    @Bean
    public Queue queue2(){
        return new Queue("queue2");
    }
    @Bean
    public DirectExchange drectexchange(){
        return new DirectExchange("drectexchange");
    }
    @Bean
    public Binding bingding1(){
        return BindingBuilder.bind(queue1()).to(drectexchange()).with("a");
    }
    @Bean
    public 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

进入实战

创建好队列与交换机,并且绑定

  @Bean
    public TopicExchange topicExchange(){
        return new TopicExchange("topicExchange");
    }
    @Bean
    public Binding bingding3(){
        return BindingBuilder.bind(queue1()).to(topicExchange()).with("*.*.a");
    }
    @Bean
    public Binding bingding4(){
        return BindingBuilder.bind(queue2()).to(topicExchange()).with("*.*.b");
    }
    @Bean
    public Binding bingding5(){
        return BindingBuilder.bind(queue1()).to(topicExchange()).with("mq.#");
    }
    @Bean
    public 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 扇形交换机实践

创建好队列与交换机,并且绑定

  @Bean
    public FanoutExchange fanoutExchange(){
        return new FanoutExchange("fanoutExchange");
    }
    @Bean
    public Binding bingding7(){
        return BindingBuilder.bind(queue1()).to(fanoutExchange());
    }
    @Bean
    public Binding bingding8(){
        return BindingBuilder.bind(queue2()).to(fanoutExchange());
    }

生产者方法
生产者调用convertAndSend时第二个参数必须要有,可以给null值,否则报错

 @RequestMapping("/send5")
    public String send5(){
        //向消息队列发送消息
        amqpTemplate.convertAndSend("fanoutExchange","","hello");
        return "哈哈;";
    }

消费者监听在直连交换机上有
测试
在这里插入图片描述

在这里插入图片描述

总结

RabbitMQ交换机作为消息中间件的核心组件,其灵活的路由规则和丰富的特性为分布式系统和微服务架构提供了强大的消息通信支持。通过深理解RabbitMQ交换机的原理和应用,可以更好地设计和构建可靠的消息传递系统,为复杂的应用场景提供稳定高效的消息通信机制。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【MySQL进阶】锁

文章目录 锁概述全局锁语法特点 表级锁表锁意向锁 行级锁行锁间隙锁&临键锁 面试了解数据库的锁吗?介绍一下间隙锁InnoDB中行级锁是怎么实现的?数据库在什么情况下会发生死锁?说说数据库死锁的解决办法 锁 概述 锁机制:数据库…

C++进阶--哈希的应用之位图和布隆过滤器

哈希的应用之位图和布隆过滤器 一、位图1.1 位图(bitset)的提出1.2 位图的概念1.3 位图的模拟实现1.3.1 位图的底层结构1.3.2 位图的成员函数1.3.2.1 位图的构造1.3.2.2 位图的插入:set1.3.2.3 位图的删除:reset1.3.2.4 位图的查找…

LLM for Kernel Fuzzing

KernelGPT: Enhanced Kernel Fuzzing via Large Language Models 1.Introduction2.Background2.1.Kernel and Device Drivers2.2.Kernel Fuzzing2.2.1.Syzkaller规约2.2.2.规约生成 3.Approach3.1.Driver Detection3.2.Specification Generation3.2.1.Command Value3.2.2.Argum…

鸿蒙自定义刷新组件使用

前言 DevEco Studio版本:4.0.0.600 1、RefreshLibrary_HarmonyOS.har,用于HarmonyOS "minAPIVersion": 9, "targetAPIVersion": 9, "apiReleaseType": "Release", "compileSdkVersion": "3.…

【Redis】Redis如何实现key的过期删除

​ 🍎个人博客:个人主页 🏆个人专栏:Redis ⛳️ 功不唐捐,玉汝于成 ​ 目录 前言 正文 结语 我的其他博客 前言 在当今信息时代,数据的快速存储和高效检索成为了软件系统设计中的核心需求。Redis作为…

idea中git提交代码更改作者名字

代码提交远程的时候显示的是上一个离职同事的用户名,有两种方法进行更改 在C盘【C:\Users\Administrator】中找到.gitconfig文件 进行更改 打开文件 将姓名以及邮箱改成自己的即可 [user] name xxxxx email xxxxx163.com 如图所示 命令行更改 在Termi…

ESP32-WROVER-DEV连接W5500实现有线网络

目的:ESP32-WROVER-DEV相机模块连接W5500模块,实现有线网络的连接。 开发环境:Arduino 2.1.1 可以实现的功能:可以使用web的ping访问,ESP32的LED IO2闪烁。 硬件连接如下图: 模块硬件的导线连接 W5500 …

SpringBoot项目整合MybatisPlus并使用SQLite作为数据库

文章目录 SQLite介绍搭建项目创建项目修改pom.xml SQLite查看SQLite是否安装创建数据库创建数据表IDEA连接SQLitenavicat连接SQLite数据库 后端增删改查接口实现MybatisX生成代码不会生成看这个UserUserMapperUserMapper.xml controller创建配置文件application.yaml启动类Incr…

行测-判断:2.类比推理

行测-判断:2.类比推理 给出一组相关的词,要求通过观察分析,在备选答案中找出一组与之在逻辑关系上最为贴近或相似的词。 1. 语义关系★★ 1.1 近义关系,反义关系 C,反义词 B,BD 都是近义词,考…

JavaEE-SSM-订单管理-后端增删改查(二)

.2.5 添加 编写OrderMapper接口中的insert方法 编写OrderService接口中的save方法 编写OrderServiceImpl实现类中的save方法 编写OrderController中的add方法 编写OrderMapper接口中的insert方法 /*** 插入* param order* return*/Insert("insert into order(oid,pr…

MySQL之数据库DDL

文章目录 MySQL数据库基本操作数据定义DDL对数据库的常用操作创建表修改表格式结构 MySQL数据库基本操作 首先我们先了解SQL的语言组成,他分为四个部分 数据定义语言(DDL)数据操纵语言(DML)数据控制语言(…

如何使用宝塔面板搭建Typecho博客站点并结合内网穿透远程访问

文章目录 前言1. 安装环境2. 下载Typecho3. 创建站点4. 访问Typecho5. 安装cpolar6. 远程访问Typecho7. 固定远程访问地址8. 配置typecho 前言 Typecho是由type和echo两个词合成的,来自于开发团队的头脑风暴。Typecho基于PHP5开发,支持多种数据库&#…

算法(4)——前缀和

目录 一、前缀和的定义 二、一维前缀和 三、一维前缀和OJ题 3.1、前缀和 3.2、寻找数组中心下标 3.3、除自身以外数组的乘积 3.4、和为K的数组 3.5、和可被K整除的子数组 3.6、连续数组 四、二位前缀和 4.1、二维前缀和 4.2、矩阵区域和 一、前缀和的定义 对于一个…

Quartz框架中的Corn表达式

Cron 表达式是一个字符串,分为 6 或 7 个域,每一个域代表一个含义 Cron 有如下两种语法格式: (1)Seconds Minutes Hours Day Month Week Year (2)Seconds Minutes Hours Day Month Week 一、…

Java SE:面向对象(下)

1. static关键字 静态区的特点:静态区里面的每一样东西都是唯一有且仅有一个的,如此时str1 "abc"即此时静态区里面已经创建了字符串abc并将abc地址赋给str1,后面在进行赋值也不会在静态区开辟一串新的"abc" 1.1 static修…

蓝桥杯省赛无忧 课件38 第4次学长带练配套课件

01 最大数组和 02 四元组问题 03 鸡哥的购物挑战 04 冒险者公会 05 明日方舟大挑战 06 七段码

一.Winform使用Webview2(Edge浏览器核心) 创建demo(Demo1)实现回车导航到指定地址

Winform使用Webview2创建demo1实现回车导航到指定地址 往期目录参考文档实现1.安装visual studio2.创建单窗口应用3.修改项目中的窗体名称MainForm4.添加按钮5.添加窗口Demo16.在Demo1中添加WebView2 SDK7.在Demo1窗体中选择添加textbox和webview28.在MainForm.cs窗体中添加but…

idea——git提交到本地记录如何退回/删除

目录 一、git提交到本地记录如何退回/删除 一、git提交到本地记录如何退回/删除 git提交到本地记录,如下图【更新】记录,表示本次提交到git本地需要退回/删除的操作: 选中项目,右键点击【git】——>【Show History】——>…

vscode运行python,终端能正常运行,输出(Code Runner)不能正常运行

右键->Run Code报错: [Done] exited with code9009 in 0.111 seconds 我的解决方案:仔细检查自己选的python.exe(解释器)在path环境变量中是否存在或路径是否正确!!! 我就是太自信了&#xf…

REVIT二次开发 自动门窗墙体标注

步骤1 步骤2 步骤3 using System; using System.Collections.Generic; using System.Linq; using System