.net 环境使用 RabbitMQ ,由浅入深 【一】
最近因为先开发的项目需要用到消息队列,因此捣鼓了一下市面上开源的消息队列。
原本听闻Rocketmq ,一开始用的是 RocketMQ,各种集群搭建完毕,消息发送什么的测试后,,但是结果因为 RocketMQ没有官方支持的.net客户端(第三方的不太好用,比如不支持轨迹),并且我发现消息好像还不能单条确认?
后来又捣鼓RabbitMQ,这个RabbitMq有官方.net 客户端,光这一条我就选了RabbitMQ(我的渣渣系统对性能还没有这么高的要求,只要是社区活跃度可以的我相信都够支撑我的系统,好用才是最关键)
这篇文章会写一个RabbitMQ的小系列,从最简单的上手到后面结合实际业务做东西。
先描述一下我消息队列的使用场景,我系统需要监听当订单下达后,商品库存减少的事件后,做出一定事情。比如:
当商品库存发生变动,通知到各个消费者,包括但不限于以下消费者:
1、当库存变动后,根据情况调价,根据当前剩余库存和销售率,对商品价格做出一定调整。
2、当库存变动后,调整该商品对应的第三方仓储的库存数量。
这是典型一个发布与订阅模式,大概就是2个消费者订阅同一种消息,消费者之间的业务互相不影响,只要事件发生后,通知到消费者即可。这两个步骤如果放到订单下单的流程同步做,估计要被老板打死吧
现在,用RabbitMQ来实现发布一条消息,2个消费者收到。
因为这篇文章是由浅入深,所以,这篇主要是发出消息,2个消费者收到消息,不说任何关于MQ的概念,那些什么交换机,什么路由键,都不解释,解释多了,反倒容易吓退新手,我现在也是新手,当时我从RocketMQ转RabbitMQ被名词绕晕,诚然理解各种概念非常重要,但是我想让使用者先看到效果,然后由效果返回去理解概念,可能会更容易接受。因此我会尽量用最少的代码发出一条消息并且被订阅消费。
第一步是搭建环境,这个百度一搜一大堆,不是我这篇文章的重点,可以参考这篇文章 https://www.cnblogs.com/zhuwenjoyce/p/13236839.html ,非常简单。
如果按上面文章搞完了以后,访问 http://127.0.0.1:15672/ 将会出现一个登录页面,用户名和密码都是 guest。登录后如图,这个我先称为 消息控制台
接下来,需要对RabbitMQ做一定配置(网上基本上所有文章都是代码配置交换机、队列(先别管这个名词),我觉得会扰乱新手,给新手造成一定的困境),所以我会先让大家用消息控制台来配置。
比如下图是我截的其他教程的文章。相信很多人看了会疑惑,一下子bind一下daclare的,新手看了又要开始各种百度这个代码是干嘛的了。所以我不用代码配置这些,尽量用两三行代码就能收消息
以下步骤,有不明白的名词先别去想,先跟着做,能发消息能收消息再来思考,后面的文章会详细介绍概念,这篇文章的重点是先看到效果,后面再返回去思考。
第一步:到消息控制台配置队列,点击消息控制台的 Queues ,然后 Add a new queue 有输入框,在name处输入 stockChange.priceSet,其他保持默认,左下角点击“Add queue”
然后再继续添加一个 stockChange.stockUpdate ,这两个队列,代表2个消费者,一个消费者负责库存变动后改价,一个消费者负责库存变动后修改第三方仓储的库存。
第二步:到消息控制台配置交换机,点击消息控制台上的 "Exchange"标签 可以看到列表下面有一个 Add a new exchange,在 name处输入 bookErp.stockChange.franout ,type 改为 fanout
其他保持默认,点击左下角的 Add exchange 按钮,这个时候页面上应该出现和我类似的列表了,确保有我画红色框的那个(忽略我列表上其他的,因为写这个文章的时候我懒得去删除多余的了)
第三步:绑定交换机与队列的关系。点击刚刚列表上的 bookErp.stockChange.franout ,出现另外一个界面 ,在 Add bingding from this exchange 中的 To Queue 输入框中输入:
stockChange.priceSet,然后点击 "Bind" 按钮,添加完了一条绑定记录,然后继续添加一条为 stockChange.stockUpdate 的记录,添加完了以后你将看到如下:
以上便完成了 “库存变更” 这个事件对应 2个消费者的使用场景。现在写代码,写2个消费者代码。因为现在不涉及业务逻辑,就打印消息而已,我就不写2份代码,写一份,启动2次,以不同字符串来区分是两个不同消费者
打开vs2019,新建一个 .net framework 的控制台程序。打开nuget搜 RabbitMQ.client ,安装第一个。安装完毕后
在 Program.cs 的类中加入如下两个方法
/// <summary>
/// 连接配置
/// </summary>
private static readonly ConnectionFactory rabbitMqFactory = new ConnectionFactory()
{
HostName = "127.0.0.1",
UserName = "guest",
Password = "guest",
Port = 5672,
VirtualHost = "/"
};
/// <summary>
/// 基于事件的,当消息到达时触发事件,获取数据
/// </summary>
public static void DirectAcceptExchangeEvent(string queueName)
{
using (IConnection conn = rabbitMqFactory.CreateConnection())
{
using (IModel channel = conn.CreateModel())
{
Console.WriteLine("开始监听队列:" + queueName);
var consumer = new EventingBasicConsumer(channel);
consumer.Received += (model, ea) =>
{
var msgBody = Encoding.UTF8.GetString(ea.Body.ToArray());
var msgProps = ea.BasicProperties;
Console.WriteLine(string.Format("***接收时间:{0},消息内容:{1}", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"), msgBody)); //deliveryTag 传递标签,ulong 类型.它的范围隶属于每个信道.因此必须在收到消息的相同信道上确认.不同的信道将导致“未知的传递标签”协议异常并关闭通道.
//multiple 确认一条消息还是多条.false 表示只确认 e.DelivertTag 这条消息,true表示确认 小于等于 e.DelivertTag 的所有消息
channel.BasicAck(deliveryTag: ea.DeliveryTag, multiple: false); };
channel.BasicConsume(queueName, autoAck: false, consumer: consumer);
Console.WriteLine("按任意值,退出程序");
Console.ReadKey();
}
}
}
接下来在Main方法中执行如下代码
static void Main(string[] args)
{
Console.WriteLine("请输入要监听的队列名");
string queueName = Console.ReadLine(); DirectAcceptExchangeEvent(queueName); Console.ReadLine();
}
编译一下,去找到 debug目录下的 exe 文件运行,提示你输入队列名字 stockChange.priceSet ,按回车。然后别动,再运行一个 exe ,输入 stockChange.stockUpdate,按回车。
这个时候,你作为2个不同消费者,监听了库存变更这个事件,可以执行不同的业务逻辑。
现在去我们web控制台发消息,就是刚刚你配置MQ的地方。打开exchange,出现列表,点击 bookErp.stockChange.franout ,页面刷新后,在 Publish message 下面的 Payload 输入框里面输入 123 ,点击“Publish message” 按钮,这个时候去看你刚刚运行的控制台,将发现消息被打印在控制台了。如下图:
如果放到现实场景,你可能就是post一个json字符串,里面包含商品的skuId、当前库存等信息,然后消费者拿到后自己去做自己的事
以上就实现了一个事件,2个消费者一起监听,自己各自做自己的业务逻辑。
实际使用的话就是把发消息从web控制台上改为代码发消息即可了。
相比网上其他教程,我将RabbitMQ配置交换机、消息队列、路由键等操作放在了web控制台,代码只做最简单的监听而不配置MQ,便于大家理解。
实际使用也是可以先手动配置好,代码只监听和发消息。
下一篇,我开始结合这一篇涉及的名词,来解释它到底是怎么运行的。
.net 环境使用 RabbitMQ ,由浅入深 【一】的更多相关文章
- RabbitMQ由浅入深入门全总结(一)
写在最前面 距离上一次发文章已经很久了,其实这段时间一直也没有停笔,只不过在忙着找工作还有学校结课的事情,重新弄了一下博客,后面也会陆陆续续会把文章最近更新出来~ 这篇文章有点长,就分了两篇Q PS: ...
- RabbitMQ由浅入深入门全总结(二)
写在最前面 距离上一次发文章已经很久了,其实这段时间一直也没有停笔,只不过在忙着找工作还有学校结课的事情,重新弄了一下博客,后面也会陆陆续续会把文章最近更新出来~ 这篇文章有点长,就分了两篇 PS:那 ...
- 分布式环境下rabbitmq发布与订阅端
假设rabbitmq配置了集群,且客户端连接rabbitmq-server通过lvs实现HA但一般情况下不建议做LB.在分布式系统的环境下,由于节点的非预知性,使用spring amqp模板进行配置不 ...
- [转]centos7环境安装rabbitMQ
使用专业的消息队列产品rabbitmq之centos7环境安装 http://www.cnblogs.com/huangxincheng/p/6006569.html CentOS7上安装Rabbit ...
- Linux & Windows 环境下 RabbitMQ 安装与基本配置
索引: 目录索引 参看代码 GitHub: rabbitmq.txt 一.Linux (DeepinOS) 环境 .安装: sudo apt install rabbitmq-server .进入目录 ...
- RabbitMQ学习笔记一:本地Windows环境安装RabbitMQ Server
一:安装RabbitMQ需要先安装Erlang语言开发包,百度网盘地址:http://pan.baidu.com/s/1jH8S2u6.直接下载地址:http://erlang.org/downloa ...
- centos7环境安装rabbitMQ
使用专业的消息队列产品rabbitmq之centos7环境安装 http://www.cnblogs.com/huangxincheng/p/6006569.html [源码安装,适用GNOME + ...
- Window环境下RabbitMQ的安装和配置教程
一.安装 首先,RabbitMQ基于Erlang语言环境,所以需要先安装Erlang. Erlang下载地址:http://www.erlang.org/downloads 按照安装程序默认安装完成就 ...
- Linux环境下 RabbitMQ 的下载与安装
0 环境 CentOS7 RabbitMQ 3.6.5 erlang 18.3 socat rabbitmq是使用erlang语言编写的,所以需要先安装erlang,其次rabbitmq安装依赖于so ...
- Java开发环境之RabbitMQ
查看更多Java开发环境配置,请点击<Java开发环境配置大全> 捌章:RabbitMQ安装教程 1)下载安装Erlang 官网下载:http://www.erlang.org,有时比较难 ...
随机推荐
- 韦东山freeRTOS系列教程之【第十章】软件定时器(software timer)
目录 系列教程总目录 概述 10.1 软件定时器的特性 10.2 软件定时器的上下文 10.2.1 守护任务 10.2.2 守护任务的调度 10.2.3 回调函数 10.3 软件定时器的函数 10.3 ...
- C# 语言笔记
1. C# 初识 因为先前已经学过 C++ 了,所以在C# 的学习中,大多只记录和 C++ 不同的点,在学习的过程中,感谢刘铁猛老师的教程,您是我C# 入门的领路人. 1.1 使用 .net cli ...
- 面试官:Dubbo一次RPC请求经历哪些环节?
大家好,我是三友~~ 今天继续探秘系列,扒一扒一次RPC请求在Dubbo中经历的核心流程. 本文是基于Dubbo3.x版本进行讲解 一个简单的Demo 这里还是老样子,为了保证文章的完整性和连贯性,方 ...
- 使用vxe-table组件,控制台报错:缺少必要的“{0}”参数,这可能会导致出现错误
这是由于使用vxe表格,给列属性设置 type="html" 只需要开启存,需要启用column-config.useKey与row-config.useKey就可以了
- 基于Java网络书店商城设计实现(源码+lw+部署文档+讲解等)
系统介绍: 随着科学技术的飞速发展,各行各业都在努力与现代先进技术接轨,通过科技手段提高自身的优势:对于网络书店商城当然也不能排除在外,随着网络技术的不断成熟,带动了网络书店商城,它彻底改变了过去传统 ...
- AT_arc041_b 题解
洛谷链接&Atcoder 链接 本篇题解为此题较简单做法及较少码量,并且码风优良,请放心阅读. 题目简述 给定一个 \(N \times M\) 的矩阵,此矩阵的每一个元素都向上.下.左.右 ...
- PointNet笔记
可能遇到的问题 在windows上运行pointnet的代码时,可能会遇到一些问题: 1.比如提示OSError: no file with expected extension, 这是因为可视化的s ...
- OI生涯回忆&退役之后
一个人的命运啊,当然要靠自我奋斗,但是也要考虑到历史的进程 --<庄子·秋水> 好吧,现在是2024年7月24日,我现在正坐在某编程机构的办公室电脑旁,写下这些文字,是啊,我已经退役将近两 ...
- 关于SpringBoot中事务回滚没有生效
在SpringBoot中,事务回滚可以用注解@Transactional标识. Spring声明式事务管理默认对非检查型异常和运行时异常进行事务回滚,而对检查型异常则不进行回滚操作. 1.非检查型异常 ...
- ADB:移动端专项测试必备神器!!
01 Android调试桥 (adb) Android调试桥 (adb) 是一种功能多样的命令行工具,可让您与设备进行通信. adb命令可用于执行各种设备操作(例如安装和调试应用),并提供对Unix ...