RabbitMQ 入门系列:8、扩展内容:接收信息时:可否根据RoutingKey过滤监听信息,答案是不能。
系列目录
RabbitMQ 入门系列:1、MQ的应用场景的选择与RabbitMQ安装。
RabbitMQ 入门系列:2、基础含义:链接、通道、队列、交换机。
RabbitMQ 入门系列:3、基础含义:持久化、排它性、自动删除、强制性、路由键。
RabbitMQ 入门系列:4、基础编码:官方SDK使用:链接创建、单例改造、发送消息、接收消息。
RabbitMQ 入门系列:5、基础编码:交换机的进阶介绍及编码方式。
RabbitMQ 入门系列:6、保障消息:不丢失:发送方、Rabbit存储端、接收方。
RabbitMQ 入门系列:7、保障消息:不重复消费:产生消息的唯一ID。
RabbitMQ 入门系列:8、扩展内容:接收信息时:可否根据RoutingKey过滤监听信息,答案是不能。
RabbitMQ 入门系列:9、扩展内容:死信队列:真不适合当延时队列。
RabbitMQ 入门系列:10、扩展内容:延时队列:延时队列插件及其有限的适用场景。
前言:
初看交换机的概念时,以为会有根据绑定的RoutingKey进行过滤监听的功能。
而网上,也有一些误导人代码,连我也被误了不少时间。
答案已经在标题上有了,下面看一些错误的演示。
1、网上离谱的标准错误答案:DotNet版本
1、发送方:
ConnectionFactory factory = new ConnectionFactory()
{
HostName = "127.0.0.1",
UserName = "guest",
Password = "guest",
VirtualHost = "/"
};
string myexchange = "myexchange";string myqueue = "myqueue";
using (var connection = factory.CreateConnection())
{
var channel = connection.CreateModel(); channel.ExchangeDeclare(myexchange, ExchangeType.Direct, true, false, null);
channel.QueueDeclare(myqueue, true, false, false, null);
channel.QueueBind(myqueue, myexchange, "log_info", null);
channel.QueueBind(myqueue, myexchange, "log_error", null);
for (int i = 0; i < 10; i++)
{
var msg = Encoding.UTF8.GetBytes($"{i},你好");
var routeKey = i % 2 == 0 ? "log_info" : "log_error";
channel.BasicPublish(myexchange, routingKey: routeKey, basicProperties: null, body: msg);
}
}
向队列myqueue发送了10条数据:

可以看到,队列消息里是带有Routing Key。
然后以为可以只监听获取对应的Routing Key的数据,这种错误认知就被带出了,还演示了无效的代码:
2、接收方:
ConnectionFactory factory = new ConnectionFactory()
{
HostName = "127.0.0.1",
UserName = "guest",
Password = "guest",
VirtualHost = "/"
};
string myexchange = "myexchange"; string myqueue = "myqueue";
using (var connection = factory.CreateConnection())
{
var channel = connection.CreateModel(); channel.QueueBind(myqueue, myexchange, "log_info", null); EventingBasicConsumer consumer = new EventingBasicConsumer(channel); consumer.Received += (sender, e) =>
{
var msg = Encoding.UTF8.GetString(e.Body); Console.WriteLine(msg + " Routing Key :" + e.RoutingKey);
}; channel.BasicConsume(myqueue, false, consumer); Console.ReadKey();
}
天真以为绑定对应路由器就有效,运行结果仍是:

真实的答案就只有一个:它是队列,不是数据库,无法根据条件过滤过查询。
2、网上容易误导的进阶式标准错误答案2:来源参考的是Java版本
发送方保持不变,修改接收方的代码:
ConnectionFactory factory = new ConnectionFactory()
{
HostName = "127.0.0.1",
UserName = "guest",
Password = "guest",
VirtualHost = "/"
};
string myexchange = "myexchange"; using (var connection = factory.CreateConnection())
{
var channel = connection.CreateModel(); string name = channel.QueueDeclare().QueueName;
channel.QueueBind(name, myexchange, "log_info", null); EventingBasicConsumer consumer = new EventingBasicConsumer(channel); consumer.Received += (sender, e) =>
{
var msg = Encoding.UTF8.GetString(e.Body); Console.WriteLine(msg + " Routing Key :" + e.RoutingKey);
}; channel.BasicConsume(name, false, consumer); Console.ReadKey();
}
重新定义临时队列,然后绑定了临时队列的名称,开启监听,然后让发送方再次发送数据:

右边发送了10条,左边根据过滤条件,收到了5条,看起来好像达到效果了。
表现上很正确,这就很TMD的误导人了。
下面看看这种是什么情况:

实际的情况是:
1、接收方:创建了临时队列,同时绑定log_info,监听的是临时队列。 2、发送方:即发送到myqueue,对log_info的数据,再copy一份发送到临时队列。
这就很离谱了,会造成以下几个问题:
1、只能收到监听开启之后发送的数据,对myqueue之前的数据是获取不到的。 也即是说,仅有双方同时在线,发送时的数据才能收到,其余条件的数据都会丢失。 2、myqueue还是存有一份信息,不消费,攒着留着过年吗?
第2个条件还能通过设置过期解决,第1个条件,都不知道什么应用场景才适合,但肯定不属于MQ的应用场景。
总结:
还是一句话:它是队列,不是数据库,无法根据条件过滤过查询。
RabbitMQ 入门系列:8、扩展内容:接收信息时:可否根据RoutingKey过滤监听信息,答案是不能。的更多相关文章
- RabbitMQ 入门系列:9、扩展内容:死信队列:真不适合当延时队列。
系列目录 RabbitMQ 入门系列:1.MQ的应用场景的选择与RabbitMQ安装. RabbitMQ 入门系列:2.基础含义:链接.通道.队列.交换机. RabbitMQ 入门系列:3.基础含义: ...
- RabbitMQ 入门系列:10、扩展内容:延时队列:延时队列插件及其有限的适用场景(系列大结局)。
系列目录 RabbitMQ 入门系列:1.MQ的应用场景的选择与RabbitMQ安装. RabbitMQ 入门系列:2.基础含义:链接.通道.队列.交换机. RabbitMQ 入门系列:3.基础含义: ...
- RabbitMQ 入门系列:3、基础编码:官方SDK的引用、链接创建、单例改造、发送消息、接收消息。
系列目录 RabbitMQ 入门系列:1.MQ的应用场景的选择与RabbitMQ安装. RabbitMQ 入门系列:2.基础含义:链接.通道.队列.交换机. RabbitMQ 入门系列:3.基础含义: ...
- RabbitMQ 入门系列:2、基础含义理解:链接、通道、队列、交换机
系列目录 RabbitMQ 入门系列:1.MQ的应用场景的选择与RabbitMQ安装. RabbitMQ 入门系列:2.基础含义:链接.通道.队列.交换机. RabbitMQ 入门系列:3.基础含义: ...
- RabbitMQ 入门系列:3、基础含义:持久化、排它性、自动删除、强制性、路由键。
系列目录 RabbitMQ 入门系列:1.MQ的应用场景的选择与RabbitMQ安装. RabbitMQ 入门系列:2.基础含义:链接.通道.队列.交换机. RabbitMQ 入门系列:3.基础含义: ...
- RabbitMQ 入门系列:5、基础编码:交换机的进阶介绍及编码方式。
系列目录 RabbitMQ 入门系列:1.MQ的应用场景的选择与RabbitMQ安装. RabbitMQ 入门系列:2.基础含义:链接.通道.队列.交换机. RabbitMQ 入门系列:3.基础含义: ...
- RabbitMQ 入门系列:6、保障消息:不丢失:发送方、Rabbit存储端、接收方。
系列目录 RabbitMQ 入门系列:1.MQ的应用场景的选择与RabbitMQ安装. RabbitMQ 入门系列:2.基础含义:链接.通道.队列.交换机. RabbitMQ 入门系列:3.基础含义: ...
- RabbitMQ 入门系列:7、保障消息不重复消费:产生消息的唯一ID。
系列目录 RabbitMQ 入门系列:1.MQ的应用场景的选择与RabbitMQ安装. RabbitMQ 入门系列:2.基础含义:链接.通道.队列.交换机. RabbitMQ 入门系列:3.基础含义: ...
- 关于websocket的代码,实现发送信息和监听信息(前端 后端(node.js))
文件结构 node.js代码 // 需要HTTP 模块来启动服务器和Socket.IOvar http= require('http');var fs = require('fs');// 在8080 ...
随机推荐
- 想学嵌入式?要不一起玩 Arduino 吧
作者:HelloGitHub-Anthony 这里是 HelloGitHub 推出的<讲解开源项目>系列,本期介绍的是如何用开源硬件开发平台 Arduino,自己动手做一个温湿度显示器. ...
- Linux常用命令-软件包管理工具-rpm
命令简介 rpm(RPM Package Manager)是一个强大的命令行驱动的软件包管理工具,用来安装.卸载.校验.查询和更新 Linux 系统上的软件包. 语法格式 rpm [OPTION... ...
- NC16692 [NOIP2001]求先序排列
NC16692 [NOIP2001]求先序排列 题目 题目描述 给出一棵二叉树的中序与后序排列.求出它的先序排列.(约定树结点用不同的大写字母表示,长度 ≤ 8). 输入描述 2行,均为大写字母组成的 ...
- Windows版pytorch,torch简明安装
好消息!!目前pytorch已经提供windows官方支持,可以直接安装了,请移步这里. pytorch是facebook开发的深度学习库,其目标是想成为深度学习领域整合gpu加速的numpy.笔者研 ...
- vue 项目知识
Vue使用 Vue 源码解析 Vue SSR 如何调试Vue 源码 如何学习开源框架---> 从它的第一次commit 开始看 国外的文章 大致了解写框架的过程(英文关键字) 找到关键---&g ...
- 5-11 Redis缓存 | 持久化 | 集群_哨兵_主从复制_读写分离
Redis 强化 缓存淘汰策略 Redis服务器繁忙时,有大量信息要保存 如果Redis服务器内存全满,再要往Redis中保存新的数据,就需要淘汰老数据,才能保存新数据 noeviction:返回错误 ...
- 5-4 Sentinel 限流_流控与降级
Sentinel 介绍 什么是Sentinel Sentinel也是Spring Cloud Alibaba的组件 Sentinel英文翻译"哨兵\门卫" 随着微服务的流行,服务和 ...
- 千万不要把Request传递到异步线程里面!有坑!
你好哇,我是歪歪. 前几天在网上冲浪的时候看到一篇技术文章,讲的是他把一个 request 请求传递到了线程池里面,然后遇到了一个匪夷所思的情况. 他写了这篇文章,把自己针对这个问题的探索过程分享了出 ...
- Java通过反射注解赋值
前段时间,领导分配一个统计销售区域汇总的数据,解决方案使用到了反射获取注解,通过注解获取属性或者设置字段属性. 问题描述 查询公司列表,分别是公司id.区域id.区域名称: 公司id 区域id 区域名 ...
- AI全流程开发难题破解之钥
摘要:通过对ModelArts.盘古大模型.ModelBox产品技术的解读,帮助开发者更好的了解AI开发生产线. 本文分享自华为云社区<[大厂内参]第16期:华为云AI开发生产线,破解AI全流程 ...