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

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

文章目录


前言

交换机有三种类型,直接交换,广播交换,主题交换。

其中交换机类型不同就有不同的匹配规则。

而路由匹配模块就是用来决定交换机在收到一条消息后应该放入到哪些绑定的队列中。


交换机类型

广播交换:直接将消息交给所有绑定的队列中

直接交换:队列绑定信息中的binding_key与消息中的routing_key⼀致才匹配成功

主题交换:只有匹配队列主题的消息才会被放⼊队列中。

binding_key 和 routing_key

binding_key由字符/数字/下划线/./*/#/组成。并使用,来分词若干部分。

它是绑定密钥,在一组绑定关系中存在。

routing_key是匹配密钥,由字符/数字/下划线和.组成。并使用.来分成若干年部分。

消息的属性中包含该字段。

匹配算法

binding_key中的#字符可以代替0个或多个字符。而*字符可以代替一个字符。

使⽤routing_key中的每个单词,与binding_key中的单词进⾏逐个匹配。

cpp 复制代码
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,其他位置为false
    std::vector<std::vector<bool>> dp(n_bkey + 1, std::vector<bool>(n_rkey + 1, false));
    dp[0][0] = 1;

    // 3.如果binding_key以#起始,则将#对应行的第0列置为1
    for (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];
}
相关推荐
炯哈哈10 分钟前
【上位机——MFC】运行时类信息机制
开发语言·c++·mfc·上位机
rigidwill6662 小时前
LeetCode hot 100—最长有效括号
数据结构·c++·算法·leetcode·职场和发展
阳光_你好2 小时前
C++/Qt中QActionGroup类用法
c++·qt
菜鸟射手2 小时前
QT creater和vs2017文件路径问题
linux·c++·windows·qt
wuqingshun3141592 小时前
蓝桥杯17. 机器人塔
c++·算法·职场和发展·蓝桥杯·深度优先
simple_whu3 小时前
解决编译pcl时报错‘chrono_literals‘: is not a member of ‘std‘
c++·windows·visual studio
吴_知遇5 小时前
【华为OD机试真题】428、连续字母长度 | 机试真题+思路参考+代码解析(E卷)(C++)
开发语言·c++·华为od
LaoWaiHang5 小时前
MFC案例:使用键盘按键放大、缩小窗口图像的实验
c++·mfc
到底怎么取名字不会重复5 小时前
Day10——LeetCode15&560
c++·算法·leetcode·哈希算法·散列表
陈大大陈6 小时前
基于 C++ 的用户认证系统开发:从注册登录到Redis 缓存优化
java·linux·开发语言·数据结构·c++·算法·缓存