当前位置: 首页 > news >正文

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

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

文章目录

  • 前言
  • 交换机类型
  • 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.mrgr.cn/news/41239.html

相关文章:

  • Acwing 简单博弈论
  • HTTP1.0和HTTP1.1有什么区别
  • postgresql-重复执行相同语句,试试 prepare!
  • 爱拼才会赢,甲骨文公司智算中心标配英伟达GPU10万颗
  • 【前沿 热点 顶会】NIPS 2024中目标检测有关的论文
  • 知识图谱入门——4:Protégé 5.6.4安装和主要功能介绍、常用插件(2024年10月2日):知识图谱构建的利器
  • Pikachu-Cross-Site Scripting-反射型xss(post)
  • JavaScript语言基础教程笔记
  • YOLO11改进|注意力机制篇|引入MLCA轻量级注意力机制
  • 【AI知识点】词频-逆文档频率(TF-IDF)
  • 在java中都是如何实现这些锁的?或者说都有哪些具体的结构实现
  • SpringBoot中的数据库查询及Mybatis和MybatisPlus的使用
  • python之认识变量
  • 深入理解JavaScript 的原型继承
  • Valhalla实现 使用Docker部署利用OSM(Mapbox)地图实现路径规划详细步骤
  • I.Inverse Pair
  • YOLO v11实时目标检测3:训练数据集格式说明
  • 【LLM论文日更】| 通过指令调整进行零样本稠密检索的无监督文本表示学习
  • 常用bash脚本
  • Java - LeetCode面试经典150题(三)