热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

rabbitmq查看消费者_.netCore3.1使用RabbitMQ(一)

1.为什么要用消息队列消息队列是啥:消息队列(MessageQueue),一种先进先出的队列结构,用于处理Me
db49b19759bac9ac1f7030b487dbbe07.png

1. 为什么要用消息队列

  • 消息队列是啥:消息队列(Message Queue),一种先进先出的队列结构,用于处理Message。
  • 消息队列解决的问题:在处理大量并发请求时,同步处理往往会发生阻塞,特别是在更新数据库或者调用其他组件时。消息队列能够实现请求的异步处理、应用解耦、流量削锋和消息通讯,同时能够有效防止阻塞导致的消息丢失。
  • 消息队列系统,一般都包含3个角色:队列服务端,队列的生产者,队列的消费者。这种架构与当下流行的分布式架构极为契合。

2. RabbitMQ是啥

  • RabbitMQ是使用Erlang编写的一个开源的消息队列,本身支持很多的协议:AMQP,XMPP, SMTP, STOMP,也正因如此,它非常重量级,更适合于企业级的开发。同时实现了Broker构架,这意味着消息在发送给客户端时先在中心队列排队。对路由,负载均衡或者数据持久化都有很好的支持。
7f627b5272d2b15d5fbf331f78d257e3.png
  • 它支持开放的高级消息队列协议 (AMQP,Advanced Message Queuing Protocol),从根本上避免了生产厂商的封闭,使用任何语言的各种客户都可以从中受益。这种协议提供了相当复杂的消息传输模式,所以基本上不需要MassTransit或NServiceBus的配合。它还具有“企业级”的适应性和稳定性。这些东西对我的客户来说十分的有吸引力。
d3df567723a47f5f10d0eeadcead12f5.png
RabbitMQ的整体架构

3. 如何安装RabbitMQ

  • 安装RabbitMQ(下载地址:https://github.com/rabbitmq/rabbitmq-server/releases/tag/v3.7.26)(安装之前先安装 Erlang)
099e16798947e7eaf91936f8020262c1.png
cfdeb333490383682674171ea8c41440.png
6f2f6082031336983413134626bb2425.png
将sbin添加到环境目录中的Path中
efeb37342ebfa8df611cb9ad3b2e92f0.png
在Powershell中执行:rabbitmq-plugins list
b76fd77ccddf36e334a75600c1793caa.png
安装RabbitMQ可视化管理端:rabbitmq-plugins enable rabbitmq_management

默认的账户密码都是guest

37433e05d5e892f48b27f2c317d0ac6e.png
登录之后的页面
8bce680fb3afd292d7a8d85cb53b60d0.png
修改或者删除该用户(建议先修改密码,然后添加用户,添加之后再删除guest用户,或者直接改一个密码吗保留guest用户)
8c9a4baa0c0c44338feee53fa375ac00.png
添加一个Admin用户,名称随便,密码随便,角色选择Admin
aee487dd6081fc6238183bf4dace58cd.png
添加完之后刷新Users列表会看到该用户,接下来配置hosts
8a15c6faf6e772bf318e3228e63672fa.png
新建一个testhost,然后点击testhost,进入host配置页面,在Permissions选项中添加admin 的访问权限
a14dab777bc273c20cc8967401a75dcb.png
回到Users页面可以看到如上的列表,至此RabbitMQ配置完成

TIPS:上述操作也可以通过命令行来完成

查看所有用户

rabbitmqctl list_users

添加一个用户

rabbitmqctl add_user admin 123456

配置权限

rabbitmqctl set_permissions -p "/" admin ".*" ".*" ".*"

查看用户权限

rabbitmqctl list_user_permissions admin

设置tag

rabbitmqctl set_user_tags admin administrator

删除用户(安全起见,删除默认用户)

rabbitmqctl delete_user guest

4afd7a6a7e769037420a0ee0f96f6533.png

4. 先了解一下RabbitMQ的队列形式

在使用RabbitMQ之前,咱们先捋一捋RabbitMQ一共有几种使用方式,常用的5中队列

e20992a57df99c36de16e2b0914e40b4.png
  • 第一种:简单队列(一对一模式)耦合性高,生产消费一一对应。
  • 第二种:WorkQueues(工作队列),一个生产,多个消费者共同处理消息。
  • 第三种:订阅模式,1一个生产者多个消费者,每一个消费者有自己的一个队列,生产者直接将消息发送给交换机,交换机将消息发送给队列,每一个队列都需要绑定到交换机。这种模式可以满足消费者发布一个消息,多个消费者消费同一信息的需求,但C1、C2消费的都是相同的数据,有时我们需要C1和C2消费的信息只有部分差异,比如我们需求:C1消费增加的数据,C2消费编辑、增加和删除的数据。
  • 第四种:路由模式,路由模式是在订阅模式基础上的完善,可以在生产消息的时候,加入Key值,与key值匹配的消费者消费信息。但路由模式中,就如三中提到的C1、C2、如果C2对应的类型更多,就需要写很多key值。但其实它只与C1有一点差别。
2ae92f4755c6a8f26cb45e243b61f739.png
  • 第五种:通配符模式是在路由模式的升级,他允许key模糊匹配。*代表一个词,#代表一个或多个词。通过通配符模式我们就可以将C1对应的一个key准确定为item.add。而C2我们就不需要一一写出key值,而是用item.#代替即可。
c47659c2621b66f727948f7ed72f3436.png

5. .net Core3.1如何优雅的使用RabbitMQ

2d8826e646cebf6f9837534b9180c11e.png
新建控制台应用程序,引入RabbitMQ.Client包

创建生产者

using RabbitMQ.Client;
using System;
using System.Text;namespace RabbitMQTest
{///

/// 生产者/// class Program{static void Main(string[] args){//创建连接工厂ConnectionFactory factory = new ConnectionFactory{UserName = "admin",//用户名Password = "lmt456123",//密码HostName = "localhost"//rabbitmq ip};//创建连接var connection = factory.CreateConnection();//创建通道var channel = connection.CreateModel();//声明一个队列channel.QueueDeclare("hello", false, false, false, null);Console.WriteLine("nRabbitMQ连接成功,请输入消息,输入exit退出!");string input;do{input = Console.ReadLine();var sendBytes = Encoding.UTF8.GetBytes(input);//发布消息channel.BasicPublish("", "hello", null, sendBytes);}while (input.Trim().ToLower() != "exit");channel.Close();connection.Close();}}
}

创建一对一消费者

using RabbitMQ.Client;
using RabbitMQ.Client.Events;
using System;
using System.Text;namespace RabbitMQConsumer
{///

/// 消费者/// class Program{static void Main(string[] args){//创建连接工厂ConnectionFactory factory = new ConnectionFactory{UserName = "admin",//用户名Password = "lmt456123",//密码HostName = "localhost"//rabbitmq ip};//创建连接var connection = factory.CreateConnection();//创建通道var channel = connection.CreateModel();//事件基本消费者EventingBasicConsumer consumer = new EventingBasicConsumer(channel);//接收到消息事件consumer.Received += (ch, ea) =>{string message = Encoding.Default.GetString(ea.Body.ToArray());Console.WriteLine($"收到消息: {message}");// Console.WriteLine($"收到该消息[{ea.DeliveryTag}] 延迟10s发送回执");// Thread.Sleep(10000);//确认该消息已被消费channel.BasicAck(ea.DeliveryTag, false);// Console.WriteLine($"已发送回执[{ea.DeliveryTag}]");};//启动消费者 设置为手动应答消息channel.BasicConsume("hello", false, consumer);Console.WriteLine("消费者已启动");Console.ReadKey();channel.Dispose();connection.Close();}}
}

启动程序并测试

f5a6c4845b3bdcbc4515c3b8e3610585.png

一对一的消费队列咱们就此创建完成,下一节开始RabbitMQ的高级用法



推荐阅读
  • 并发编程 12—— 任务取消与关闭 之 shutdownNow 的局限性
    Java并发编程实践目录并发编程01——ThreadLocal并发编程02——ConcurrentHashMap并发编程03——阻塞队列和生产者-消费者模式并发编程04——闭锁Co ... [详细]
  • 数据库内核开发入门 | 搭建研发环境的初步指南
    本课程将带你从零开始,逐步掌握数据库内核开发的基础知识和实践技能,重点介绍如何搭建OceanBase的开发环境。 ... [详细]
  • 本文介绍了Java并发库中的阻塞队列(BlockingQueue)及其典型应用场景。通过具体实例,展示了如何利用LinkedBlockingQueue实现线程间高效、安全的数据传递,并结合线程池和原子类优化性能。 ... [详细]
  • 本文详细介绍了 Dockerfile 的编写方法及其在网络配置中的应用,涵盖基础指令、镜像构建与发布流程,并深入探讨了 Docker 的默认网络、容器互联及自定义网络的实现。 ... [详细]
  • 深入解析Spring Cloud Ribbon负载均衡机制
    本文详细介绍了Spring Cloud中的Ribbon组件如何实现服务调用的负载均衡。通过分析其工作原理、源码结构及配置方式,帮助读者理解Ribbon在分布式系统中的重要作用。 ... [详细]
  • 本文深入探讨了Linux系统中网卡绑定(bonding)的七种工作模式。网卡绑定技术通过将多个物理网卡组合成一个逻辑网卡,实现网络冗余、带宽聚合和负载均衡,在生产环境中广泛应用。文章详细介绍了每种模式的特点、适用场景及配置方法。 ... [详细]
  • 微软Exchange服务器遭遇2022年版“千年虫”漏洞
    微软Exchange服务器在新年伊始遭遇了一个类似于‘千年虫’的日期处理漏洞,导致邮件传输受阻。该问题主要影响配置了FIP-FS恶意软件引擎的Exchange 2016和2019版本。 ... [详细]
  • 本文探讨了如何在日常工作中通过优化效率和深入研究核心技术,将技术和知识转化为实际收益。文章结合个人经验,分享了提高工作效率、掌握高价值技能以及选择合适工作环境的方法,帮助读者更好地实现技术变现。 ... [详细]
  • 本文详细介绍了网络存储技术的基本概念、分类及应用场景。通过分析直连式存储(DAS)、网络附加存储(NAS)和存储区域网络(SAN)的特点,帮助读者理解不同存储方式的优势与局限性。 ... [详细]
  • 优化Flask应用的并发处理:解决Mysql连接过多问题
    本文探讨了在Flask应用中通过优化后端架构来应对高并发请求,特别是针对Mysql 'too many connections' 错误的解决方案。我们将介绍如何利用Redis缓存、Gunicorn多进程和Celery异步任务队列来提升系统的性能和稳定性。 ... [详细]
  • 随着网络安全威胁的不断演变,电子邮件系统成为攻击者频繁利用的目标。本文详细探讨了电子邮件系统中的常见漏洞及其潜在风险,并提供了专业的防护建议。 ... [详细]
  • 本题探讨如何通过最大流算法解决农场排水系统的设计问题。题目要求计算从水源点到汇合点的最大水流速率,使用经典的EK(Edmonds-Karp)和Dinic算法进行求解。 ... [详细]
  • 本文作者分享了在阿里巴巴获得实习offer的经历,包括五轮面试的详细内容和经验总结。其中四轮为技术面试,一轮为HR面试,涵盖了大量的Java技术和项目实践经验。 ... [详细]
  • 本文详细介绍了Grand Central Dispatch (GCD) 的核心概念和使用方法,探讨了任务队列、同步与异步执行以及常见的死锁问题。通过具体示例和代码片段,帮助开发者更好地理解和应用GCD进行多线程开发。 ... [详细]
  • docker镜像重启_docker怎么启动镜像dock ... [详细]
author-avatar
huaxingwu
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有