C#使用RabbitMQ-1_Docker部署并在c#中实现简单模式消息代理

介绍

RabbitMQ是一个开源的消息队列系统,实现了高级消息队列协议(AMQP)

🍀RabbitMQ起源于金融系统,现在广泛应用于各种分布式系统中。它的主要功能是在应用程序之间提供异步消息传递,实现系统间的解耦和消息的可靠传递。RabbitMQ使用Erlang语言开发,支持多种客户端语言如Python、Ruby、.NET、Java等。

此外,RabbitMQ具有以下特点:

  1. 易用性:提供了简单易用的API,使得生产者和消费者可以方便地发送和接收消息。
  2. 扩展性:可以水平扩展以处理大量的消息,支持集群部署来提高系统的吞吐量和可用性。
  3. 高可用性:通过镜像队列等机制保证消息不会因服务器故障而丢失,确保了系统的稳健运行。
  4. 多种交换模式:支持直接交换、扇形交换、主题交换和头交换等多种交换模式,满足不同的消息路由需求。
  5. 多协议支持:除了AMQP协议,还支持STOMP等其他消息协议。

在docker中部署RabbitMQ

🍀首先在dockerHub中找到RabbitMQ的镜像

rabbitmq - 官方图片 (docker.com)

🍀执行命令拉取镜像

docker pull rabbitmq

🍀镜像拉取完成之后启动镜像

docker run -d -p 5672:5672 -p 15672:15672 --name rabbitmq rabbitmq

🍀此时我们打开 http://localhost:15672/会发现无法访问,这是因为管理插件还未被激活

🍀通过docker ps -a查看部署的RabbitMQ容器id,在通过使用命令

 docker exec -it 容器id /bin/bash 

🍀进入容器内部再运行:rabbitmq-plugins enable rabbitmq_management

🍀此时就可以打开管理插件了,第一次使用 RabbitMQ 管理界面,需要使用默认的用户名和密码( guest/guest)来登录

 消息队列简单模式(直连交换机)

🍀simple模式,是RabbitMQ最简单的一种模式,如下图所示,只有一个生产者,一个消费者和一个队列

🍀生产者和消费者在发送和接受消息时,只需要指定队列名,而不需要指定发送到哪个Exchange

生产者代码

class MyClass
{public static void Main(string[] args){var factory = new ConnectionFactory();factory.HostName = "localhost"; //RabbitMQ服务在本地运行factory.UserName = "guest"; //用户名factory.Password = "guest"; //密码//创建连接using (var connection = factory.CreateConnection()){//创建通道using (var channel = connection.CreateModel()){//声明一个名称为hello的消息队列channel.QueueDeclare("hello", false, false, false, null); for (int i = 0; i < 5; i++){string message = "Hello Word ! " + i; //传递的消息内容var body = Encoding.UTF8.GetBytes(message);//此处的参数"hello" 就对应的就是上面声明的消息队列的路由键channel.BasicPublish("", "hello", null, body); //开始传递Console.WriteLine("已发送: {0}", message);}}}}
}

消费者代码(自动模式)

class MyClass
{static void Main(string[] args){//创建连接工厂var factory = new ConnectionFactory();factory.HostName = "localhost";factory.UserName = "guest";factory.Password = "guest";//创建连接using (var connection = factory.CreateConnection()){//创建通道using (var channel = connection.CreateModel()){//声明队列channel.QueueDeclare("hello", false, false, false, null);//事件的基本消费者var consumer = new EventingBasicConsumer(channel);consumer.Received += (model, ea) =>{var body = ea.Body.ToArray();var message = Encoding.UTF8.GetString(body);Console.WriteLine("已接收: {0}", message);//发送消息确认信号(手动确认)    //channel.BasicAck(ea.DeliveryTag,false);};//当 autoAck设置为true时,也就是自动确认模式,一旦消息队列将消息发送给消息消费者后,就会从内存中将这个消息删除。//当autoAck设置为false时,也就是手动模式,如果此时的有一个消费者宕机,消息队列就会将这条消息继续发送给其他的消费者,这样数据在消息消费者集群的环境下,就不会不丢失了。channel.BasicConsume("hello", true, consumer);Console.ReadKey();}}}
}

🍀在消费者代码中,要注意的是autoAck设置为true时,也就是自动确认模式的时候,要去掉手动发送确认信号代码:channel.BasicAck(ea.DeliveryTag,false);  

代码调试

🍀 在代码执行到

channel.QueueDeclare("hello", false, false, false, null);

 🍀声明一个消息队列时,在RabbitMQ的可视化界面就可以看见多了一个名称为hello的消息队列

🍀当执行完五次消息传递时,点击上图的hello消息队列,Messages:设置为5,然后点击Get Messages,就可以看到传递过来的5条消息队列了

 

🍀此时我们执行消费者代码,因为autoAck设置为true了,当消息队列将消息发送给消费者后,就会立马将消息删除,此时再点击Get Messages就会提示Queue is empty

消费者代码(手动模式)

在手动模式中,我们将原来声明的队列删除调,然后将生产者与消费者的声明队列代码中的第二个参数都改为true,意味着这个队列是持久的。在 RabbitMQ 服务器重启之后,持久的队列和它的消息都不会丢失

channel.QueueDeclare("hello", true, false, false, null);

然后添加一行代码,设置当前消费者的预取模式为只预取一条消息

channel.BasicQos(0, 1, false);

 接着是 发送消息确认信号 与 开启手动确认模式

channel.BasicAck(ea.DeliveryTag,false);
channel.BasicConsume("hello", false, consumer);

要注意的地方是,一定要在结尾处加上下方代码,否则可能会出现还没发送消息确认信号,进程就结束了,这时就会发现将接收到的helloword打印到控制台了,去RabbitMQ可视乎管理界面发现事件还未被消耗掉。

Console.ReadKey();
  static void Main(string[] args){//创建连接工厂var factory = new ConnectionFactory();factory.HostName = "localhost";factory.UserName = "guest";factory.Password = "guest";//创建连接using (var connection = factory.CreateConnection()){//创建通道using (var channel = connection.CreateModel()){//声明队列channel.QueueDeclare("hello", true, false, false, null);channel.BasicQos(0, 1, false);//事件的基本消费者var consumer = new EventingBasicConsumer(channel);consumer.Received += (model, ea) =>{var body = ea.Body.ToArray();var message = Encoding.UTF8.GetString(body);Console.WriteLine("已接收: {0}", message);//发送消息确认信号(手动确认)    channel.BasicAck(ea.DeliveryTag,false);};//当 autoAck设置为true时,也就是自动确认模式,一旦消息队列将消息发送给消息消费者后,就会从内存中将这个消息删除。//当autoAck设置为false时,也就是手动模式,如果此时的有一个消费者宕机,消息队列就会将这条消息继续发送给其他的消费者,这样数据在消息消费者集群的环境下,就不会不丢失了。channel.BasicConsume("hello", false, consumer);Console.ReadKey();}}}

代码调试

按照上面改成手动模式后,消费者只预取一条消息,如下图0、1、2被消费掉了,此时再去RabbitMQ的可视乎管理界面点击GetMessage,只剩下3、4的消息内容了

 

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

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

相关文章

YOLOv8优化策略:轻量化改进 | RepGhost,通过重参数化实现硬件高效的Ghost模块

🚀🚀🚀本文改进:RepGhost,通过重参数化实现硬件高效的Ghost模块,性能优于GhostNet、MobileNetV3等,在移动设备上具有更少的参数和可比的延迟。 🚀🚀🚀YOLOv8改进专栏:http://t.csdnimg.cn/hGhVK 学姐带你学习YOLOv8,从入门到创新,轻轻松松搞定科研; 1.原…

互联网加竞赛 基于深度学习的人脸专注度检测计算系统 - opencv python cnn

文章目录 1 前言2 相关技术2.1CNN简介2.2 人脸识别算法2.3专注检测原理2.4 OpenCV 3 功能介绍3.1人脸录入功能3.2 人脸识别3.3 人脸专注度检测3.4 识别记录 4 最后 1 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; 基于深度学习的人脸专注度…

python爬虫基础

python爬虫基础 前言 Python爬虫是一种通过编程自动化地获取互联网上的信息的技术。其原理可以分为以下几个步骤&#xff1a; 发送HTTP请求&#xff1a; 爬虫首先会通过HTTP或HTTPS协议向目标网站发送请求。这个请求包含了爬虫想要获取的信息&#xff0c;可以是网页的HTML内…

xxl-job之API的方式接入

文章目录 1 xxl-job1.1 简介1.2 分析1.3 学习xxl-job源码1.4 改造项目1.4.1 接口调用1.4.1.1 对接登录接口1.4.1.2 对接执行器接口1.4.1.3 对接任务接口 1.4.2 创建新注解1.4.3 自动注册核心1.4.4 自动装配 1 xxl-job 1.1 简介 xxl-job是一款非常优秀的任务调度中间件&#x…

蓝桥杯-sort排序(上)

sort排序 &#x1f388;1.算法说明&#x1f388;2.例题&#x1f52d;2.1例题一&#x1f52d;2.2例题二&#x1f52d;2.3例题三&#x1f52d;2.4例题四&#x1f52d;2.5例题五&#x1f52d;2.6例题六 &#x1f388;1.算法说明 &#x1f50e;对于一个数组&#xff0c;通过对数组中…

数据结构与算法——队列

概述 计算机科学中&#xff0c;queue 是以顺序的方式维护的一组数据集合&#xff0c;在一端添加数据&#xff0c;从另一端移除数据。添加的一端称为尾&#xff0c;移除的一端称为头。 功能 插入offer(value : E) : boolean  取值并移除poll() : E  取值peek() : E  判断…

《繁花》黄河路至真园-UMLChina建模知识竞赛第5赛季第4轮

DDD领域驱动设计批评文集 做强化自测题获得“软件方法建模师”称号 《软件方法》各章合集 参考潘加宇在《软件方法》和UMLChina公众号文章中发表的内容作答。在本文下留言回答。 只要最先答对前3题&#xff0c;即可获得本轮优胜。 如果有第4题&#xff0c;第4题为附加题&am…

HAL STM32基于系统滴答定时器(SysTick)实现多任务时间片轮询

HAL STM32基于系统滴答定时器&#xff08;SysTick&#xff09;实现多任务时间片轮询 &#x1f4d1;RTOS&#xff08;实时操作系统&#xff09;和定时器时间片轮询是两种不同的任务调度和执行方式的差异简介 &#x1f516; 以下部分内容&#xff0c;由AI给出的解答&#xff1a; …

【搞懂设计模式】中介模式:让代码更简洁,让程序更舒适!

中介模式的定义 在很多应用中&#xff0c;不同模块或者组件间的交互复杂且分散&#xff0c;这就难以管理和维护。在这种情况下&#xff0c;我们可以使用中介模式。在中介模式中&#xff0c;我们引入一个中介者对象&#xff0c;这个中介者就像是一个控制塔&#xff0c;负责处理…

Tomcat怎么优化

目录 性能方面的优化&#xff1a; 安全方面的优化&#xff1a; 引言&#xff1a;面试官问到的Tomcat怎么优化&#xff0c;这两个方面直接得到他认可&#xff01;&#xff01; 性能方面的优化&#xff1a; 内存优化&#xff1a;-Xms java虚拟机初始化时的最小内存、-Xmx java虚…

C语言-qsort的使用

1. qsort()函数简介 qsort&#xff08;&#xff09;函数是C语言库函数中的一种排序函数&#xff0c;排序方法为快速排序&#xff08;quick sort&#xff09; 。 其特点是可以排序任意类型的数组元素。 1.1 函数原型 void qsort(void* base, size_t num, size_t size, int (*co…

C++ 之LeetCode刷题记录(二十)

&#x1f604;&#x1f60a;&#x1f606;&#x1f603;&#x1f604;&#x1f60a;&#x1f606;&#x1f603; 开始cpp刷题之旅。 依旧是追求耗时0s的一天。 110. 平衡二叉树 给定一个二叉树&#xff0c;判断它是否是高度平衡的二叉树。 本题中&#xff0c;一棵高度平衡二…