tnblog
首页
视频
资源
登录

.netcore3.1 RabbitMq MessageTTL,AutoExpire,MaxLength与MaxLengthBytes

6948人阅读 2021/1/31 16:08 总访问:3656945 评论:0 收藏:0 手机
分类: RabbitMq

.netcore3.1 RabbitMq MessageTTL,AutoExpire,MaxLength与MaxLengthBytes

关于上述的一些特定参数,我们都可以在UI中找到相关的参数。

Message TTL

简单来说发布到队列的消息在被丢弃之前可以存在的时间(毫秒)。但它的规则也分为Queue TTLMessage TTL,区别在于在该队列中所存在的时间与单个消息在队列中存在的时间。

Queue TTL

可以通过使用策略设置message-ttl参数 或在队列声明时指定相同的参数来为给定队列设置消息TTL。
队列中已存在时间超过配置的TTL的消息被认为已死。请注意,路由到多个队列的消息可以在它所驻留的每个队列中的不同时间死亡,或者根本不消失。一个队列中消息的死亡不会影响其他队列中同一消息的寿命。
服务器保证不发送死消息不会使用basic.deliver(发送给使用者)或包含在basic.get-ok响应中(用于一次性提取操作)。此外,服务器将尝试在基于TTL的到期时间或之后删除消息。
TTL参数或策略的值必须是非负整数(0 <= n),以毫秒为单位描述TTL周期。因此,值为1000意味着添加到队列中的消息将在队列中保留1秒钟,或者直到将其传递给使用者为止。参数可以是AMQP 0-9-1类型short-short-intshort-intlong-intlong-long-int

使用策略为队列定义消息TTL

要使用策略指定TTL,请将键message-ttl添加到策略定义中(这会将60秒的TTL应用于所有队列。):

rabbitmqctl rabbitmqctl set_policy TTL “.*” ‘{“message-ttl”:60000}’ —apply-to queues
rabbitmqctl (Windows) rabbitmqctl set_policy TTL “.*” “{“”message-ttl””:60000}” —apply-to queues

Queue TTL Demo

下面我将以一个小Demo为大家演示一下,在下列代码中我将创建一个消息只可存活12秒的MyTTLQueue队列

  1. var factory = new ConnectionFactory()
  2. {
  3. HostName = "127.0.0.1",
  4. UserName = "bob",
  5. Password = "bob"
  6. };
  7. // 创建一个链接
  8. using (var connection = factory.CreateConnection())
  9. {
  10. // 创建一个通道
  11. using (var channel = connection.CreateModel())
  12. {
  13. // 创建x-message-ttl为6秒的参数
  14. var arguments = new Dictionary<string,object>();
  15. arguments.Add("x-message-ttl",12000);
  16. // 创建一个消息只可以存活6秒的队列
  17. channel.QueueDeclare(
  18. queue: "MyTTLQueue",
  19. durable: true,
  20. exclusive: false,
  21. autoDelete: false,
  22. arguments: arguments);
  23. // 发布一个新消息
  24. channel.BasicPublish(
  25. exchange: string.Empty,
  26. routingKey: "MyTTLQueue",
  27. basicProperties: null,
  28. body: Encoding.UTF8.GetBytes("新消息")
  29. );
  30. Console.WriteLine("Finish");
  31. Console.ReadLine();
  32. }
  33. }


我们很容易的发现消息在12秒后将自动被队列清理掉了

Message TTL

通过在发送basic.publish时在基本AMQP 0-9-1类中 设置expiration字段,可以基于每个消息指定TTL 。
到期字段的值描述了TTL周期(以毫秒为单位)。适用与x-message-ttl相同的约束 。由于 到期字段必须是字符串,因此代理将(仅)接受数字的字符串表示形式。
当同时指定了每个队列和每个消息的TTL时,将选择两者之间的较低值。

Message Demo

同样我们在普通的MyMessageQueue队列中定义只能存活12秒的消息

  1. var factory = new ConnectionFactory()
  2. {
  3. HostName = "127.0.0.1",
  4. UserName = "bob",
  5. Password = "bob"
  6. };
  7. // 创建一个链接
  8. using (var connection = factory.CreateConnection())
  9. {
  10. // 创建一个通道
  11. using (var channel = connection.CreateModel())
  12. {
  13. channel.QueueDeclare(
  14. queue: "MyMessageQueue",
  15. durable: true,
  16. exclusive: false,
  17. autoDelete: false,
  18. arguments: null);
  19. // 发布一个只能存活12秒的新消息
  20. var props = channel.CreateBasicProperties();
  21. props.Expiration = "12000";
  22. channel.BasicPublish(
  23. exchange: string.Empty,
  24. routingKey: "MyMessageQueue",
  25. basicProperties: props,
  26. body: Encoding.UTF8.GetBytes("新消息")
  27. );
  28. Console.WriteLine("Finish");
  29. Console.ReadLine();
  30. }
  31. }


Auto Expire(队列存活时间)

TTL也可以在队列中设置,而不仅仅是队列内容。队列只有在不使用(例如没有使用方)时,才会在一段时间后过期。
通过将x-expires参数设置为queue.declare或设置expires策略,可以为给定队列设置到期时间 。这控制队列在被自动删除之前可以闲置多长时间。未使用表示该队列没有使用者,该队列最近尚未重新声明(重新声明续订租约),并且至少在有效期限内未调用basic.get。例如,可将其用于RPC样式的答复队列,在该队列中可以创建许多永远不会耗尽的队列。
服务器保证队列将被删除(如果至少在到期期限内未使用)。无法保证到期时间过后队列将如何迅速删除。服务器重新启动时,持久队列的租约重新开始。
所述的值x-expires参数或 expires策略以毫秒来描述有效期限。它必须是一个正整数(与消息TTL不同,它不能为0)。因此,值1000表示将删除1秒钟未使用的队列。

Auto Expire Demo

接着我们写一个可以存活12秒的队列,作为演示。

  1. var factory = new ConnectionFactory()
  2. {
  3. HostName = "127.0.0.1",
  4. UserName = "bob",
  5. Password = "bob"
  6. };
  7. // 创建一个链接
  8. using (var connection = factory.CreateConnection())
  9. {
  10. // 创建一个通道
  11. using (var channel = connection.CreateModel())
  12. {
  13. channel.QueueDeclare(
  14. queue: "MyExpireQueue",
  15. durable: false,
  16. exclusive: false,
  17. autoDelete: false,
  18. arguments: new Dictionary<string,object>(){
  19. {"x-expires",1000*12}
  20. });
  21. channel.BasicPublish(
  22. exchange: string.Empty,
  23. routingKey: "MyExpireQueue",
  24. basicProperties: null,
  25. body: Encoding.UTF8.GetBytes("新消息")
  26. );
  27. Console.WriteLine("Finish");
  28. Console.ReadLine();
  29. }
  30. }


命令

rabbitmqctl rabbitmqctl set_policy expiry ".*" '{"expires":12000}' --apply-to queues
rabbitmqctl (Windows) rabbitmqctl.bat set_policy expiry ".*" "{""expires"":12000}" --apply-to queues

MaxLength

通过限制队列中消息数量,多余的消息将会从头部进行删除。

MaxLength Demo

我们通过x-max-length的方式去限制MyMaxLengthQueue队列中消息的数量写一个小Demo

  1. var factory = new ConnectionFactory()
  2. {
  3. HostName = "127.0.0.1",
  4. UserName = "bob",
  5. Password = "bob"
  6. };
  7. // 创建一个链接
  8. using (var connection = factory.CreateConnection())
  9. {
  10. // 创建一个通道
  11. using (var channel = connection.CreateModel())
  12. {
  13. channel.QueueDeclare(
  14. queue: "MyMaxLengthQueue",
  15. durable: false,
  16. exclusive: false,
  17. autoDelete: false,
  18. arguments: new Dictionary<string,object>(){
  19. {"x-max-length",10}
  20. });
  21. // 我们创建15条消息
  22. for (var i = 0; i < 15; i++)
  23. {
  24. channel.BasicPublish(
  25. exchange: string.Empty,
  26. routingKey: "MyMaxLengthQueue",
  27. basicProperties: null,
  28. body: Encoding.UTF8.GetBytes($"新消息{i}")
  29. );
  30. }
  31. Console.WriteLine("Finish");
  32. Console.ReadLine();
  33. }
  34. }

我们通过运行,查看UI很容易的发现它只有10条数据,接着我们来查看是哪10条数据。


我们发现它是从第5条开始的,说明丢失的是前5条数据。

MaxLengthBytes

就是限制队列的内存大小,超过多少就从队列的头部开始删除。参数是x-max-length-bytes,例如不超过1MIB就是x-max-length-bytes:1024,例子我就不举例了,都差不多的,大家国人尝试一下


欢迎加群讨论技术,1群:677373950(满了,可以加,但通过不了),2群:656732739

评价

分布式服务架构微服务架构概念的区别联系

分布式:分散压力。微服务:分散能力。当下理解分布式:不同模块部署在不同服务器上作用:分布式解决网站高并发带来问题集...

jsController中分割字符串的方法

js: varstr=OpenRule; varstrs=newArray(); strs=str.split(&quot;,&quot;); for(vari=0;i&lt;strs.length;i++){ $(&q...

Service-stack.redis配置连接池读写分离(处理并发相关等)

配置连接池与读写分类 //写节点(主节点) List&lt;string&gt;writes=newList&lt;string&gt;(); writes.Add(&quot;123456a...

CSS相对定位绝对定位

一般相对定位和绝对定位可以配合起来使用 例如实现如下的效果 只需要在外层div设置为相对定位,在内部设置为绝对定位就...

C委托事件

1.什么是委托?  委托在C#里的意义和在现实里差不多,从字面意思理解即可。举个例子:领导委托小张去传递个文件,这就是...

asp.net core2.0 依赖注入 AddTransientAddScoped的区别

asp.net core主要提供了三种依赖注入的方式其中AddTransient与AddSingleton比较好区别AddTransient瞬时模式:每次都获取一...

Vue.js+Layer实现表格数据绑定更新

一:使用Vue.js绑定好数据与更新事件 使用v-on绑定好事件,在事件里边直接把该行数据传递进去,在更新方法里边就可以直接...

下划线、换行、回车、空格ASCII码值对照表

下划线,ASCII码95换行 , ASCII码10回车 , ASCII码13空格 , ASCII码32ASCII码表:Bin(二进制)Oct(八进制)Dec(十进制)Hex(...

数据读取器指定的"xx"不兼容。某个类型为"xx"的成员在同名的数据读取器中没有对应的列

报错的地方var result= _db.Database.SqlQuery&lt;SMachine&gt;(sql).FirstOrDefault();经过分析,是因为SqlQuery方法查询...

git 下载提交命令

一.先使用git clone下载一个项目 git clone &#39;项目地址&#39; 这里要注意: clone的项目里边会自带git的一些信息,...

微信开发四 接受用户普通消息回复消息

微信接收用户普通消息的文章可以在官方中直接看微信普通消息分类:接受用户文本消息 与 回复文本信息 注意在接收用户普通...

记忆糖的关系【阅读听力】

Link Between Memory and SugarSugar On The BrainIt’s long been understood that there is a connection between memory...

婚姻心脏健康的关系【阅读听力】

Marriage and Heart HealthPlenty of studies have found that being married is generally good for health. One study ze...

iframe自适应高度配合net core使用

去掉iframe边框frameborder=&quot;0&quot;去掉滚动条scrolling=&quot;no&quot;iframe 自适应高度如果内容是固定的,那么就...

net core中使用url编码解码操作

net core中暂时还没有以前asp.net与mvc中的server对象。获取url的编码与解码操作不能使用以前的server对象来获取。使用的是...

Sqlerver添加用户授权

添加用户安全性--&gt;登录名,然后右键新建登录名就可以了然后填写好相关信息就可以了右键属性,用户映射可以选择该用户可...
这一世以无限游戏为使命!
排名
2
文章
657
粉丝
44
评论
93
docker中Sware集群与service
尘叶心繁 : 想学呀!我教你呀
一个bug让程序员走上法庭 索赔金额达400亿日元
叼着奶瓶逛酒吧 : 所以说做程序员也要懂点法律知识
.net core 塑形资源
剑轩 : 收藏收藏
映射AutoMapper
剑轩 : 好是好,这个对效率影响大不大哇,效率高不高
ASP.NET Core 服务注册生命周期
剑轩 : http://www.tnblog.net/aojiancc2/article/details/167
ICP备案 :渝ICP备18016597号-1
网站信息:2018-2025TNBLOG.NET
技术交流:群号656732739
联系我们:contact@tnblog.net
公网安备:50010702506256
欢迎加群交流技术