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

news2024/10/6 6:01:43

在这里插入图片描述

深入理解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交换机的原理和应用,可以更好地设计和构建可靠的消息传递系统,为复杂的应用场景提供稳定高效的消息通信机制。

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

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

相关文章

32、WEB攻防——通用漏洞文件上传二次渲染.htaccess变异免杀

文章目录 一、点过滤二、文件删除三、二次渲染四、.htaccess五、过滤php关键函数 一、点过滤 不能写带文件后缀的文件名;IP转数字 二、文件删除 文件依据规则进行删除,删除有两种删除的类型: 什么文件都删除,条件竞争进行绕过…

linux zabbix监控

zabbix总结 zabbix-server 10051 zabbix-agent 10050 zabbix-proxy 10051 1.监控项(模板):获取监控数据 #模板直接链接到新的主机 2.触发器:设置一个值 在非合理区间报警 3.动作:可以帮忙发送通知(告…

深入理解Python循环嵌套

循环嵌套是一种常见的编程技巧,它可以用于处理多维数据结构、模拟多层逻辑等场景。本文将深入探讨Python中的循环嵌套,包括基本语法、应用场景以及一些最佳实践。 循环嵌套的基本语法 在Python中,循环嵌套指的是在一个循环语句的内部再嵌套另…

Microsoft Remote Desktop for Mac(远程桌面连接)激活版

Microsoft Remote Desktop是一款由微软开发的远程桌面连接工具,它允许用户从另一台计算机或移动设备远程连接到Windows桌面或服务器。 以下是该软件的一些主要特点和功能: 跨平台支持:Microsoft Remote Desktop支持Windows、macOS、iOS和Andr…

蓝桥杯(C++ 最大开支 优先队列)

优先队列: 蓝桥杯(C 整数删除 优先队列 )-CSDN博客 思路: 1、每个人依此选择项目,每个人选项目时都(选择当下花费增加最多的项目),若项目i的门票价格为kxb,那么增加一个…

爬取的数据可以入表吗?怎样入表?

合规是数据入表的前提。当前爬虫数据是非常敏感的,因为爬虫极容易造成两大不合规的问题:一是没有经过个人同意获取数据,二是爬取的数据里可能含有个人敏感信息也是一个问题。现在法律对于这部分非常严苛,如果企业里有50条未获得授…

RHCE【报警脚本】

要求如下: 根分区剩余空间小于20% 发送告警邮件给自己 配合crond每5分钟检查一次脚本 报警脚本的具体实现如下: #安装mailx(邮件服务包)[rootlocalhost ~]# yum install mailx #编辑邮件系统文件[rootlocalhost ~]# vim /etc/mail.rc#首先注…

关于在Ubuntu20.04(ROS1 noetic)中使用catkin_make编译时发生的与pyhton版本不兼容的问题解决办法

今天在另外一台电脑上操作复现【ROS建模:一起从零手写URDF模型】这个博客时,发生了一些问题,特此记录下来 【ROS建模:一起从零手写URDF模型】链接:https://blog.csdn.net/qq_54900679/article/details/135726348?spm…

CodeWave智能开发平台-3--采购管理系统搭建完整版

摘要 本文是网易数帆CodeWave智能开发平台系列的第15篇,主要介绍了基于CodeWave平台文档的新手入门进行学习,实现一个完整的应用-采购管理系统。 CodeWave智能开发平台-3–采购管理系统搭建完整版 CodeWave参考资源 网易数帆CodeWave开发者社区课程中…

JFinal项目搭建

JFinal项目搭建 JFinal项目搭建 JFinal项目搭建 首先创建maven项目&#xff1a; 删掉报错的jsp页面&#xff1a; 在pom.xml中加入坐标&#xff1a; <dependency> <groupId>com.jfinal</groupId> <artifactId>jfinal-undertow</artifactId>…

【Redis】内存淘汰策略和过期删除策略

一、前言 Redis是一个内存键值对数据库&#xff0c;所以对于内存的管理尤为重要。Redis内部对于内存的管理主要包含两个方向&#xff0c;过期删除策略和数据淘汰策略。由于内存有限&#xff0c;缓存系统必须遵循一些淘汰策略来删除一些不再需要的键&#xff0c;以便为新键腾出…

【学习】FPN特征金字塔

论文&#xff1a;Feature Pyramid Networks for Object Detection &#xff08;CVPR 2016) 参考blog&#xff1a;https://blog.csdn.net/weixin_55073640/article/details/122627966 参考视频讲解&#xff1a;添加链接描述 卷积网络中&#xff0c;深层网络容易响应语义特征&am…

java对代码进行性能分析

使用Instant对象来完成 关键代码: 获取当前时间 Instant now Instant.now(); 获取当前时间距离1970-01-01 00:00:00的秒数 now.getEpochSecond() 完整测试代码 Scanner sc new Scanner(System.in);Instant now1 Instant.now();System.out.println("请随便输个东西:…

进程线程知识

一 初识linux线程 1 线程由来 我们之前说创建一个进程&#xff0c;要创建进程控制块pcb&#xff0c;进程地址空间&#xff0c;页表&#xff0c;而且我之前的博客中都有意无意的说明这个pcb是描述进程的&#xff0c;是os用来管理进程的&#xff0c;而有了线程后&#xff0c;就要…

软件测试|SQL常用语法,你都会吗?

前言 SQL作为一门语言&#xff0c;和其他编程语言一样&#xff0c;都是需要遵循一些特定的规范和准则的&#xff0c;这也就是我们常说的语法&#xff08;Syntax&#xff09;。 下面是几个SQL的语法规则&#xff1a; 所有的 SQL 语法都必须以关键字&#xff08;也称命令&…

品牌如何把“流量”转为“留量”,媒介盒子分享

如果品牌一味追逐流量只能抓住一时的红利期&#xff0c;因此品牌需要把“流量”转为“留量”。依靠流量红利快速崛起的红利品牌&#xff0c;在流量法则失效后&#xff0c;就会陷入增长困境&#xff0c;今天媒介盒子就来和大家聊聊品牌如何把“流量”转为“留量”。 一、 差异化…

力扣279. 完全平方数

动态规划 思路&#xff1a; 假设 dp[i] 为最少组成数 i 的平方数个数&#xff1b;则其上一个状态为 dp[i - j^2] 1&#xff0c;1 为 j^2&#xff1a; 即 i 的最少完全平方数 i - j^2 的最少完全平方数 1&#xff0c;其中 j^2 < i 为最接近 i 的平方数&#xff1b;初始值…

pikachu_ssrf攻略

ssrf&#xff08;curl&#xff09;&#xff1a; 打开pikachu靶场&#xff1a; http://127.0.0.1/pikachu-master/vul/ssrf/ssrf_curl.php?urlhttp://127.0.0.1/pikachu-master/vul/ssrf/ssrf_info/info1.php 发现URL地址最后面是info1.php 猜测一下有没有可能存在info2.php?…

【Linux工具篇】编辑器vim

目录 vim的基本操作 进入vim(正常模式&#xff09; 正常模式->插入模式 插入模式->正常模式 正常模式->底行模式 底行模式->正常模式 底行模式->退出vim vim正常模式命令集 vim插入模式命令集 vim末行模式命令集 vim操作总结 vim配置 Linux编译器…

Original PIPE and Serdes PIPE

PIPE is PHY Interface for PCIE ,STAT, USB, DispalyPort and Converged IO&#xff0c;上述协议都可以使用这种通用接口。 它是连接物理层PHY 与 MAC( 或者是Link layer ASIC)。PIPE 的技术规范是在上述几种规范基础上发展来的&#xff0c;如果PIPE规范与上述规范有冲突以上述…