前言:

本系列介绍RabbitMQ,介绍RabbitMQ的基础概念的含义。

并扫清网络上的一些错误或容易误导人的内容,帮助网友快速正确理解并掌握RabbitMQ。 

下面开始本篇内容相关介绍。

1、上图管理中心图:

 

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

复制代码
1、Overview:概述,就是基础监控。

2、Connections:链接

3、Channels:通道

4、Exchanges 交换机
5、Queues:队列 6、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。 

posted on   路过秋天  阅读(2396)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库
· 上周热点回顾(2.17-2.23)
历史上的今天:
2020-08-21 Sagit.Framework For IOS 开发框架入门教程14:STLocation 获取地图GPS城市、地址、经度、纬度、坐标距离判断,跳转设置与第三方地图
2016-08-21 CYQ.Data V5 从入门到放弃ORM系列:教程 - Log、SysLogs两个日志类使用
2010-08-21 CYQ.Data 轻量数据层之路 应用示例二 在线聊天(六)
路过秋天
点击右上角即可分享
微信分享提示