RabbitMQ 入门系列:2、基础含义理解:链接、通道、队列、交换机
系列目录
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、扩展内容:延时队列:延时队列插件及其有限的适用场景。
前言:
本系列介绍RabbitMQ,介绍RabbitMQ的基础概念的含义。
并扫清网络上的一些错误或容易误导人的内容,帮助网友快速正确理解并掌握RabbitMQ。
下面开始本篇内容相关介绍。
1、上图管理中心图:

从管理中心可以看到,主要有以下几个大菜单:
1、Overview:概述,就是基础监控。 2、Connections:链接 3、Channels:通道 4、Queues:队列 5、Admin:管理
除去概述和管理,剩下三个是理解RabbitMQ的重要指标。
下面进行基本概念介绍,涉及的代码,下一篇再介绍:
1、链接:
比如用官方的SDK创建一个链接:
using RabbitMQ.Client; var factory = new ConnectionFactory()
{
HostName = "127.0.0.1",
UserName = "guest",
Password = "guest",
VirtualHost = "/"
}; var connection = factory.CreateConnection();
即产生一个链接:

对于这段代码,如果在一个Web应用程序中不断执行,在大并发请求下会产生大量的链接,这是不可取的。
如果再加上分布式部署,大量Web应用再加大量并发,链接资源就不够用了。
因此,官网的建议,是用户应该把它做成单例,一个应用尽量使用1个链接。
官方为了让多个线程共享一个链接,又不互相影响,做出了通道的概念。
2、通道:
为了减少链接数,降低资源开销,RabbitMQ设计了通道的概念。
1个链接可以创建无数个通道,然后主要的编码,就是针对通道编码。
using RabbitMQ.Client;
using System.Text;
using RabbitMQ.Client.Events; var factory = new ConnectionFactory()
{
HostName = "127.0.0.1",
UserName = "guest",
Password = "guest",
VirtualHost = "/"
}; var connection = factory.CreateConnection(); var channel = connection.CreateModel();

当然,这样编码在Web应用程序是不可取的,应该把链接那一块的创建整成单例,下面示例中将忽略获取链接这一块。
因此,后续编码都是在获取单例链接,创建通道,然后再进行一步操作。
3、队列:创建队列,发送消息、监听队列,获取消息。
这里先描述队列,交换机这种多出来的概念,放到后面再进行描述:
队列,即数据存档和获取数据的地方。
简单需求下,只需要给把信息发给队列,然后监听队列获取信息就完事了。
发送消息:
...
var channel = connection.CreateModel(); channel.QueueDeclare("FirstQueue", false, false, false);//创建队列
channel.BasicPublish("", "FirstQueue", false, null, Encoding.UTF8.GetBytes("这是要发送的内容"));
channel.Close();

监听队列,并获取信息:
...
var channel = connection.CreateModel(); var consumer = new EventingBasicConsumer(channel);
consumer.Received += (model, ea) =>
{
var message = Encoding.UTF8.GetString(ea.Body.ToArray());
Console.WriteLine("收到默认消息 {0}", message);
};
string msg = channel.BasicConsume(queue: "FirstQueue",
autoAck: true,
consumer: consumer);

对于以上的发送到监听,都不涉及到交换机,直接来,直接去即可。
那么,交换机概念的引入,有什么作用呢?
4、交换机:
如果通道的出现,是为了降低链接数,那么交换机的出现,竟然不是为了降低队列数。
示例说明:比如一开始创建了一个用户队列:User :用它发送存储用户的注册信息队列
后面新增需求,发现User要实现很多个分支:

按照常规模式,也能实现,创建多个队列,可以满足需求。
但随着业务和模块分支越来越多,队列可能会太多,不便于管理和维护。
一开始,以为:通过交换机,引入路由(routekey)后,结构会变化成:

后来,发现理解错了,特别是被网上的教程误导,发现队列是没有子队列或根据routekey过滤拿数据的功能的。
路由真实的效果是:允许发送一次,Copy信息同时发散到多个多队:

发送: (可以发送1条,同时到匹配路由的3个队列去)
channel.BasicPublish("User", "#.user", false, null, Encoding.UTF8.GetBytes("这是要发送的内容"));
交换机有好几种路由功能,这些先放到后面,放这里不便于入门理解。
对交换机的功能,理解上面中提到的路由真实的效果那一句话即可。
总结:
本篇介绍RabbitMQ的基础概念的含义,有助于快速理解并掌握RabbitMQ。
RabbitMQ 入门系列:2、基础含义理解:链接、通道、队列、交换机的更多相关文章
- RabbitMQ 入门系列:3、基础含义:持久化、排它性、自动删除、强制性、路由键。
系列目录 RabbitMQ 入门系列:1.MQ的应用场景的选择与RabbitMQ安装. RabbitMQ 入门系列:2.基础含义:链接.通道.队列.交换机. RabbitMQ 入门系列:3.基础含义: ...
- RabbitMQ 入门系列:3、基础编码:官方SDK的引用、链接创建、单例改造、发送消息、接收消息。
系列目录 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.基础含义: ...
- RabbitMQ 入门系列:8、扩展内容:接收信息时:可否根据RoutingKey过滤监听信息,答案是不能。
系列目录 RabbitMQ 入门系列:1.MQ的应用场景的选择与RabbitMQ安装. RabbitMQ 入门系列:2.基础含义:链接.通道.队列.交换机. RabbitMQ 入门系列:3.基础含义: ...
- RabbitMQ 入门系列:9、扩展内容:死信队列:真不适合当延时队列。
系列目录 RabbitMQ 入门系列:1.MQ的应用场景的选择与RabbitMQ安装. RabbitMQ 入门系列:2.基础含义:链接.通道.队列.交换机. RabbitMQ 入门系列:3.基础含义: ...
- RabbitMQ 入门系列:10、扩展内容:延时队列:延时队列插件及其有限的适用场景(系列大结局)。
系列目录 RabbitMQ 入门系列:1.MQ的应用场景的选择与RabbitMQ安装. RabbitMQ 入门系列:2.基础含义:链接.通道.队列.交换机. RabbitMQ 入门系列:3.基础含义: ...
- [转]快速入门系列--WebAPI--01基础
本文转自:http://www.cnblogs.com/wanliwang01/p/aspnet_webapi_base01.html ASP.NET MVC和WebAPI已经是.NET Web部分的 ...
随机推荐
- Vue出现Component template should ...
当运行vue出现错误Component template should contain exactly one root element. If you ...的时候,我们只需要将<templa ...
- GDKOI 2021 Day1 TG 。。。
看着一群群比 LHF , HQX 还强的大佬涌进了机房,本蒟蒻表示慌得一批 T1 讲题人说最简单的签到题本蒟蒻表示... \(Update\) 用 ds , dt 两个变量记录点 i 连向 s 或 t ...
- supervisor的安装与使用
Ubuntu安装使用supervisor 进程管理工具 安装 apt-get install supervisor 查看是否安装成功 pgrep supervisord # 返回进程号则成功 改配置文 ...
- SAP - 拆包,组件入库
场景: 一个成品商品,例如汽车,有很多零部件:车轮,框架,发动机等.以整体形式发货过账,在遇到质量问题客户退货情况,需要把汽车拆开,然后零部件退回到库(按照BOM结构拆卸). MB1A/MIGO:发货 ...
- Linux基础命令、引号和括号的作用
查看硬件信息 查看 cpu lscpu命令可以查看cpu信息 cat /proc/cpuinfo也可看查看到 查看内存大小 free命令 cat /proc/meminfo 查看硬盘和分区 lsblk ...
- AI场景存储优化:云知声超算平台基于 JuiceFS 的存储实践
云知声是一家专注于语音及语言处理的技术公司.Atlas 超级计算平台是云知声的计算底层基础架构,为云知声在 AI 各个领域(如语音.自然语言处理.视觉等)的模型迭代提供训练加速等基础计算能力.Atla ...
- 如何用python做出老师看了都给满分的GUI学生管理系统毕设
序 言 哈喽大家好鸭!我是小熊猫 最近有什么有趣的事情发生吗?快来说给我听听( •̀ ω •́ )✧表弟大学快毕业了,学了一个学期Python居然还不会写学生管理系统,真的给我丢脸啊,教他又不肯学,还 ...
- docker实时查看日志
docker logs -f --tail=10 fo-order -f : 查看实时日志 --tail=10 : 查看最后的10条日志. fo-order: 容器名称
- SQL SERVER 算法面试题,自己再插入数据时,本想一次性复制10条数据,结果变成了1024条。产生一个算法bug,最后记录一下
- NC50999 表达式计算4
NC50999 表达式计算4 题目 题目描述 给出一个表达式,其中运算符仅包含+,-,*,/,^(加 减 乘 整除 乘方)要求求出表达式的最终值 数据可能会出现括号情况,还有可能出现多余括号情况 数据 ...