.Net RabbitMQ(消息队列)

文章目录

  • 一.RabbitMQ 介绍以及工作模式
    • 1.RabbitMQ的介绍:
    • 2.RabbitMQ的工作模式:
  • 二.RabbitMQ安装
    • 1.安装Erlang语言环境
    • 2.安装RabbitMQ
  • 三.在.Net中使用RabbitMQ
    • 1.HelloWorld模式
    • 2.工作队列模式
    • 3.发布订阅模式
    • 4.Routing路由模式和Topics通配符模式


一.RabbitMQ 介绍以及工作模式

1.RabbitMQ的介绍:

RabbitMQ 是一个开源的消息代理软件,它实现了高级消息队列协议(AMQP)的标准,同时也支持其他消息协议,如 MQTT。它最初由 Rabbit Technologies 公司开发,后来成为了 Pivotal Software 的一部分,现在则是由 VMware 管理。

以下是 RabbitMQ 的一些关键特点和功能:

消息队列: RabbitMQ 允许应用程序之间通过发送和接收消息进行通信。它作为一个中间件,负责接收、存储和路由消息,以确保消息能够可靠地传递到目标应用程序。

灵活的消息路由: RabbitMQ 支持不同类型的交换机(exchange),如 direct、topic、fanout 和 headers,每种类型的交换机都有不同的消息路由方式,使得消息的分发更加灵活高效。

持久化: RabbitMQ 支持将消息持久化到磁盘,以确保即使在代理重启后,消息也不会丢失。它还允许将队列和交换机设置为持久化,以提高系统的可靠性。

集群和高可用性: RabbitMQ 支持构建具有高可用性和可伸缩性的集群。通过将多个 RabbitMQ 节点组成集群,可以实现消息的负载均衡和故障转移,从而提高系统的可靠性和性能。

消息确认机制: RabbitMQ 支持消息确认机制,即生产者可以选择在消息发送到队列后等待消费者对消息的确认,以确保消息被成功处理。这种机制可以保证消息不会丢失,并且可以防止消息重复处理。

插件系统: RabbitMQ 提供了丰富的插件系统,可以通过插件扩展其功能,如集成其他消息协议、实现认证和授权、监控和管理等。

多语言客户端: RabbitMQ 提供了多种编程语言的客户端库,如 Java、Python、Ruby、C# 等,使得开发者可以方便地与 RabbitMQ 进行交互。

总的来说,RabbitMQ 是一个功能强大、可靠性高的消息代理软件,广泛应用于各种分布式系统和应用场景,如微服务架构、实时数据处理、任务调度等。

2.RabbitMQ的工作模式:

RabbitMQ 的工作模式主要涉及以下几个关键组件:生产者、交换机(Exchange)、队列(Queue)和消费者。通过这些组件,RabbitMQ 实现了消息的传输和路由。

生产者(Producer): 生产者是消息的发送者,它负责将消息发送到 RabbitMQ 中。生产者通常将消息发送到一个特定的交换机,然后由交换机将消息路由到一个或多个队列中。

交换机(Exchange): 交换机是消息的路由中心,负责接收从生产者发送的消息,并根据指定的路由规则将消息路由到一个或多个队列中。RabbitMQ 提供了不同类型的交换机,如 direct、topic、fanout 和 headers,每种类型的交换机都有不同的路由规则。

队列(Queue): 队列是消息的存储容器,它负责存储从交换机接收到的消息,以便消费者可以按顺序处理消息。每个队列都有一个唯一的名称,并且可以有多个消费者订阅同一个队列。

消费者(Consumer): 消费者是消息的接收者,它负责从队列中获取消息并进行处理。消费者通常会订阅一个或多个队列,并在收到消息后执行相应的业务逻辑。

RabbitMQ 的工作流程可以简单描述为:

生产者将消息发送到一个特定的交换机。
交换机根据指定的路由规则将消息路由到一个或多个队列中。
消费者从队列中获取消息并进行处理。
在这个过程中,RabbitMQ 提供了丰富的路由和消息确认机制,以确保消息能够可靠地传递和处理。

二.RabbitMQ安装

bilibili三分钟RabbitMQ安装教程,亲测有效

1.安装Erlang语言环境

a.RabbitMQ是Erlang语言开发的,所以我们首先去Erlang官网下载Erlang环境

在这里插入图片描述

b.下载完成后,我们直接根据默认的情况安装到电脑上,然后进入windows的“高级系统设置”,设置Erlang环境变量

给他一个变量名称,然后浏览刚才安装的Erlang目录位置,获取变量值

在这里插入图片描述

c.在环境变量的path中,配置刚才配置好的Erlang环境

在这里插入图片描述

2.安装RabbitMQ

a.接着我们进入RabbitMQ官网下载RabbitMQ

在这里插入图片描述
b.RabbitMQ下载安装完毕后,我们进入RabbitMQ的sbin目录中,用cmd终端行打开命令行,分别执行以下命令安装RabbitMQ Cli

a.在cmd中,进入RabbitMQ的sbin目录下,输入 
rabbitmq-plugins enable rabbitmq_management 
命令安装RabbitMQ Ctlb.输入 
rabbitmqctl status 
命令检验是否安装成功

c.进入服务中,先停止RabbitMQ的服务,然后在RabbitMQ的sbin目录中,启动RabbitMQ.Server.bat文件,最后再重启RabbitMQ服务,就可以进入浏览器访问http://localhost:15672/进入RabbitMQ服务端了

1)停止rabbitMQ服务

在这里插入图片描述

2)启动rabbitmq.server.bat文件

在这里插入图片描述

3)重启RabbitMQ服务后,使用浏览器进入http://localhost:15672/
斜体样式
默认的账户名密码都是:guest
在这里插入图片描述

三.在.Net中使用RabbitMQ

bilibili某博主详细解说:RabbitMQ从零到高可用集群

1.HelloWorld模式

HelloWorld模式通常被视为RabbitMQ的点对点模式,生产者将消息放入队列中,消费者直接从队列中读取

a.生产者代码:

var factory = new ConnectionFactory();
factory.HostName = "localhost";
factory.Port = 5672;
factory.UserName = "guest";
factory.Password = "guest";using (var connection = factory.CreateConnection())
{using (var channel = connection.CreateModel()){//创建队列,声明并创建一个队列,如果队列已存在,则使用这个队列//第一个参数:队列名称ID//第二个参数:是否持久化,false对应不持久化数据,MQ停掉数据就会丢失//第三个参数,是否队列私有化,flase达标所有的消费则会都可以访问,true代表只有第一次拥有它的消费者才能一直使用//第四个参数:是否自动删除,false代表链接停掉后不自动删除这个队列channel.QueueDeclare("hello",true,false,false,null);string message = $"Hellow RabbitMQ-{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")}";var body = Encoding.UTF8.GetBytes(message);channel.BasicPublish("","hello",null,body);Console.WriteLine($"RabbitMQ生产者已发送{message}");Console.ReadKey();}
}

b.消费者代码:

 var factory = new ConnectionFactory();factory.HostName = "localhost";factory.Port = 5672;factory.UserName = "guest";factory.Password = "guest";using (var connection = factory.CreateConnection()){using (var channel = connection.CreateModel()){//创建一个名为hello的消息队列channel.QueueDeclare("hello",true,false,false,null);var consumer = new EventingBasicConsumer(channel);channel.BasicConsume("hello",false,consumer);consumer.Received += (model, e) =>{var body = e.Body.ToArray();var message = Encoding.UTF8.GetString(body);Console.WriteLine("RabbitMQ消费者接收到消息:" + message);};channel.BasicConsume("hello",false,consumer);Console.WriteLine("Press [Enter] to exit");Console.ReadKey();}}

c.运行结果:

在这里插入图片描述

2.工作队列模式

工作队列模式,也称任务队列模式,生产者将任务传递到队列中,多个消费者竞争消费队列中的消息,一条消息只对应一个消费者

a.生产者代码:

 var factory = new ConnectionFactory();factory.HostName = "localhost";factory.Port = 5672;factory.UserName = "guest";factory.Password = "guest";using (var connection = factory.CreateConnection() ){using (var channel = connection.CreateModel()){channel.QueueDeclare("WorkQueue",true,false,false,null);for (int i = 0; i < 10; i++){var msg = $"消息队列ID10000{i}发送成功,{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss:fff")}";var body = Encoding.UTF8.GetBytes(msg);channel.BasicPublish("","WorkQueue",null,body);Console.WriteLine($"已发送:{msg}");}Console.ReadKey();}}

b.消费者1代码:

 var factory = new ConnectionFactory();factory.HostName = "localhost";factory.Port = 5672;factory.UserName = "guest";factory.Password = "guest";using (var connection = factory.CreateConnection()){using (var channel = connection.CreateModel()){//创建一个名为hello的消息队列channel.QueueDeclare("WorkQueue", true, false, false, null);//basicqos,MQ不再对消费者一次发送多条请求,而是一条处理完毕(确然后)再从队列中获取新的channel.BasicQos(0, 1, false);var consumer = new EventingBasicConsumer(channel);channel.BasicConsume("WorkQueue", false, consumer);consumer.Received += (model, e) =>{var body = e.Body.ToArray();var message = Encoding.UTF8.GetString(body);Thread.Sleep(100);Console.WriteLine("RabbitMQ消费者接收到消息:" + message);//消息确认:一旦消费者成功处理了任务,它会发送确认消息给 RabbitMQ,告知 RabbitMQ 该消息已经被处理并可以从队列中删除。如果消费者在处理任务时发生错误,消息将会被重新放回队列中,以便其他消费者重新尝试处理。channel.BasicAck(e.DeliveryTag,false);};channel.BasicConsume("WorkQueue", false, consumer);Console.WriteLine("Press [Enter] to exit");Console.ReadKey();}}

c.消费者2代码:

与消费者1代码一致

d.运行结果:

在这里插入图片描述

3.发布订阅模式

发布/订阅(Publish/Subscribe)模式是一种消息传递模式,用于将消息广播给多个消费者。在这种模式下,生产者将消息发送到一个交换机(Exchange)中,而不是直接发送到队列中。交换机则将消息广播给与之绑定的多个队列,每个队列都有一个或多个消费者来接收消息。

a.生产者代码:

var factory = new ConnectionFactory();
factory.HostName = "localhost";
factory.Port = 5672;
factory.UserName = "guest";
factory.Password = "guest";using (var connection = factory.CreateConnection())
{using (var channel = connection.CreateModel()){var msg = "20摄氏度";var body = Encoding.UTF8.GetBytes(msg);channel.BasicPublish("aweather","",null,body);Console.WriteLine("天气发送成功:"+msg);}
}

b.消费者1代码:

var factory = new ConnectionFactory();
factory.HostName = "localhost";
factory.Port = 5672;
factory.UserName = "guest";
factory.Password = "guest";using (var connection = factory.CreateConnection())
{using (var channel = connection.CreateModel()){channel.ExchangeDeclare("aweather", ExchangeType.Fanout);//声明消息队列channel.QueueDeclare("HuBei", true, false, false, null);channel.QueueBind("HuBei", "aweather", "");var consumer = new EventingBasicConsumer(channel);consumer.Received += (model, e) =>{var msg = Encoding.UTF8.GetString(e.Body.ToArray());Console.WriteLine("湖北收到天气信息:" + msg);channel.BasicAck(e.DeliveryTag, false);};channel.BasicConsume("HuBei", false, consumer);Console.WriteLine("Press [Enter] to exit");Console.ReadKey();}
}

c.消费者2代码:

var factory = new ConnectionFactory();
factory.HostName = "localhost";
factory.Port = 5672;
factory.UserName = "guest";
factory.Password = "guest";using (var connection = factory.CreateConnection())
{using (var channel = connection.CreateModel()){channel.ExchangeDeclare("aweather",ExchangeType.Fanout);//生命消息队列channel.QueueDeclare("HuNan",true,false,false,null);channel.QueueBind("HuNan","aweather","");var consumer = new EventingBasicConsumer(channel);consumer.Received += (model, e) =>{var msg = Encoding.UTF8.GetString(e.Body.ToArray());Console.WriteLine("湖南收到天气信息:"+msg);channel.BasicAck(e.DeliveryTag,false);};channel.BasicConsume("HuNan",false,consumer);Console.WriteLine("Press [Enter] to exit");Console.ReadKey();}
}

d.运行结果:

在这里插入图片描述

4.Routing路由模式和Topics通配符模式

Routing路由模式,是发布订阅模式的延伸,在发布订阅模式的基础上,分配
路由键(Routing Key),消费者根据路由键匹配队列中对用的消息

Topics通配符模式,是Routing路由模式的延伸,*用于匹配一个单词,#用于匹配零个或多个单词,用于替换匹配路由键

注意:一个队列只能匹配一个通配符,但是可以匹配多个路由规则,路由模式和通配符模式可以嵌套使用

a.生产者代码:

var dic = new Dictionary<string, string>();
dic.Add("china.hunan.changsha.20240418","中国湖南长沙2024年04月18日天气数据");
dic.Add("china.hubei.wuhan.20240418", "中国湖北武汉2024年04月18日天气数据");
dic.Add("china.beijing.20240418", "中国北京2024年04月18日天气数据");
dic.Add("us.flld.20240418", "美国弗罗里达2024年04月18日天气数据");var factory = new ConnectionFactory();
factory.HostName = "localhost";
factory.Port = 5672;
factory.UserName = "guest";
factory.Password = "guest";using (var connection = factory.CreateConnection())
{using (var channel = connection.CreateModel()){foreach (var item in dic){channel.BasicPublish("weather",item.Key,null,Encoding.UTF8.GetBytes(item.Value));}Console.WriteLine("气象信息发送成功");}
}

b.消费者1代码:

var factory = new ConnectionFactory();
factory.HostName = "localhost";
factory.Port = 5672;
factory.UserName = "guest";
factory.Password = "guest";using (var connection = factory.CreateConnection())
{using (var channel = connection.CreateModel()){channel.ExchangeDeclare("weather",ExchangeType.Direct);channel.QueueDeclare("us",true,false,false,null);//通配符模式channel.QueueBind("us","weather", "us.*.20240418");//路由模式channel.QueueBind("us","weather", "china.beijing.20240418");channel.BasicQos(0, 1, false);var customer = new EventingBasicConsumer(channel);customer.Received += (model, e) =>{var msg = Encoding.UTF8.GetString(e.Body.ToArray());Console.WriteLine("美国收到天气信息:"+msg);channel.BasicAck(e.DeliveryTag,false);};channel.BasicConsume("us",false,customer);Console.WriteLine("Press [Enter] to exit");Console.Read();}
}

c.消费者2代码:

var factory = new ConnectionFactory();
factory.HostName = "localhost";
factory.Port = 5672;
factory.UserName = "guest";
factory.Password = "guest";
using (var connection = factory.CreateConnection())
{using (var channel = connection.CreateModel()){channel.ExchangeDeclare("weather",ExchangeType.Direct);channel.QueueDeclare("china",true,false,false,null);//路由模式channel.QueueBind("china","weather", "china.hunan.changsha.20240418");channel.QueueBind("china", "weather", "china.hubei.wuhan.20240418");channel.QueueBind("china", "weather", "china.beijing.20240418");//通配符模式//channel.QueueBind("china", "weather", "china.#");channel.BasicQos(0,1,false);var consumer = new EventingBasicConsumer(channel);consumer.Received += (model, e) =>{var msg = Encoding.UTF8.GetString(e.Body.ToArray());Console.WriteLine("中国收到天气消息:"+msg);channel.BasicAck(e.DeliveryTag,false);};channel.BasicConsume("china",false,consumer);Console.WriteLine("Press [Enter] to exit");Console.Read();}
}

d.运行结果:

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/268.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用Python工具库SnowNLP对评论数据标注(二)

这一次用pandas处理csv文件 comments.csv import pandas as pd from snownlp import SnowNLPdf pd.read_csv("C:\\Users\\zhour\\Documents\\comments.csv")#{a: [1, 2, 3], b: [4, 5, 6], c: [7, 8, 9]}是个字典 emotions[] for txt in df[sentence]:s SnowNLP(…

Kali Linux扩容(使用图形化界面)

因为今天在拉取vulhub中的镜像的时候报错空间不够&#xff0c;因为最开始只给了20GB的空间&#xff0c;所以现在需要扩容了&#xff0c;结合了一下网上的找到了简便的解决方法 1.首先虚拟机设置->磁盘->扩展 小插曲&#xff1a;在对虚拟机磁盘进行扩容以后&#xff0c;…

linux启动minicom、u-boot的常用命令、网络命令tftp、nfs/根文件系统、u-boot的bootargs环境变量

linux启动minicom sudo minicom -con进入minicom界面&#xff1a; 打开单片机 在打开之后&#xff0c;我们通过 printenv查看环境配置 在修改配置之前&#xff0c;我们最好先将环境初始化一下&#xff0c;初始化代码为 nand erase.chipu-boot的常用命令 尽管u-boot是一个…

ObjectMapper解析JSON数据

ObjectMapper的作用 1.背景&#xff1a; 当我们调用API的时候捕获的数据&#xff0c;往往需要结合文档所定义的类进行转换&#xff0c;也就是Java对象与JSON 字符串之间的转换 2.作用&#xff1a; ObjectMapper 是 Jackson 库中的一个关键类&#xff0c;它的作用是将 JSON 数据…

第七周学习笔记DAY.4-方法重写与多态

学完本次课程后&#xff0c;你能够&#xff1a; 实现方法重写 深入理解继承相关概念 了解Object类 会使用重写实现多态机制 会使用instanceof运算符 会使用向上转型 会使用向下转型 什么是方法重写 方法的重写或方法的覆盖&#xff08;overriding&#xff09; 1.子类根据…

【Python系列】非异步方法调用异步方法

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

C语言学习/复习23---

一、数据的存储 二、数据类型的介绍 三、整型在内存中的存储 将原码转换为补码。如果数是正数&#xff0c;则补码与原码相同&#xff1b;如果数是负数&#xff0c;则先将原码按位取反&#xff0c;然后加1。将补码转换原补码。如果数是正数&#xff0c;则补码与原码相同&#x…

【简单介绍下日常的启发式算法】

&#x1f3a5;博主&#xff1a;程序员不想YY啊 &#x1f4ab;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f917;点赞&#x1f388;收藏⭐再看&#x1f4ab;养成习惯 ✨希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出…

CLSRSC-400: A system reboot is required to continue installing

RHEL 7.9ORACLE RAC 12.2.0.1.0&#xff0c;在运行root.sh脚本时&#xff0c;出现CLSRSC-400: A system reboot is required to continue installing报错 # /u01/app/12.2.0/grid/root.sh Performing root user operation.The following environment variables are set as:ORA…

在Windows安装R语言

直接安装R语言软件 下载网址&#xff1a;R: The R Project for Statistical Computing 下载点击install R for the first time 通过Anaconda下载RStudio 提前下载好Anaconda 点击Anaconda Navigate 点击RStudio的Install下载就好了

《大话数据结构》04 静态链表

1. 静态链表 其实C语言真是好东西&#xff0c;它具有的指针能力&#xff0c;使得它可以非常容易地操作内存中的地址和数据&#xff0c;这比其他高级语言更加灵活方便。后来的面向对象语言&#xff0c;如Java、C#等&#xff0c;虽不使用指针&#xff0c;但因为启用了对象引用机…

C语言进阶课程学习记录-第36课 - 函数与指针分析

C语言进阶课程学习记录-第36课 - 函数与指针分析 函数类型实验-函数指针实验-回调机制小结 本文学习自狄泰软件学院 唐佐林老师的 C语言进阶课程&#xff0c;图片全部来源于课程PPT&#xff0c;仅用于个人学习记录 函数类型 实验-函数指针 #include <stdio.h>typedef in…

PLC工业网关,实现PLC联网

在当今工业自动化领域&#xff0c;PLC&#xff08;可编程逻辑控制器&#xff09;作为控制系统的核心&#xff0c;其稳定性和可靠性至关重要。然而&#xff0c;随着工业互联网和智能制造的快速发展&#xff0c;如何实现PLC的联网通信&#xff0c;提高数据传输效率&#xff0c;成…

Redis教程——数据类型(哈希、集合)

上篇文章我们学习了Redis教程——数据类型&#xff08;字符串、列表&#xff09;&#xff0c;这篇文章学习Redis教程——数据类型&#xff08;哈希表、集合&#xff09; 哈希表Hash 哈希表是一个string类型的field(字段)和value(值)的映射表&#xff0c;hash特别适合用于存储…

C语言进阶课程学习记录-函数指针的阅读

C语言进阶课程学习记录-函数指针的阅读 5个标识符含义解析技巧 本文学习自狄泰软件学院 唐佐林老师的 C语言进阶课程&#xff0c;图片全部来源于课程PPT&#xff0c;仅用于个人学习记录 5个标识符含义解析 int (*p1) (int* , int (*f) ( int* ) );定义了指针p1,指向函数&#…

OpenHarmony实战开发-如何通过分割swiper区域,实现指示器导航点位于swiper下方的效果。

介绍 本示例介绍通过分割swiper区域&#xff0c;实现指示器导航点位于swiper下方的效果。 效果预览图 使用说明 1.加载完成后swiper指示器导航点&#xff0c;位于显示内容下方。 实现思路 1.将swiper区域分割为两块区域&#xff0c;上方为内容区域&#xff0c;下方为空白区…

采用等价类划分法设计测试用例

例题1 请采用等价类划分法设计测试用例。 考虑软件 app, 它有两个输入变量 , 分别是 name 和 age, 其中 ,name 是至多包含 20 个字母字符的非空字符串 ,age 是整数型变量 ,0 ≤ age ≤ 120 。当输入给 name 的字符串的长度超过 20时 ,name 取前 20 个字符作为 name 的值 ; 如果…

【面试经典 150 | 二分查找】搜索旋转排序数组

文章目录 写在前面Tag题目来源解题思路方法一&#xff1a;二分查找 写在最后 写在前面 本专栏专注于分析与讲解【面试经典150】算法&#xff0c;两到三天更新一篇文章&#xff0c;欢迎催更…… 专栏内容以分析题目为主&#xff0c;并附带一些对于本题涉及到的数据结构等内容进行…

宏集eX700M系列HMI实现港口设备数据上云

前言 随着港口设备信息化技术的快速发展&#xff0c;越来越多的企业想要把现场设备数据上传到云平台&#xff0c;进而实现关键数据的远程监控和分析处理。在此背景下&#xff0c;国内某信息化公司想要将港口设备数据通过MQTT上传到该公司自研IOT平台&#xff0c;实现数据上云&…

java项目的构建工具-Maven

黑马程序员JavaWeb开发教程 文章目录 一、概述1、介绍&#xff08;1&#xff09;介绍&#xff08;2&#xff09;Maven的作用&#xff08;3&#xff09;官网&#xff08;4&#xff09;仓库 2、安装 二、IDEA 集成 Maven1、配置Maven环境2、创建Maven项目&#xff08;1&#xff0…