RabbitMQ 交换机的类型
在 RabbitMQ 中,交换机(Exchange)是一个核心组件,负责接收来自生产者的消息,并根据特定的路由规则将消息分发到相应的队列。交换机的存在改变了消息发送的模式,使得消息的路由更加灵活和高效。
交换机的类型
RabbitMQ 提供了四种主要类型的交换机,每种交换机的路由规则不同:
-
Direct Exchange(直连交换机):
- 功能:基于路由键(Routing Key)将消息发送到与该路由键完全匹配的队列。
- 应用场景:适用于需要精确匹配路由键的场景。
- 示例:假设有两个队列 A 和 B,A 绑定了路由键
key1,B 绑定了路由键key2。当生产者发送一条路由键为key1的消息时,只有队列 A 会接收到这条消息。
-
Fanout Exchange(扇出交换机):
- 功能:将消息广播到所有绑定到该交换机的队列,不考虑路由键。
- 应用场景:适用于需要将消息广播到多个队列的场景。
- 示例:假设有两个队列 A 和 B 都绑定到了一个 Fanout 交换机上。当生产者发送一条消息到该交换机时,A 和 B 都会接收到这条消息。
-
Topic Exchange(主题交换机):
- 功能:基于路由键的模式匹配(使用通配符)将消息发送到匹配的队列。
- 应用场景:适用于需要基于模式匹配路由键的场景。
- 示例:假设有两个队列 A 和 B,A 绑定了路由键模式
key.*,B 绑定了路由键模式key.#。当生产者发送一条路由键为key.test的消息时,A 和 B 都会接收到这条消息。
-
Headers Exchange(头交换机):
- 功能:基于消息的头部属性进行匹配,将消息发送到匹配的队列。
- 应用场景:适用于需要基于消息头部属性进行路由的场景。
- 示例:这种交换机使用较少,通常在特定情况下才会使用。
交换机的作用
- 消息路由:交换机根据路由规则将消息分发到相应的队列。
- 解耦生产者和消费者:生产者只需将消息发送到交换机,不需要知道消息的最终目的地队列。
- 灵活性和扩展性:通过不同类型的交换机,可以实现复杂的消息路由逻辑,满足各种业务需求。
示例代码
以下是如何使用 Direct Exchange 和 Fanout Exchange 的示例代码:
Direct Exchange 示例
const amqp = require('amqplib/callback_api');amqp.connect('amqp://localhost', function(error0, connection) {if (error0) {throw error0;}connection.createChannel(function(error1, channel) {if (error1) {throw error1;}const exchange = 'direct_logs';const msg = 'Hello World!';const routingKey = 'key1';channel.assertExchange(exchange, 'direct', { durable: true });channel.publish(exchange, routingKey, Buffer.from(msg));console.log(" [x] Sent %s: '%s'", routingKey, msg);});setTimeout(function() {connection.close();process.exit(0);}, 500);
});
Fanout Exchange 示例
const amqp = require('amqplib/callback_api');amqp.connect('amqp://localhost', function(error0, connection) {if (error0) {throw error0;}connection.createChannel(function(error1, channel) {if (error1) {throw error1;}const exchange = 'logs';const msg = 'Hello World!';channel.assertExchange(exchange, 'fanout', { durable: true });channel.publish(exchange, '', Buffer.from(msg));console.log(" [x] Sent %s", msg);});setTimeout(function() {connection.close();process.exit(0);}, 500);
});
Topic Exchange 示例
Topic Exchange 允许使用通配符进行路由,支持更复杂的路由规则。
发布者代码
const amqp = require('amqplib/callback_api');amqp.connect('amqp://localhost', function(error0, connection) {if (error0) {throw error0;}connection.createChannel(function(error1, channel) {if (error1) {throw error1;}const exchange = 'topic_logs';const msg = 'Hello World!';const routingKey = 'quick.orange.rabbit';channel.assertExchange(exchange, 'topic', { durable: true });channel.publish(exchange, routingKey, Buffer.from(msg));console.log(" [x] Sent %s: '%s'", routingKey, msg);});setTimeout(function() {connection.close();process.exit(0);}, 500);
});
消费者代码
const amqp = require('amqplib/callback_api');amqp.connect('amqp://localhost', function(error0, connection) {if (error0) {throw error0;}connection.createChannel(function(error1, channel) {if (error1) {throw error1;}const exchange = 'topic_logs';const queue = 'topic_queue';channel.assertExchange(exchange, 'topic', { durable: true });channel.assertQueue(queue, { durable: true });// 绑定队列到交换机,使用通配符channel.bindQueue(queue, exchange, '*.orange.*');channel.consume(queue, function(msg) {if (msg.content) {console.log(" [x] Received %s: '%s'", msg.fields.routingKey, msg.content.toString());}}, { noAck: true });});
});
在这个示例中,发布者将消息发送到 topic_logs 交换机,使用路由键 quick.orange.rabbit。消费者绑定到 topic_logs 交换机,使用通配符 *.orange.*,因此会接收到所有包含 orange 的消息。
Headers Exchange 示例
Headers Exchange 基于消息头部属性进行路由,适用于需要复杂路由规则的场景。
发布者代码
const amqp = require('amqplib/callback_api');amqp.connect('amqp://localhost', function(error0, connection) {if (error0) {throw error0;}connection.createChannel(function(error1, channel) {if (error1) {throw error1;}const exchange = 'headers_logs';const msg = 'Hello World!';channel.assertExchange(exchange, 'headers', { durable: true });channel.publish(exchange, '', Buffer.from(msg), {headers: {'format': 'pdf','type': 'report'}});console.log(" [x] Sent %s", msg);});setTimeout(function() {connection.close();process.exit(0);}, 500);
});
消费者代码
const amqp = require('amqplib/callback_api');amqp.connect('amqp://localhost', function(error0, connection) {if (error0) {throw error0;}connection.createChannel(function(error1, channel) {if (error1) {throw error1;}const exchange = 'headers_logs';const queue = 'headers_queue';channel.assertExchange(exchange, 'headers', { durable: true });channel.assertQueue(queue, { durable: true });// 绑定队列到交换机,使用头部属性channel.bindQueue(queue, exchange, '', {'x-match': 'all','format': 'pdf','type': 'report'});channel.consume(queue, function(msg) {if (msg.content) {console.log(" [x] Received %s", msg.content.toString());}}, { noAck: true });});
});
在这个示例中,发布者将消息发送到 headers_logs 交换机,并设置消息头部属性 format: pdf 和 type: report。消费者绑定到 headers_logs 交换机,使用头部属性匹配 format: pdf 和 type: report,因此会接收到符合这些头部属性的消息。
相关文章:
RabbitMQ 交换机的类型
在 RabbitMQ 中,交换机(Exchange)是一个核心组件,负责接收来自生产者的消息,并根据特定的路由规则将消息分发到相应的队列。交换机的存在改变了消息发送的模式,使得消息的路由更加灵活和高效。 交换机的类…...
机器人顶会参会经验——许华哲老师PRE-IROS 2024分享
摘要:清华大学交叉信息学院许华哲老师在PRE-IROS 2024上分享了机器人顶会参会技巧,包括社交和活动选择方面的实用建议等内容。本文整理了许老师在直播中分享的干货。 在刚刚过去的PRE-IROS 2024论文预分享会上,清华叉院许华哲老师全方位解析…...
计算机组成原理--一章二章
这里写目录标题 第一章:计算机系统概述计算机的发展计算机的组成计算机的性能指标 第二章:数据的表示和运算2.1进位十进制BCD码无符号整数的表示和运算带符号整数的表示和运算原反补码的特性对比移码定点小数 2.2奇偶校验码算数逻辑运算单元(…...
zookeeper kafka集群配置
一.下载安装包 地址:https://download.csdn.net/download/cyw8998/16579797 二.配置文件 zookeeper.properties dataDir/data/kafka/zookeeper_data/zookeeper # the port at which the clients will connect clientPort2181 # disable the per-ip limit on the…...
Java IO 基础知识
IO 流简介 IO 即 Input/Output,输入和输出。数据输入到计算机内存的过程即输入,反之输出到外部存储(比如数据库,文件,远程主机)的过程即输出。数据传输过程类似于水流,因此称为 IO 流。IO 流在…...
【报错处理】MR/Spark 使用 BulkLoad 方式传输到 HBase 发生报错: NullPointerException
博主希望能够得到大家的点赞收藏支持!非常感谢 点赞,收藏是情分,不点是本分。祝你身体健康,事事顺心! Spark 通过 BulkLoad 方式传输到 HBase,我发现会出现空指针异常。简单写下如何解决的。 原理…...
域7:安全运营 第17章 事件的预防和响应
第七域包括 16、17、18、19 章。 事件的预防和响应是安全运营管理的核心环节,对于组织有效识别、评估、控制和减轻网络安全威胁至关重要。这一过程是循环往复的,要求组织不断总结经验,优化策略,提升整体防护能力。通过持续的监测、…...
Linux常见基本指令 +外壳shell + 权限的理解
下面这篇文章主要介绍了一些Linux的基本指令及其周边知识, 以及shell的简单理解和权限的理解. 目录 前言1.基本指令及其周边知识1.1 ADD类touch [file]文件的时间mkdir [directory]cp [file/directory]echo [file]输出重定向Linux中, 一切皆文件 1.2 DELETE类rmdirrm通配符关机…...
Android Framework AMS(07)service组件启动分析-1(APP到AMS流程解读)
该系列文章总纲链接:专题总纲目录 Android Framework 总纲 本章关键点总结 & 说明: 说明:本章节主要解读应用层service组件启动的2种方式startService和bindService,以及从APP层到AMS调用之间的打通。关注思维导图中左侧部分即…...
深度学习:领域适应(Domain Adaptation)详解
领域适应(Domain Adaptation)详解 领域适应是机器学习中的一个重要研究领域,它解决的问题是模型在一个领域(源域)上训练得到的知识如何迁移到另一个有所差异的领域(目标域)上。领域适应特别重要…...
华三服务器R4900 G5在图形界面使用PMC阵列卡(P460-B4)创建RAID,并安装系统(中文教程)
环境以用户需求安装Centos7.9,服务器使用9块900G硬盘,创建RAID1和RAID6,留一块作为热备盘。 使用笔记本通过HDM管理口()登录 使用VGA()线连接显示器和使用usb线连接键盘鼠标,进行窗…...
Linux实验三
Linux实验三 实验步骤: 一、登录进入 CentOS7 系统,打开并进入终端,使用 su root 切换到 root 用户 ; 二、将主机名称修改为 个人学号,并完成以下操作: 1、使用 uname -a 查看系统内核信息&#x…...
Vue预渲染:深入探索prerender-spa-plugin与vue-meta-info的联合应用
在前端开发的浪潮中,Vue.js凭借其轻量级、易上手和高效的特点,赢得了广大开发者的青睐。然而,单页面应用(SPA)在SEO方面的短板一直是开发者们需要面对的挑战。为了优化SEO,预渲染技术应运而生,而…...
使用`ThreadLocal`来优化鉴权逻辑并不能直接解决Web应用中session共享的问题
使用ThreadLocal来优化鉴权逻辑并不能直接解决Web应用中session共享的问题。实际上,ThreadLocal和session共享是两个不同的概念,它们解决的问题也不同。 ThreadLocal的作用 ThreadLocal是Java中提供的一个线程局部变量类,它可以让每个线程都拥有一个独立的变量副本,这样线…...
Python implement for PID
Python,serves as language for calculation of any domain 待更 Reference PID pythonPID git...
C++中的initializer_list类
目录 initializer_list类 介绍 基本使用 常见函数 initializer_list类 介绍 initializer_list类是C11新增的类,其原型如下: template<class T> class initializer_list; 有了initializer_list,一些容器也可以实现列表初始化&am…...
持续科技创新 高德亮相2024中国测绘地理信息科技年会
图为博览会期间, 自然资源部党组成员、副部长刘国洪前往高德企业展台参观。 10月15日,2024中国测绘地理信息科学技术年会暨中国测绘地理信息技术装备博览会在郑州召开。作为国内领先的地图厂商,高德地图凭借高精度高动态导航地图技术应用受邀参会。 本…...
深入理解HTTP Cookie
🍑个人主页:Jupiter. 🚀 所属专栏:Linux从入门到进阶 欢迎大家点赞收藏评论😊 目录 HTTP Cookie定义工作原理分类安全性用途 认识 cookie基本格式实验测试 cookie 当我们登录了B站过后,为什么下次访问B站就…...
Python多进程编程:使用`multiprocessing.Queue`进行进程间通信
Python多进程编程:使用multiprocessing.Queue进行进程间通信 1. 什么是multiprocessing.Queue?2. 为什么需要multiprocessing.Queue?3. 如何使用multiprocessing.Queue?3.1 基本用法3.2 队列的其他操作3.3 队列的阻塞与超时 4. 适…...
Docker 常见命令
命令库:docker ps | Docker Docs 安装docker apt install docker.io docker ps -a 作用:显示所有容器 docker logs -f frps 作用:持续输出容器名称为frps的日志信息(监控) docker restart frps 作用:重…...
【杂谈】-递归进化:人工智能的自我改进与监管挑战
递归进化:人工智能的自我改进与监管挑战 文章目录 递归进化:人工智能的自我改进与监管挑战1、自我改进型人工智能的崛起2、人工智能如何挑战人类监管?3、确保人工智能受控的策略4、人类在人工智能发展中的角色5、平衡自主性与控制力6、总结与…...
Java 语言特性(面试系列1)
一、面向对象编程 1. 封装(Encapsulation) 定义:将数据(属性)和操作数据的方法绑定在一起,通过访问控制符(private、protected、public)隐藏内部实现细节。示例: public …...
MongoDB学习和应用(高效的非关系型数据库)
一丶 MongoDB简介 对于社交类软件的功能,我们需要对它的功能特点进行分析: 数据量会随着用户数增大而增大读多写少价值较低非好友看不到其动态信息地理位置的查询… 针对以上特点进行分析各大存储工具: mysql:关系型数据库&am…...
解决Ubuntu22.04 VMware失败的问题 ubuntu入门之二十八
现象1 打开VMware失败 Ubuntu升级之后打开VMware上报需要安装vmmon和vmnet,点击确认后如下提示 最终上报fail 解决方法 内核升级导致,需要在新内核下重新下载编译安装 查看版本 $ vmware -v VMware Workstation 17.5.1 build-23298084$ lsb_release…...
STM32标准库-DMA直接存储器存取
文章目录 一、DMA1.1简介1.2存储器映像1.3DMA框图1.4DMA基本结构1.5DMA请求1.6数据宽度与对齐1.7数据转运DMA1.8ADC扫描模式DMA 二、数据转运DMA2.1接线图2.2代码2.3相关API 一、DMA 1.1简介 DMA(Direct Memory Access)直接存储器存取 DMA可以提供外设…...
【论文笔记】若干矿井粉尘检测算法概述
总的来说,传统机器学习、传统机器学习与深度学习的结合、LSTM等算法所需要的数据集来源于矿井传感器测量的粉尘浓度,通过建立回归模型来预测未来矿井的粉尘浓度。传统机器学习算法性能易受数据中极端值的影响。YOLO等计算机视觉算法所需要的数据集来源于…...
【学习笔记】深入理解Java虚拟机学习笔记——第4章 虚拟机性能监控,故障处理工具
第2章 虚拟机性能监控,故障处理工具 4.1 概述 略 4.2 基础故障处理工具 4.2.1 jps:虚拟机进程状况工具 命令:jps [options] [hostid] 功能:本地虚拟机进程显示进程ID(与ps相同),可同时显示主类&#x…...
Typeerror: cannot read properties of undefined (reading ‘XXX‘)
最近需要在离线机器上运行软件,所以得把软件用docker打包起来,大部分功能都没问题,出了一个奇怪的事情。同样的代码,在本机上用vscode可以运行起来,但是打包之后在docker里出现了问题。使用的是dialog组件,…...
力扣-35.搜索插入位置
题目描述 给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。 请必须使用时间复杂度为 O(log n) 的算法。 class Solution {public int searchInsert(int[] nums, …...
docker 部署发现spring.profiles.active 问题
报错: org.springframework.boot.context.config.InvalidConfigDataPropertyException: Property spring.profiles.active imported from location class path resource [application-test.yml] is invalid in a profile specific resource [origin: class path re…...
