2

RabbitMQ 入门系列:2、基础含义理解:链接、通道、队列、交换机 - 路过秋天

 2 years ago
source link: https://www.cnblogs.com/cyq1162/p/16602500.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

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、上图管理中心图:

17408-20220819155731197-2087154632.png

从管理中心可以看到,主要有以下几个大菜单:

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();

即产生一个链接:

17408-20220819160421374-1368552979.png

对于这段代码,如果在一个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();
17408-20220819161520194-985439201.png

当然,这样编码在Web应用程序是不可取的,应该把链接那一块的创建整成单例,下面示例中将忽略获取链接这一块。

因此,后续编码都是在获取单例链接,创建通道,然后再进行一步操作。

3、队列:创建队列,发送消息、监听队列,获取消息。

这里先描述队列,交换机这种多出来的概念,放到后面再进行描述:

队列,即数据存档和获取数据的地方。

简单需求下,只需要给把信息发给队列,然后监听队列获取信息就完事了。

发送消息:

...
var channel = connection.CreateModel();

channel.QueueDeclare("FirstQueue", false, false, false);//创建队列
channel.BasicPublish("", "FirstQueue", false, null, Encoding.UTF8.GetBytes("这是要发送的内容"));
channel.Close();
17408-20220819163029180-1740192913.png

 监听队列,并获取信息:

...
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);

17408-20220819163329156-1111990841.png

对于以上的发送到监听,都不涉及到交换机,直接来,直接去即可。

那么,交换机概念的引入,有什么作用呢?

4、交换机:

如果通道的出现,是为了降低链接数,那么交换机的出现,竟然不是为了降低队列数。

示例说明:比如一开始创建了一个用户队列:User :用它发送存储用户的注册信息队列

后面新增需求,发现User要实现很多个分支:

17408-20220819165235313-1792891275.png

按照常规模式,也能实现,创建多个队列,可以满足需求。

但随着业务和模块分支越来越多,队列可能会太多,不便于管理和维护。 

一开始,以为:通过交换机,引入路由(routekey)后,结构会变化成:

17408-20220819170329760-786111783.png

后来,发现理解错了,特别是被网上的教程误导,发现队列是没有子队列或根据routekey过滤拿数据的功能的。

路由真实的效果是:允许发送一次,Copy信息同时发散到多个多队:

17408-20220820125230614-1183653930.png

发送: (可以发送1条,同时到匹配路由的3个队列去)

channel.BasicPublish("User", "#.user", false, null, Encoding.UTF8.GetBytes("这是要发送的内容"));

交换机有好几种路由功能,这些先放到后面,放这里不便于入门理解。

对交换机的功能,理解上面中提到的路由真实的效果那一句话即可。

本篇介绍RabbitMQ的基础概念的含义,有助于快速理解并掌握RabbitMQ。 


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK