它让你1小时精通RabbitMQ消息队列、且能扛高并发
支持.Net Core(2.0及以上)与.Net Framework(4.5及以上)
本文所述方案近期被江苏省某亿级数据量+高并发的政府"物联网"项目采用,获得圆满成功!!
【目录】
发送消息、获取消息、使用消息
延时队列 & 死信队列
展望
RabbitMQ作为一款主流的消息队列工具早已广受欢迎。相比于其它的MQ工具,RabbitMQ支持的语言更多、功能更完善。
1.发送消息、获取消息、使用消息
本文提供一种市面上最/极简单的使用RabbitMQ的方式,只需要会调用以下三个方法,你就几乎可以掌握整个RabbitMQ的使用:
(1) SendMessage,发送一个消息
(2) GetMessage,获取一个消息
(3) UseMessage,使用一个消息(连续使用)
为了调用以上三个方法,首先需要从NuGet引用DeveloperSharp.RabbitMQ包。
然后,对RabbitMQ消息服务器的链接信息进行配置(分.Net Core与.Net Framework两种情况):
若是在.Net Core环境下,你则需要在appsettings.json文件中添加“DeveloperSharp.RabbitMQ”节点(如下配置示例),并把appsettings.json文件放到程序执行目录中(即bin目录下与dll、exe等文件的同一目录中)(放错了位置会报错)
{
"DeveloperSharp.RabbitMQ":[{
"HostName":"135.208.12.236",
"UserName":"sa",
"Password":"aevin.gang",
"Port":5672
}]
}
若是在.Net Framework环境下,你则需要在App.config/Web.config里面添加如下配置:
<appSettings>
<add key="RabbitMQConnectionString" value="hostName=135.208.12.236,port=5672,userName=sa,password=aevin.gang" />
</appSettings>
说明:上述配置中分别设置了RabbitMQ应用所在的服务器IP地址hostName、端口port、用户名userName、密码password(请把这四项的对应值修改成你自己那边的RabbitMQ的对应值)
下面,我们给出一个使用了上述SendMessage、GetMessage、UseMessage三个方法的示例。该示例的功能说明如下:
- 先向RabbitMQ服务器上名为“aa”的队列发送了5个消息,
- 然后从RabbitMQ服务器上的“aa”队列中获取,并打印出第1个消息,
- 最后再连续从RabbitMQ服务器上的“aa”队列中获取剩余4个消息,并把它们写入名为fj.txt的文件。
代码如下:
using DeveloperSharp.RabbitMQ;
-------------------------- static void Main(string[] args)
{
//发送5个消息(使用SendMessage)
RabbitMQHelper.SendMessage("aa", "世界1,你好!");
RabbitMQHelper.SendMessage("aa", "世界2,你好!");
RabbitMQHelper.SendMessage("aa", "世界3,你好!");
RabbitMQHelper.SendMessage("aa", "世界4,你好!");
RabbitMQHelper.SendMessage("aa", "世界5,你好!"); //获取1个消息(使用GetMessage)
string OneMessage = RabbitMQHelper.GetMessage("aa").Message;
Console.WriteLine(OneMessage); //向fj.txt这个文本文件中写入4个消息(使用UseMessage)
RabbitMQHelper.UseMessage("aa", t =>
{
System.IO.File.AppendAllText("D:/fj.txt", t.Message);
return true;
});
}
运行结果如下:
【控制台显示出】:世界1,你好!
【fj.txt文件中显示出】:世界2,你好!世界3,你好!世界4,你好!世界5,你好!
(上述示例中,由于SendMessage是同步方法,故“世界1,你好!”~“世界5,你好!”会按顺序显示。若我们把SendMessage方法全部改为异步的SendMessageAsync,则显示结果将不再是按顺序来的,很有可能显示成类似这样:“世界3,你好!世界1,你好!世界5,你好!世界2,你好!世界4,你好!”)
三个方法的详细功能说明(辅助参考):
(1)发送一个消息
void SendMessage(string QueueName, string Message, Dictionary<string, object> Header = null)
//异步方法:SendMessageAsync (2)获取一个消息
RabbitMQMessage GetMessage(string QueueName)
//异步方法:GetMessageAsync (3)使用一个消息(连续使用)
void UseMessage(string QueueName, Func<RabbitMQMessage, bool?> Use)
//异步方法:UseMessageAsync
附加说明:
(I)Use返回值为true时,代表当前消息已被有效处理并会被服务器删除。然后程序自动进入下一条消息的使用。
若Use返回值为false时,代表当前消息未被有效处理但仍会被服务器删除。然后程序自动进入下一条消息的使用。
若Use返回值为null时,代表当前消息会被服务器重新队列分配到其它可用的实例上再处理。然后程序自动进入下一条消息的使用。
若Use内部发生未被处理的异常,程序会停止。
(II)RabbitMQMessage对象定义如下:
public class RabbitMQMessage
{
public string Message;
public IDictionary<string, object> Header;
public string Id; //此处系统自动生成的Id是分布式唯一Id。
}
2.延时队列 & 死信队列
有些场景下,我们希望为使用的消息设定有效期。在有效期内,这些消息有效可用;但过期后,这些消息将变得无效不可用,同时,它们还将自动被丢弃进一个称之为“死信”的队列。
为了说明这些概念,我们还是来举一个具体的例子。该例子的功能说明如下:
- 首先,在RabbitMQ服务器上定义一个名为"bbq"、且其中存放的消息会在60秒后过期失效的队列。
- 然后,在RabbitMQ服务器上定义一个与"bbq"队列对应的死信队列。并连续从该死信队列中获取消息并把它们写入名为BB.txt的文件。
- 最后,向RabbitMQ服务器上的"bbq"队列发送3个消息。
代码如下:
using DeveloperSharp.RabbitMQ;//从NuGet引用DeveloperSharp.RabbitMQ包
-------------------------- //定义bbq队列,其中存放的消息会在60秒后过期
var myQ = RabbitMQHelper.SetQueue("bbq", 60000); //定义与bbq队列对应的死信队列
var expQ = RabbitMQHelper.GetQueue("bbq");
//向BB.txt这个文本文件中连续写入死信队列中的消息
expQ.UseMessage(t =>
{
System.IO.File.AppendAllText("D:/BB.txt", t.Message);
return true;
}); //向bbq队列发送3个消息
myQ.SendMessage("jinA");
myQ.SendMessage("jinB");
myQ.SendMessage("jinC"); /*
//【附加题】:若去掉注释让此语句执行,死信队列中将不会获得消息(为啥?自己推理)
RabbitMQHelper.UseMessage("bbq", t =>
{
return true;//若此处返回false,死信队列将会获得消息
});
*/
运行以上程序:
60秒之内,【BB.txt文件】中没有内容
60秒以后,【BB.txt文件】中显示出:jinAjinBjinC
通过以上例子,我们可简单预测一下,延时队列&死信队列常用在“限时消费”、“过期处理”等场景。生活中最常见示例如:订单请在10分钟内支付完毕、等等之类功能...
(其它说明:为了演示便利,文本前面给出的几个代码示例中,把SendMessage、GetMessage、UseMessage三个方法都放到了同一段代码程序中,这样做不好,偶尔会造成一些资源冲突。在实际使用中,最好是把它们分开分别放到三段不同的代码程序中,以获取最佳效果。比如:三个按钮,之类...)
使用消息服务对解耦分布式系统、实现发布/订阅、提高系统性能、等方面都有巨大用处,相信本文会扩展你的思维认知,让你在相关技术解决方案上有更多灵活思路+联想空间!
原文链接:http://www.developersharp.cc/content12.html
结尾
下面是我的公众号,里面有很多高价值技术文章,是你刻苦努力也积累不到的经验,能助力个人快速成长。
你也可以加入我们(添加微信:894988403,备注“进群”),向大佬学习,探行业内幕,享时代机遇。

它让你1小时精通RabbitMQ消息队列、且能扛高并发的更多相关文章
- 它让你1小时精通RabbitMQ消息队列(新增死信处理)
支持.NET/.NET Framework/.NET Core RabbitMQ作为一款主流的消息队列工具早已广受欢迎.相比于其它的MQ工具,RabbitMQ支持的语言更多.功能更完善. 本文提供一种 ...
- RabbitMQ消息队列(十)-高可用集群部署实战
前几章讲到RabbitMQ单主机模式的搭建和使用,我们在实际生产环境中出于对性能还有可用性的考虑会采用集群的模式来部署RabbitMQ. RabbitMQ集群基本概念 Rabbit模式大概分为以下三种 ...
- RabbitMQ消息队列(一): Detailed Introduction 详细介绍
http://blog.csdn.net/anzhsoft/article/details/19563091 RabbitMQ消息队列(一): Detailed Introduction 详细介绍 ...
- RabbitMQ消息队列1: Detailed Introduction 详细介绍
1. 历史 RabbitMQ是一个由erlang开发的AMQP(Advanced Message Queue )的开源实现.AMQP 的出现其实也是应了广大人民群众的需求,虽然在同步消息通讯的世界里有 ...
- (转)RabbitMQ消息队列(九):Publisher的消息确认机制
在前面的文章中提到了queue和consumer之间的消息确认机制:通过设置ack.那么Publisher能不到知道他post的Message有没有到达queue,甚至更近一步,是否被某个Consum ...
- (转)RabbitMQ消息队列(七):适用于云计算集群的远程调用(RPC)
在云计算环境中,很多时候需要用它其他机器的计算资源,我们有可能会在接收到Message进行处理时,会把一部分计算任务分配到其他节点来完成.那么,RabbitMQ如何使用RPC呢?在本篇文章中,我们将会 ...
- (转)RabbitMQ消息队列(六):使用主题进行消息分发
在上篇文章RabbitMQ消息队列(五):Routing 消息路由 中,我们实现了一个简单的日志系统.Consumer可以监听不同severity的log.但是,这也是它之所以叫做简单日志系统的原因, ...
- (转)RabbitMQ消息队列(四):分发到多Consumer(Publish/Subscribe)
上篇文章中,我们把每个Message都是deliver到某个Consumer.在这篇文章中,我们将会将同一个Message deliver到多个Consumer中.这个模式也被成为 "pub ...
- RabbitMQ消息队列应用
RabbitMQ消息队列应用 消息通信组件Net分布式系统的核心中间件之一,应用与系统高并发,各个组件之间解耦的依赖的场景.本框架采用消息队列中间件主要应用于两方面:一是解决部分高并发的业务处理:二是 ...
- RabbitMQ消息队列(四):分发到多Consumer(Publish/Subscribe)
上篇文章中,我们把每个Message都是deliver到某个Consumer.在这篇文章中,我们将会将同一个Message deliver到多个Consumer中.这个模式也被成为 "pub ...
随机推荐
- 微信小程序 WXSS模板样式,全局和页面配置,网络请求
[黑马程序员前端微信小程序开发教程,微信小程序从基础到发布全流程_企业级商城实战(含uni-app项目多端部署)] https://www.bilibili.com/video/BV1834y1676 ...
- 打开页面就能玩?ZEGO 发布行业首套 Web 端在线 KTV 解决方案
近些年,在线K歌行业逐渐开始规模化发展,活跃用户不断破新高,据 ZEGO 即构科技研究院数据显示,2021 年中国在线 K 歌用户规模逾 5.2亿,网民渗透率达到 50%. 凭借着极大的便利性和娱乐性 ...
- 工作笔记--简单网线连接,使另一台设备通过笔记本电脑的wifi上网
条件 笔记本电脑能够通过 wifi 上网 另一台与笔记本电脑网线连接正常 配置固定 ip,使之可以互相 ping 通 操作 点击右下角 wifi 图标,点击[网络和 Internet 设置] 在高级网 ...
- 超越.NET极限:我打造的高精度数值计算库
超越.NET极限:我打造的高精度数值计算库 还记得那一天,我大学刚毕业,紧张又兴奋地走进人生第一场.NET工作面试.我还清楚地记得那个房间的气氛,空调呼呼地吹着,面试官的表情严肃而深沉.我们进行了一番 ...
- [nginx]lua控制响应头
前言 适用场景:添加CDN缓存时间.操作set-cookie.标记业务数据类型等. 获取响应头 指令:ngx.resp.get_headers 语法:headers = ngx.resp.get_he ...
- 使用ClamAV进行linux病毒扫描
前言 ClamAV是一个在命令行下查毒(并非杀毒)的软件,其免费开源跨平台.ClamAV默认只能查出服务器内的病毒,但是无法清除,最多删除. 安装ClamAV yum install -y epel- ...
- javascript创建数组
javascript数组:var array=[ ]等于创建一个数组 array[0]代表给数组的第一个位置上赋值,值为32 array[5]代表给数组的第六位置上赋值.值为3 在位置0,1,2,5位 ...
- 图加速数据湖分析-GeaFlow和Apache Hudi集成
表模型现状与问题 关系模型自1970年由埃德加·科德提出来以后被广泛应用于数据库和数仓等数据处理系统的数据建模.关系模型以表作为基本的数据结构来定义数据模型,表为二维数据结构,本身缺乏关系的表达能力, ...
- ctfshow--web入门--XXE
ctfshow--web入门--XXE web373 源码 <?php error_reporting(0); libxml_disable_entity_loader(false); //允许 ...
- GC的前置工作,聊聊GC是如何快速枚举根节点的
本文已收录至GitHub,推荐阅读 Java随想录 微信公众号:Java随想录 原创不易,注重版权.转载请注明原作者和原文链接 目录 什么是根节点枚举 根节点枚举存在的问题 如何解决根节点枚举的问题 ...