系列目录

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、基础含义理解:链接、通道、队列、交换机的更多相关文章

  1. RabbitMQ 入门系列:3、基础含义:持久化、排它性、自动删除、强制性、路由键。

    系列目录 RabbitMQ 入门系列:1.MQ的应用场景的选择与RabbitMQ安装. RabbitMQ 入门系列:2.基础含义:链接.通道.队列.交换机. RabbitMQ 入门系列:3.基础含义: ...

  2. RabbitMQ 入门系列:3、基础编码:官方SDK的引用、链接创建、单例改造、发送消息、接收消息。

    系列目录 RabbitMQ 入门系列:1.MQ的应用场景的选择与RabbitMQ安装. RabbitMQ 入门系列:2.基础含义:链接.通道.队列.交换机. RabbitMQ 入门系列:3.基础含义: ...

  3. RabbitMQ 入门系列:5、基础编码:交换机的进阶介绍及编码方式。

    系列目录 RabbitMQ 入门系列:1.MQ的应用场景的选择与RabbitMQ安装. RabbitMQ 入门系列:2.基础含义:链接.通道.队列.交换机. RabbitMQ 入门系列:3.基础含义: ...

  4. RabbitMQ 入门系列:6、保障消息:不丢失:发送方、Rabbit存储端、接收方。

    系列目录 RabbitMQ 入门系列:1.MQ的应用场景的选择与RabbitMQ安装. RabbitMQ 入门系列:2.基础含义:链接.通道.队列.交换机. RabbitMQ 入门系列:3.基础含义: ...

  5. RabbitMQ 入门系列:7、保障消息不重复消费:产生消息的唯一ID。

    系列目录 RabbitMQ 入门系列:1.MQ的应用场景的选择与RabbitMQ安装. RabbitMQ 入门系列:2.基础含义:链接.通道.队列.交换机. RabbitMQ 入门系列:3.基础含义: ...

  6. RabbitMQ 入门系列:8、扩展内容:接收信息时:可否根据RoutingKey过滤监听信息,答案是不能。

    系列目录 RabbitMQ 入门系列:1.MQ的应用场景的选择与RabbitMQ安装. RabbitMQ 入门系列:2.基础含义:链接.通道.队列.交换机. RabbitMQ 入门系列:3.基础含义: ...

  7. RabbitMQ 入门系列:9、扩展内容:死信队列:真不适合当延时队列。

    系列目录 RabbitMQ 入门系列:1.MQ的应用场景的选择与RabbitMQ安装. RabbitMQ 入门系列:2.基础含义:链接.通道.队列.交换机. RabbitMQ 入门系列:3.基础含义: ...

  8. RabbitMQ 入门系列:10、扩展内容:延时队列:延时队列插件及其有限的适用场景(系列大结局)。

    系列目录 RabbitMQ 入门系列:1.MQ的应用场景的选择与RabbitMQ安装. RabbitMQ 入门系列:2.基础含义:链接.通道.队列.交换机. RabbitMQ 入门系列:3.基础含义: ...

  9. [转]快速入门系列--WebAPI--01基础

    本文转自:http://www.cnblogs.com/wanliwang01/p/aspnet_webapi_base01.html ASP.NET MVC和WebAPI已经是.NET Web部分的 ...

随机推荐

  1. Machine Learning With Go 第4章:回归

    4 回归 之前有转载过一篇文章:容量推荐引擎:基于吞吐量和利用率的预测缩放,里面用到了基本的线性回归来预测容器的资源利用情况.后面打算学一下相关的知识,译自:Machine Learning With ...

  2. JavaScript数据类型BigInt实践之id数值太大,导致前后端交互异常

    项目开发中前后端数据交互常会使用id作为主键索引,通常id数值都不大,使用number类型就可以表示处理,但对于一些分布式id或其他情况,id数值太大且超过了JS的最大处理数(Math.pow(2,  ...

  3. 浅析DispatchProxy动态代理AOP

    浅析DispatchProxy动态代理AOP(代码源码) 最近学习了一段时间Java,了解到Java实现动态代理AOP主要分为两种方式JDK.CGLIB,我之前使用NET实现AOP切面编程,会用Fil ...

  4. JS:自增和自减

    自增自减是一元操作符运算 1.++: 前置++:先把取值,再把变量的值加1 后置++:先把变量的值加1,再取值 2.--: 前置--:先把取值,再把变量的值加1 后置--:先把变量的值加1,再取值 v ...

  5. CVPR2022 | 弱监督多标签分类中的损失问题

    前言 本文提出了一种新的弱监督多标签分类(WSML)方法,该方法拒绝或纠正大损失样本,以防止模型记忆有噪声的标签.由于没有繁重和复杂的组件,提出的方法在几个部分标签设置(包括Pascal VOC 20 ...

  6. 数组基础篇(对应C++ Primer plus 4.10)

    概要:数组是由一组同类型的元素组成的集合,在内存上是一片连续的存储空间.C++提供了三种数组的表示方法:普通数组,模板类vector(C++98 新增的标准模板库STL提供该模板类)和模板类array ...

  7. NC14301 K-th Number

    NC14301 K-th Number 题目 题目描述 Alice are given an array A[1..N] with N numbers. Now Alice want to build ...

  8. Vue3 项目实战

    使用Vue3 开发一个小米商城 业务流程 登录---> 产品首页--->产品站--->产品详情 购物车--->订单确认--->订单支付--->订单列表 业务开发流程 ...

  9. VS code 远程连接服务器步骤

    ①安装VS code,并连接远程服务器(本地也需要有ssh).参考 ②免密钥登录设置,参考 具体步骤:WIN+R -->cmd, 输入ssh-keygen,然后一直Enter,最终生成公钥和私钥 ...

  10. Identity Server 4资源拥有者密码认证控制访问API

    基于上一篇文章中的代码进行继续延伸,只需要小小的改动即可,不明白的地方可以先看看本人上一篇文章及源码: Identity Server 4客户端认证控制访问API 一.QuickStartIdenti ...