rabbitMq-----路由匹配模块

ops/2024/10/19 1:48:41/

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

  • 前言
  • 交换机类型
  • binding_key 和 routing_key
  • 匹配算法


前言

交换机有三种类型,直接交换,广播交换,主题交换。
其中交换机类型不同就有不同的匹配规则。
而路由匹配模块就是用来决定交换机在收到一条消息后应该放入到哪些绑定的队列中。


交换机类型

广播交换:直接将消息交给所有绑定的队列中
直接交换:队列绑定信息中的binding_key与消息中的routing_key⼀致才匹配成功
主题交换:只有匹配队列主题的消息才会被放⼊队列中。

binding_key 和 routing_key

binding_key由字符/数字/下划线/./*/#/组成。并使用,来分词若干部分。
它是绑定密钥,在一组绑定关系中存在。

routing_key是匹配密钥,由字符/数字/下划线和.组成。并使用.来分成若干年部分。
消息的属性中包含该字段。

匹配算法

binding_key中的#字符可以代替0个或多个字符。而*字符可以代替一个字符。
使⽤routing_key中的每个单词,与binding_key中的单词进⾏逐个匹配。

static bool route(ExchangeType type, const std::string &routing_key, const std::string &binding_key)
{if (type == ExchangeType::DIRECT){// 直接交换return routing_key == binding_key;}else if (type == ExchangeType::FANOUT){// 广播交换return true;}// 主题交换// 1. 将binding_key与routing_key进行字符串分割,得到各个的单词数组std::vector<std::string> rkeys;std::vector<std::string> bkeys;size_t n_rkey = StrHelper::split(routing_key, ".", &rkeys);size_t n_bkey = StrHelper::split(binding_key, ".", &bkeys);// 2. 定义标记数组,并初始化[0][0]位置为true,其他位置为falsestd::vector<std::vector<bool>> dp(n_bkey + 1, std::vector<bool>(n_rkey + 1, false));dp[0][0] = 1;// 3.如果binding_key以#起始,则将#对应行的第0列置为1for (int i = 1; i <= n_bkey; i++){if (bkeys[i - 1] == "#"){dp[i][0] = true;continue;}break;}// 4. 使用routing_key中的每个单词与binding_key中的每个单词进行匹配并标记数组for (int i = 1; i <= n_bkey; i++){for (int j = 1; j <= n_rkey; j++){// 如果当前bkey是个*,或者两个单词相同,表示单词匹配成功,则从左上方继承结果if (bkeys[i - 1] == rkeys[j - 1] || bkeys[i - 1] == "*"){dp[i][j] = dp[i - 1][j - 1];}else if (bkeys[i - 1] == "#"){// 如果当前bkey是个#,则需要从左上,左边,上边继承结果dp[i][j] = dp[i - 1][j - 1] | dp[i][j - 1] | dp[i - 1][j];}}}return dp[n_bkey][n_rkey];
}

http://www.ppmy.cn/ops/122099.html

相关文章

SpringIoC容器的初识

一、SpringIoC容器的介绍 Spring IoC 容器&#xff0c;负责实例化、配置和组装 bean&#xff08;组件&#xff09;。容器通过读取配置元数据来获取有关要实例化、配置和组装组件的指令。配置元数据以 XML、Java 注解或 Java 代码形式表现。它允许表达组成应用程序的组件以及这…

前置机、跳板机、堡垒机:安全运维领域的“黄金三角”

为了确保数据的安全性、提升系统的可靠性和性能&#xff0c;企业需要采用一系列先进的设备和系统来构建坚固的IT防御体系。其中&#xff0c;前置机、跳板机和堡垒机作为关键组件&#xff0c;各自在网络安全和运维管理中发挥着不可替代的作用。 一、前置机&#xff08;Front-en…

html复习

文章目录 结构标签内容标签 结构标签 html文件的基本结构为&#xff1a; <!DOCTYPE html> <html lang"zh-CN"> <head> </head> <body> </body> </html>head标签部分一般放相关设置内容&#xff0c;页面显示的内容是在bo…

LLM+知识图谱新工具! iText2KG:使用大型语言模型构建增量知识图谱

iText2KG是一个基于大型语言模型的增量知识图谱构建工具&#xff0c;通过从文本文档中提取实体和关系来逐步构建知识图谱。该工具具有零样本学习能力&#xff0c;能够在无需特定训练的情况下&#xff0c;在多个领域中进行知识提取。它包括文档提炼、实体提取和关系提取模块&…

【算法】DFS 系列之 穷举/暴搜/深搜/回溯/剪枝(下篇)

【ps】本篇有 8 道 leetcode OJ。 目录 一、算法简介 二、相关例题 1&#xff09;字母大小写全排列 .1- 题目解析 .2- 代码编写 2&#xff09;优美的排列 .1- 题目解析 .2- 代码编写 3&#xff09;N 皇后 .1- 题目解析 .2- 代码编写 4&#xff09;有效的数独 .1-…

Java - LeetCode面试经典150题 - 区间 (三)

区间 228. 汇总区间 题目 给定一个 无重复元素 的 有序 整数数组 nums 。 返回 恰好覆盖数组中所有数字 的 最小有序 区间范围列表 。也就是说&#xff0c;nums 的每个元素都恰好被某个区间范围所覆盖&#xff0c;并且不存在属于某个范围但不属于 nums 的数字 x 。 列表中…

新手教学系列——用 VSCode 实现高效远程开发

随着软件开发环境日益复杂,远程开发已成为许多开发者的日常工作方式。尤其当项目需要直接在服务器上运行或本地计算资源有限时,能够使用一款便捷、强大的工具至关重要。在众多 IDE 中,VSCode 因其轻量、灵活且支持丰富插件,成为远程开发的理想选择。本文将详细介绍如何通过…

关闭IDM自动更新

关闭IDM自动更新 1 打开注册表2 找到IDM注册表路径 1 打开注册表 winR regedit 2 找到IDM注册表路径 计算机\HKEY_CURRENT_USER\Software\DownloadManager 双击LstCheck&#xff0c;把数值数据改为0 完成 感谢阅读