学习在.NET Core中使用RabbitMQ进行消息传递之持久化(二)

前言

上一节我们简单介绍了RabbitMQ和在安装后启动所出现的问题,本节我们开始正式进入RabbitMQ的学习,对于基本概念请从官网或者其他前辈博客上查阅,我这里不介绍基础性东西,只会简单提一下,请知悉。

RabbitMQ持久化

在RabbitMQ中存在四种交换机,一是直连交换机(Direct Exchange),二是广播交换机(Fantout Exchange),三是主体交换机(Topic Exchange),四是头交换机(Header Exchange),每种交换机都有其对应场景,后面会一一讲到。任何处理消息的开源库都离不开两个角色,一是生产者(Producer),二是消费者(Consumer),消息从生产者到达消费者需经过三个阶段也就是我们需要知道的三个概念,一是交换机,二是队列,三是绑定,初次见此三者概念感觉很高大上是不是,其实不过是高度抽象了而已,同时看到很多博客上对此三者解释的还是非常深刻,我这里就不过多细说。我们先看别人博客上对整个RabbitMQ架构用图来进行标识,然后对照我对交换机、队列、绑定一言以蔽之进行如下概括您就明白他们具体是干什么了。

交换机是生产者发布消息的入口点,队列是消费者获取消息的容器,绑定是将交换机连接到队列的规则

我们简单过一下消息从生产者到达消费者的大概过程,生产者也就是上述图中的ClientA和ClientB,发送消息到交换机,这里交换机可以是一个或者多个,然后通过路由键绑定到队列,那么消费者如何知道绑定到了哪个队列呢?然后消费者也就是上述Client1、Client2、Client3也要声明交换机、队列、绑定,这样整个过程就串起来了,原理大概就是这样。接下来我们通过代码来实现生产者发送消息(请通过NuGet安装RabbitMQ客户端)。

    public class RabbitMQService
    {
        public IConnection GetRabbitMQConnection()
        {
            var connectionFactory = new ConnectionFactory
            {
                HostName = "localhost",
                UserName = "guest",
                Password = "guest"
            };
            return connectionFactory.CreateConnection();
        }
    }

第一步当然是需要创建连接,连接到RabbitMQ服务,接下来则是在我们创建连接的基础上创建通道,然后上述我们所说消息从生产者到达消费者的过程就是在此通道上进行。

            var rabbitMQService = new RabbitMQService();
            var connection = rabbitMQService.GetRabbitMQConnection();
            var model = connection.CreateModel();

接下来则是声明交换机、队列、通过路由键将交换机和队列绑定在一起。

        static void InitialTopicQueue(IModel model)
        {
            model.QueueDeclare("queueDeclare", true, false, false, null);
            model.ExchangeDeclare("exchangeDeclare", ExchangeType.Topic);
            model.QueueBind("queueDeclare", "exchangeDeclare", "routeKey");
        }

如上我们声明队列名称为queueDeclare且该队列持久化,然后声明交换机名称为exchangeDeclare,交换机类型为主题,最后通过QueueBind方法通过routekey路由键将声明的交换机和队列绑定在一起。接下来我们开始发布消息。

            var basicProperties = model.CreateBasicProperties();
            basicProperties.DeliveryMode = 1;
            var payload = Encoding.UTF8.GetBytes("这是来自运行VS2017控制台发出的消息");
            var address = new PublicationAddress(ExchangeType.Topic, "exchangeDeclare", "routeKey");
            model.BasicPublish(address, basicProperties, payload);

然后我们在控制台中运行上述程序,然后在RabbitMQ UI上来查看声明的交换机、队列、绑定的路由键以及承载的消息。

一切如正常运行,其我们发布的消息在队列中处于Ready状态,接下来我们在服务中关闭RabbitMQ服务代理,然后重启模拟宕机的情况。

因为在声明队列中第二个参数可指定该队列是否可持久化,我们指定为True即持久化,所以即使RabbitMQ Broker重启队列依然还在,这个时候我们会发现在队列中的数据被扔掉了,也就是说此时的队列为空。那是因为我们指定消息为非持久化,如下指定传输模式即DeliveryModel属性为1,1代表非持久化,2为可持久化。所以如果我们指定DeliveryMode等于2即使RabbitMQ代理宕机,重启后消息依然还在。

            var basicProperties = model.CreateBasicProperties();
            basicProperties.DeliveryMode = 2;

同理切换到ExchangeType界面时,此时我们声明的交换机不存在了,如下:

因为声明交换机时ExchangeDeclare方法有重载,第三个参数可指定是否持久化,默认为非持久化,如果我们进行如下指定为持久化,那么和在队列中的消息一样即使RabbitMQ代理重启交换机依然还在,这个就不需要我再过多啰嗦了。

 model.ExchangeDeclare("exchangeDeclare", ExchangeType.Topic, true);

从如上演示我们可看出在RabbitMQ中关于持久化,可对交换机(ExChange)、队列(Queue)、消息(Message)分别指定持久化,而且在大部分情况下这也是我们想要的。因为这至少可以保证消息从生产者传递消费者的过程中不会丢失。那么对于持久化和非持久化RabbitMQ是如何进行处理的呢?

持久化:将消息保存到磁盘上,因此即使在服务器重新启动后它们仍然可用,只不过在读取和保存消息时会产生一些额外的开销罢了。

非持久化:将消息被保存在内存中,虽然它们在服务器重启后将会消失,但提供更快的消息处理。

总结

今天我们详细讲解了RabbitMQ中的持久化,我们可从交换机、队列、消息三个层面去设置持久化。这只是小试牛刀,下节开始讨论细枝末节,学习的过程也是发现问题的过程,我们下节再会。

原文地址:https://www.cnblogs.com/CreateMyself/p/8971179.html

时间: 2024-10-14 11:13:35

学习在.NET Core中使用RabbitMQ进行消息传递之持久化(二)的相关文章

WSL2+Docker部署RabbitMQ以及在Asp.net core 中使用RabbitMQ示例(1)

本文主要在于最近因疫情不能外出,在家研究的一些技术积累. 主要用到的技术以及知识点: WSL 2 WSL 2+Docker Docker+RabbitMQ 在ASP.NET Core中使用RabbitMQ消息队列    一.WSL 2 1.什么是WSL 2? WSL 2就是 适用于Linux的Windows子系统的第二代版本,全称 Windows Subsystem for Linux 2. 2.为什么要使用WSL2? 其实这里使用WSL2目的,纯碎是为了用Docker.以前微软实现的WSL有些

6.ASP.NET Core中的Main方法

在这篇文章中,我将带领大家详细学习ASP.NET Core 中的Main方法.在这篇文章中,我将向大家详细介绍下面几个问题: ASP.NET Core Main方法的重要性 为什么我们在ASP.NET Core中会有一个Main方法? 当你运行一个ASP.NET Core应用程序的时候,背后发生了什么? 为了解释这些问题,我们首先打开,在之前的文章中,新建的空模板的ASP.NET Core项目. 你可以看到我们有一个Program类文件,里面包含图中所示的代码. 从上图中,我们可以看到程序包含一

ASP.NET Core消息队列RabbitMQ基础入门实战演练

一.课程介绍 人生苦短,我用.NET Core!消息队列RabbitMQ大家相比都不陌生,本次分享课程阿笨将给大家分享一下在一般项目中99%都会用到的消息队列MQ的一个实战业务运用场景.本次分享课程不是零基础教学,课程内容的侧重点是讲解的RabbitMQ的最实用.最简单的实战运用场景:Publish/Subscrib(发布/订阅)模式,发送端发送消息,单个接收端接收处理消息. 学完本次"是猴子都看的懂的消息队列RabbitMQ实战课程"后,阿笨带直接让你也能如此优雅简单的上手使用Rab

简单介绍下怎么在spring中使用RabbitMQ

这篇文章主要介绍了简单了解如何在spring中使用RabbitMQ,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 常见的消息中间件产品: (1)ActiveMQ ActiveMQ 是Apache出品,最流行的,能力强劲的开源消息总线.ActiveMQ 是一个完全支持JMS1.1和J2EE 1.4规范的 JMS Provider实现. (2)RabbitMQ AMQP协议的领导实现,支持多种场景.淘宝的MySQL集群内部有使用它进行通讯,Open

NET Core中怎么使用HttpContext.Current

NET Core中怎么使用HttpContext.Current 阅读目录 一.前言 二.IHttpContextAccessor 三.HttpContextAccessor 回到目录 一.前言 我们都知道,ASP.NET Core作为最新的框架,在MVC5和ASP.NET WebForm的基础上做了大量的重构.如果我们想使用以前版本中的HttpContext.Current的话,目前是不可用的,因为ASP.NET Core中是并没有这个API的. 当然我们也可以通过在Controller中访问

Asp.net core中Migration工具使用的交流分享

a,ul>li,em{ color:deeppink !important; } h2>a{ text-decoration:none; } ul>li{ padding:3px; } ul{ width:512px; } li>p{ color:#333; margin:0 !important; } hr{ border-color:deeppink; } em{ font-style:normal; } .passage{ text-indent:2em; font-size

学习ASP.NET Core,你必须了解无处不在的“依赖注入”

ASP.NET Core的核心是通过一个Server和若干注册的Middleware构成的管道,不论是管道自身的构建,还是Server和Middleware自身的实现,以及构建在这个管道的应用,都需要相应的服务提供支持,ASP.NET Core自身提供了一个DI容器来实现针对服务的注册和消费.换句话说,不只是ASP.NET Core底层框架使用的服务是由这个DI容器来注册和提供,应用级别的服务的注册和提供也需要以来这个DI容器,所以正如本文标题所说的——学习ASP.NET Core,你必须了解无

ASP.NET Core中使用Razor视图引擎渲染视图为字符串

一.前言 在有些项目需求上或许需要根据模板生产静态页面,那么你一样可以用Razor语法去直接解析你的页面从而把解析的页面生成静态页,这样的使用场景很多,不限于生成静态页面,视图引擎为我们提供了模型到视图的代码或文本生成的能力. 本文章中采用的是ASP.NET Core MVC原生的方法:当然我在YOYOFx中也实现了这种视图引擎 ( https://github.com/maxzhang1985/YOYOFx/blob/master/AspNetCore/YOYO.AspNetCore.View

[转]ASP.NET Core 中的那些认证中间件及一些重要知识点

本文转自:http://www.qingruanit.net/c_all/article_6645.html 在读这篇文章之间,建议先看一下我的 ASP.NET Core 之 Identity 入门系列(一,二,三)奠定一下基础. 有关于 Authentication 的知识太广,所以本篇介绍几个在 ASP.NET Core 认证中会使用到的中间件,还有Authentication的一些零碎知识点,这些知识点对于 ASP.NET 认证体系的理解至关重要. 在 Github 中 ASP.NET C