C#使用RabbitMQ-5_主题模式(主题交换机)

简介

主题模式允许发送者根据主题发布消息,而订阅者可以订阅特定的主题

在主题模式中,生产者发送的消息被发送到一个交换机(Exchange),该交换机根据消息的路由键(Routing Key)和绑定(Binding)规则将消息路由到一个或多个队列。消费者随后从队列中接收并消费这些消息。以下是主题模式的一些关键要点:

  1. 路由键的设计:路由键是由点(.)分隔的字符串,例如 "stock.usd.nyse"。这些字符串通常定义了消息的某些属性或分类。
  2. 通配符的使用:队列绑定时可以使用通配符 "*" 和 "#"。其中,星号可以替代一个单词,井号可以替代零个或多个单词。这增加了灵活性,允许使用模糊匹配来定义哪个队列应该接收具有特定路由键的消息。
  3. 消息的路由过程:当消息到达交换机时,交换机会查找所有绑定的队列,检查它们的绑定键,并确定哪些队列的绑定键与消息的路由键相匹配。匹配成功的队列会接收到消息。
  4. 灵活性和复杂性:与直接模式相比,主题模式提供了更大的灵活性,因为它允许基于多个标准进行路由。然而,这种灵活性也带来了额外的复杂性,因为需要正确设计路由键和绑定键以实现期望的路由行为。
  5. 消息的丢失风险:如果没有任何队列的绑定键与消息的路由键匹配,那么消息将会丢失。因此,正确配置交换机、队列的绑定以及路由键非常重要。

通配符

在主题模式中的通配符其实就像我们平时写的正则表达式,比如在消费者中使用 "stock.#" 作为绑定键,那么那么绑定键 "stock.#" 的消费者将匹配到所有以 "stock" 开头的路由键,不论后面跟随什么单词。如"stock.usd.nyse"、"stock.eur.frankfurt" 还是 "stock.jpy.tokyo",只要是以 "stock" 开头的消息都会被该队列接收。

  • 星号(*):星号可以代替路由键中的一个单词。例如,如果有一个路由键为 "stock.usd.nyse" 的消息,那么绑定键 "stock.*.nyse" 或 "stock.usd.#" 都可以匹配到这个消息。星号可以匹配零个或多个单词,但不会跨越点(.)进行匹配。
  • 井号(#):井号可以代替路由键中的零个或多个单词,且可以跨越点进行匹配。这意味着,如果有一个路由键为 "stock.usd.nyse" 的消息,那么绑定键 "stock.#" 将匹配到所有以 "stock" 开头的路由键,不论后面跟随什么单词。

生产者

在之前的模式中,我们使用的都是路由键RoutingKey,而主题模式中的是绑定键 BindingKey。主题模式可以看作是一种特殊的路由模式,它允许更复杂的路由策略,通过使用通配符 "*" 和 "#" 来实现模糊匹配。从而实现处理更加复杂的消息路由需求。

RoutingKey 主要用于生产者发布消息时定义消息的路由路径,而 BindingKey 用于定义交换机与队列之间的绑定关系。

class MyClass
{public static void Main(string[] args){var factory = new ConnectionFactory();factory.HostName = "localhost"; //RabbitMQ服务在本地运行factory.UserName = "guest"; //用户名factory.Password = "guest"; //密码//创建连接using (var connection = factory.CreateConnection()){//创建通道using (var channel = connection.CreateModel()){//声明了一个主题交换机(topic),命名为"hello"channel.ExchangeDeclare("hello", "topic");Console.WriteLine("生产者:请输入绑定key");var bindingKey = Console.ReadLine();string msg;Console.WriteLine("请输入要发送的消息内容:");while (!string.IsNullOrEmpty(msg = Console.ReadLine())){var body = Encoding.UTF8.GetBytes(msg);channel.BasicPublish("hello", bindingKey, null, body); //开始传递Console.WriteLine("已发送: {0}", msg);}}}}
}

消费者

class MyClass
{static void Main(string[] args){//创建连接工厂var factory = new ConnectionFactory();factory.HostName = "localhost";factory.UserName = "guest";factory.Password = "guest";//创建连接using (var connection = factory.CreateConnection()){//创建通道using (var channel = connection.CreateModel()){//声明了一个交换机channel.ExchangeDeclare("hello", "topic");//声明一个新的队列,并将这个队列的名称赋值给变量 queueNamevar queueName = channel.QueueDeclare().QueueName;//从控制台获取一个绑定键Console.WriteLine("消费者:请输入BindingKey");var bindingKey = Console.ReadLine();channel.QueueBind(queueName, "hello", bindingKey);//事件的基本消费者var consumer = new EventingBasicConsumer(channel);consumer.Received += (model, ea) =>{var body = ea.Body.ToArray();var message = Encoding.UTF8.GetString(body);Thread.Sleep(1000);Console.WriteLine("已接收: {0}", message);};channel.BasicConsume(queueName, true, consumer);Console.ReadKey();}}}
}

演示

还是老样子,我们将生产者和消费者都发布打包,分别运行三次,然后生产者分别发送一条消息,如下图。

# 用于匹配多个单词。因此com.#三条消息都收到了。

* 用于匹配一个单词,因为有两个生产者的第三个单词是2,所以*.*.2的消费者收到了两条消息。

而只有一个生产者的第二个单词是B,所以*.B.*的消费者只收到了一条消息

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

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

相关文章

Linux之umask的使用

一、umask的作用 umask值用于设置用户在创建新文件和目录时的默认权限。umask值一共有4组数字,其中第1组数字用于定义特殊权限,一般不关心,日常工作中大家用的更多的是后面三组数字。以下图为例,输入“umask”命令之后&#xff0c…

假期刷题打卡--Day29

1、MT1224棋盘 求一个N*N棋盘中的方块总数。 格式 输入格式: 输入整型N 输出格式: 输出整型 样例 1 输入: 2输出: 5备注 考虑到取值范围,可用long整型定义变量 分析过程 这个题目的意思是,在这…

双活工作关于nacos注册中心的数据迁移

最近在做一个双活的项目,在纠结一个注册中心是在双活机房都准备一个,那主机房的数据如果传过去呢,查了一些资料,最终在官网查到了一个NacosSync 的组件,主要用来做数据传输的,并且支持在线替换注册中心的&a…

数据结构之外部排序

外部排序就是对大型文件的排序,待排序的记录存放在外存。在排序的过程中,内存只存储文件的一部分记录,整个排序过程需要进行多次内外存间的数据交换。   常用的外部排序方法是归并排序,一般分为两个阶段:在第一阶段&…

【Linux】信号概念与信号产生

信号概念与信号产生 一、初识信号1. 信号概念2. 前台进程和后台进程3. 认识信号4. 技术应用角度的信号 二、信号的产生1. 键盘组合键2. kill 命令3. 系统调用4. 异常(1)观察现象(2)理解本质 5. 软件条件闹钟 一、初识信号 1. 信号…

vue项目搭建测试

5&#xff0c;项目测试 导入elementplus以及样式 import ElementPlus from element-plus import element-plus/dist/index.csscreateApp(App).use(store).use(router).use(ElementPlus).mount(#app)<template><el-row class"mb-4"><el-button>De…

python统计分析——两样本t检验

参考资料&#xff1a;用python动手学统计学 1、导入库 # 导入库 # 用于数值计算的库 import numpy as np import pandas as pd import scipy as sp from scipy import stats # 用于绘图的库 from matplotlib import pyplot as plt import seaborn as sns sns.set() 2、准备数…

【华为 ICT HCIA eNSP 习题汇总】——题目集12

1、企业网络内部常常采用私有 IP 地址进行通信&#xff0c;以下哪个地址属于私有 IP 地址&#xff1f; A、0.1.1.1 B、127.5.4.3 C、128.0.0.5 D、172.24.35.36 考点&#xff1a;网络层 解析&#xff1a;&#xff08;D&#xff09; A类 IP 地址中&#xff0c;10.0.0.0 ~ 10.255…

例36:打开文件读出文件内容

1.建立一个EXE工程&#xff0c;在主窗体上放一个按钮&#xff0c;如图32。 图32 在按钮的单击事件中输入代码&#xff1a; Sub Form1_Command1_BN_Clicked(hWndForm As hWnd, hWndControl As hWnd)Dim s as StringDim 文件 As CWSTR FF_OpenFileDialog(hWndForm,_"打开…

爬爬今天爬小说————爬虫练习

爬不同的的小说&#xff0c;会有略微的改动。 我今天这个是从一章的提前到全部的提前。 在我们电脑里面了&#xff0c;想怎么看就怎么看。 代码代码&#xff1a; import re import requestsheaders {"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x6…

SAP-PP-01-004物料主数据MRP视图参数

一、MRP1 MRP组 系统运行的 mrp 控制参数的组别。包含物料主数据中的一些 MRP 参数字段及工厂运行 MRP 控制设置参数&#xff0c;例如策略组、消耗模式、重计划期间、计划区间、计划时界、BOM 展开、计划订单转换的采购申请&#xff08;PR&#xff09;类型等。 工厂特定的物料…

【Java八股面试系列】JVM-类和对象加载过程

目录 类和对象的加载过程 类的生命周期 类的加载过程 加载 验证 准备 解析 初始化 类卸载 对象的加载过程 类和对象的加载过程 什么是类加载和对象加载? 类加载&#xff08;Class Loading&#xff09;&#xff1a;这是指JVM在运行时将类的字节码文件加载到内存中的…

Cubase学习:音频转midi

大家好!我是诗书画唱!今天要分享的小技巧就是Cubase中的音频转midi的功能!希望对你有所帮助!以后我会在这个账号分享自己知道的很多小技巧!关注我!不迷路!大家也可以关注我后,在我的空间搜索关键词,找到各种对应的教程进行学习,非常的方便!而且自己的教程会尽可能纠…

算法学习——LeetCode力扣二叉树篇3

算法学习——LeetCode力扣二叉树篇3 116. 填充每个节点的下一个右侧节点指针 116. 填充每个节点的下一个右侧节点指针 - 力扣&#xff08;LeetCode&#xff09; 描述 给定一个 完美二叉树 &#xff0c;其所有叶子节点都在同一层&#xff0c;每个父节点都有两个子节点。二叉树…

【Linux】学习-深入了解文件的读与写

深入了解语言级别(C语言)文件操作的"读"与"写" 在学习前&#xff0c;我们先要知道在Linux下的一个原则&#xff1a;一切皆是文件 如何理解呢&#xff1f;举个外设的例子&#xff0c;比如键盘和显示器&#xff0c;这两个外设也可以其实本质上也是文件&…

【5G NR】【一文读懂系列】移动通讯中使用的信道编解码技术-Viterbi译码原理

目录 一、引言 二、Viterbi译码的基本原理 2.1 卷积码与网格图 2.2 Viterbi算法的核心思想 2.3 路径度量与状态转移 三、Viterbi译码算法工作原理详解 3.1 算法流程 3.2 关键步骤 3.3 译码算法举例 3.4 性能特点 四、Viterbi译码的应用场景 4.1 移动通信系统 4.2 卫…

人工智能如何彻底改变身份欺诈

据 AuthenticID 称&#xff0c;近一半的企业报告合成身份欺诈有所增加&#xff0c;而生物识别欺骗和伪造 ID 欺诈尝试也有所增加。 在当今的数字化存在中&#xff0c;消费者和企业都面临着新的挑战&#xff0c;从考虑数字身份的影响到应对生成人工智能等新工具的使用和流行。与…

力扣[面试题 01.02. 判定是否互为字符重排(哈希表,位图)

Problem: 面试题 01.02. 判定是否互为字符重排 文章目录 题目描述思路复杂度Code 题目描述 思路 思路1&#xff1a;哈希表 1.若两个字符串长度不相等&#xff0c;则一定不符合题意&#xff1b; 2.创建一个map集合&#xff0c;先将字符串s1中的每一个字符与其对应的数量存入集合…

计算机算术

计算机算术 数据是什么 数据是各种各样的信息&#xff0c;如数字、文本、计算机程序、音乐、图像、符号等等&#xff0c;实际上&#xff0c;信息可以是能够被计算机存储和处理的任何事物。 位与字节 计算机中存储和处理信息的最小单位是位&#xff08;Binary digit比特&#x…

CVE-2022-0760 漏洞复现

CVE-2022-0760 NSS [HNCTF 2022 WEEK2]ohmywordpress 【CVE-2022-0760】 题目描述&#xff1a;flag在数据库里面。 开题&#xff1a; 顺着按钮一直点下去会发现出现一个按钮叫安装WordPress 安装完之后的界面&#xff0c;有一个搜索框。 F12看看network。 又出现了这个Wor…