
.netcore3.1 RabbitMq Lazy Queue
从RabbitMQ 3.6.0
开始,代理具有惰性队列
的概念-队列实际上将其内容尽早移至磁盘,并且仅在消费者要求时才将其内容加载到RAM(内存)
中,因此是Lazy
。
没有Lazy的出现了什么问题
惰性队列的主要目标之一是能够支持很长的队列(数百万条消息)。由于各种原因,队列可能会变得很长:
- 消费者离线/崩溃/需要维护
- 突然出现消息入侵高峰,生产者的速度超过了消费者
- 消费者比正常人慢
默认情况下,队列保留消息的内存缓存,该缓存在消息发布到RabbitMQ中时被填充。此缓存的想法是能够尽快将消息传递给使用者。请注意,持久性消息可以在它们进入代理时写入磁盘并同时保留在RAM中。
使用Lazy Queue + inMemory的方式
我们声明一个Lazy
队列,并在其中添加Int.MaxValue
条数据看看观察中图的内存变化与磁盘变化。
var factory = new ConnectionFactory()
{
HostName = "47.98.187.188",
UserName = "bob",
Password = "bob"
};
// 创建一个链接
using (var connection = factory.CreateConnection())
{
// 创建一个通道
using (var channel = connection.CreateModel())
{
// 声明一个Single_Active_Consumer_Queue队列
channel.QueueDeclare(
queue: "my_lazy_test",
durable: true,
exclusive: false,
autoDelete: false,
arguments: new Dictionary<string, object>() {
{ "x-queue-mode","lazy" }
});
for (int i = 0; i < int.MaxValue; i++)
{
var msg = Encoding.UTF8.GetBytes($"Publish Message {i}");
channel.BasicPublish(string.Empty, "my_lazy_test", null, msg);
Console.WriteLine($"Publish Message {i}");
}
Console.WriteLine(" Press [enter] to exit.");
Console.ReadLine();
}
}
我们刚开始内存截图大概是197
,然后逐渐升高到246
左右的时候,就升不上去了。网络的读写大概是在1Mib
左右,但写到磁盘的速度是6.35M/s
左右。是相当稳当的。最后清理一下消息。
使用Default Queue + inMemory的方式
这种模式不仅在内存上逐步升高,在内存急缺的情况下容易导致内存溢出的情况。
var factory = new ConnectionFactory()
{
HostName = "47.98.187.188",
UserName = "bob",
Password = "bob"
};
// 创建一个链接
using (var connection = factory.CreateConnection())
{
// 创建一个通道
using (var channel = connection.CreateModel())
{
// 声明一个Single_Active_Consumer_Queue队列
channel.QueueDeclare(
queue: "my_default_test",
durable: true,
exclusive: false,
autoDelete: false,
arguments: null);
for (int i = 0; i < int.MaxValue; i++)
{
var msg = Encoding.UTF8.GetBytes($"Publish Message {i}");
channel.BasicPublish(string.Empty, "my_default_test", null, msg);
Console.WriteLine($"Publish Message {i}");
}
Console.WriteLine(" Press [enter] to exit.");
Console.ReadLine();
}
}
我们看到内存
和CPU
是步步高升,这才1百万
条就感觉要残废的样子。
其他
建议大家使用的时候呢,最好是Lazy Queue
和Persistent
消息的持久化属性一起使用,效果会更好!
欢迎加群讨论技术,1群:677373950(满了,可以加,但通过不了),2群:656732739
评价
排名
2
文章
634
粉丝
44
评论
93
docker中Sware集群与service
尘叶心繁 : 想学呀!我教你呀
一个bug让程序员走上法庭 索赔金额达400亿日元
叼着奶瓶逛酒吧 : 所以说做程序员也要懂点法律知识
.net core 塑形资源
剑轩 : 收藏收藏
映射AutoMapper
剑轩 :
好是好,这个对效率影响大不大哇,效率高不高
一个bug让程序员走上法庭 索赔金额达400亿日元
剑轩 : 有点可怕
ASP.NET Core 服务注册生命周期
剑轩 :
http://www.tnblog.net/aojiancc2/article/details/167
ICP备案 :渝ICP备18016597号-1
网站信息:2018-2025TNBLOG.NET
技术交流:群号656732739
联系我们:contact@tnblog.net
公网安备:
50010702506256


欢迎加群交流技术