🏆 作者简介,愚公搬代码
🏆《头衔》:华为云特约编辑,华为云云享专家,华为开发者专家,华为产品云测专家,优快云博客专家,阿里云专家博主,腾讯云优秀博主,掘金优秀博主,51CTO博客专家等。
🏆《近期荣誉》:2022年优快云博客之星TOP2,2022年华为云十佳博主等。
🏆《博客内容》:.NET、Java、Python、Go、Node、前端、IOS、Android、鸿蒙、Linux、物联网、网络安全、大数据、人工智能、U3D游戏、小程序等相关领域知识。
🏆🎉欢迎 👍点赞✍评论⭐收藏
🚀前言
消息队列是一种应用程序间异步通信的方式。它通过一个存放消息的队列来解耦发送者和接收者的关系。发送者将消息直接发送到队列中,而接收者则从队列中取出消息进行处理。消息队列可以用于解决高并发、异步处理、流量削峰等问题。
RabbitMQ是一款开源的消息队列软件,它实现了AMQP(高级消息队列协议)标准,被广泛应用于分布式系统中。RabbitMQ可以通过安装在不同的机器上并通过网络连接来连接不同的应用程序,实现应用程序间的消息传递。RabbitMQ支持消息的持久化、多种交换机类型、多种队列类型、消息确认等特性,具有高可用性、高可靠性、高性能等特点,适用于各种类型的应用。
常见的消息队列工具包括:
-
RabbitMQ:开源的 AMQP(高级消息队列协议)的实现,支持多种语言,易于使用和扩展。
-
Apache Kafka:支持高吞吐量的分布式消息系统,可用于构建实时数据管道和流处理应用程序。
-
Apache ActiveMQ:基于 JMS(Java消息服务)的消息中间件,支持多语言、多协议和多种消息模型。
-
RocketMQ:阿里巴巴开源的消息中间件,支持分布式事务、高可靠性、高吞吐量的消息传输。
-
Redis 消息队列:Redis 可以通过发布-订阅模式实现消息队列,具有高速、可靠、易用的优点。
-
ZeroMQ:开源的消息传递库,支持多种通讯模式,可用于构建分布式系统和高性能通讯。
-
AWS SQS:Amazon 提供的托管消息队列服务,支持可扩展性、安全性和高可用性。
本文主要介绍DeveloperSharp的使用,DeveloperSharp是一个研发中大型项目必备的系统平台,也是一个低代码平台。
它主要包括了如下一些功能:
- 基于Sql语句、存储过程、事务、分页的数据库操作。并几乎支持市面上所有种类的数据库。
- 图片操作。裁剪、缩放、加水印。
- http请求调用(Post与Get)
- 高效分页
- Web服务/WebApi的负载均衡
- 数据库的负载均衡,以及读写分离
- CORS跨域访问
- UUID全球通用唯一识别码
- MQ消息队列(请另行使用DeveloperSharp.RabbitMQ包)
- Redis缓存(请另行使用DeveloperSharp.Redis包)
- “异种数据库”的负载均衡
- 其他相关功能
🚀一、RabbitMQ消息队列
🔎1.安装包
DeveloperSharp
🔎2.添加配置文件
在.Net Core环境下,要在appsettings.json文件中添加“DeveloperSharp.RabbitMQ”节点(如下配置示例),并把appsettings.json文件放到程序执行目录中(即bin目录下与dll、exe等文件的同一目录中)(放错了位置会报错)
{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft.AspNetCore": "Warning"
}
},
"AllowedHosts": "*",
"DeveloperSharp.RabbitMQ":[{
"HostName":"135.208.12.236",
"UserName":"sa",
"Password":"aevin.gang",
"Port":5672
}]
}
🔎3.基本使用
//发送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;
});
🔎4.延时队列&死信队列
延时队列是一种消息队列,可以在预定的时间后将消息传递给消费者。消息在进入队列时,需要设置一个延迟时间,队列会在这个时间过后再将消息发送给消费者。延迟队列通常用于需要延迟执行的任务,例如定时任务、重试机制等。
死信队列是一种特殊的队列,用于处理无法被消费的消息。当消息在被消费者处理时出现异常或超时等情况无法被消费时,队列将消息发送到死信队列中,以供后续处理。死信队列通常用于记录失败的消息、重试或丢弃无法处理的消息。
为了说明这些概念,我们还是来举一个具体的例子。该例子的功能说明如下:
-
首先,在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,死信队列将会获得消息
});
*/
🚀备注
(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具有UUID的特性。
}
(III)RabbitMQMessage.Header字典中,实际值为string类型的object值,需要通过字节转换才能变为字符串。
例如:Encoding.UTF8.GetString((byte[])p.Header["Content"])
一旦调用三个方法,会与RabbitMQ服务器建立“长链接”。若要结束“长链接”,可在“任务管理器”中杀死进程。
2.方法详解
3.方法详解
🚀感谢:给读者的一封信
亲爱的读者,
我在这篇文章中投入了大量的心血和时间,希望为您提供有价值的内容。这篇文章包含了深入的研究和个人经验,我相信这些信息对您非常有帮助。
如果您觉得这篇文章对您有所帮助,我诚恳地请求您考虑赞赏1元钱的支持。这个金额不会对您的财务状况造成负担,但它会对我继续创作高质量的内容产生积极的影响。
我之所以写这篇文章,是因为我热爱分享有用的知识和见解。您的支持将帮助我继续这个使命,也鼓励我花更多的时间和精力创作更多有价值的内容。
如果您愿意支持我的创作,请扫描下面二维码,您的支持将不胜感激。同时,如果您有任何反馈或建议,也欢迎与我分享。
再次感谢您的阅读和支持!
最诚挚的问候, “愚公搬代码”