参数中的 arguments

之前讲参数的一些作用的时候,忽略了最后一个字典类型的参数,因为这个参数是大有文章的,值得单独进出来说道说道。

这时,就不得不打开我们的 Web UI管理系统了,可以看到在这边添加queue的时候,有Arguments下面有一些说明,Message TTL,Auto expire…….

Message TTL

可以看到,点击一下Message TTL,它的参数名是 x-message-ttl 类型是number,那么这个应该怎么用呢?

一起来看看官方解释,嗯。。。其实也就是在说,在声明队列的时候可以添加这个参数,那么它的作用是让发布的message在队列中可以存活多长时间,以毫秒为单位。更通俗点就是,设置了这个参数,发布的消息在queue时间超过了你设定的时间就会被删除掉。

送上代码,不多说,先跑起来,这时就可以看到,在features也可以看到queue是ttl的

  1. //声明一个queue,里面的内容自发布起五秒后被删除
  2. channel.QueueDeclare("messagettlqueue", true, false, false, new Dictionary<string, object> { { "x-message-ttl", 5000 } });

这个是针对queue的,当然更加定制化的针对message也是有的,也就是说可以让queue里的某条message在多久消失

  1. var properties = channel.CreateBasicProperties();
  2. //设置过期时间
  3. properties.Expiration = "5000";
  4. channel.BasicPublish(null, "queue", properties, Encoding.UTF8.GetBytes("我五秒后就会消失"));

Auto expire

之前是针对 queue中的消息或者消息本身,而这个才是针对queue,这里是官方解释,也就是说,当前的queue在指定的时间内,没有consumer、basic.get也就是未被访问,就会被删除。

设置起来也是非常简单的

  1. //声明一个queue,queue五秒内而且未被任何形式的消费,则被删除
  2. channel.QueueDeclare("queue", true, false, false, new Dictionary<string, object> { { "x-expires", 5000 } });

MaxLength与MaxLength bytes

相信到这里大家已经可以根据名字去猜测它的作用了,没错它们是设置queue的消息最大条数与消息最大占用大小

并不是说,设置了最大长度为10,第11条数据插入的时候就会报错,而是在超过了最大长度后进行插入会删除之前插入的消息为本次的留出空间,也就是说无论什么时候,queue中的消息始终都是十条,相应的最大占用大小也是这个道理,当超过了这个大小的时候,会删除之前插入的消息为本次的留出空间。

  1. //声明一个queue,最大长度10,最大大小2048bytes
  2. channel.QueueDeclare("queue", true, false, false, new Dictionary<string, object>
  3. {
  4. { "x-max-length", 10 },
  5. { "x-max-length-bytes", 2048}
  6. });

Dead letter exchagne 与 Dead letter routing key

Dead letter 死信,可能有些人对这个词比较陌生,那么我们首先来了解什么叫死信,也就是说那些没有被投递出去的信件

就像上面的messagettl,maxlength等。消息因为超时或超过限制在队列里消失,这样我们就丢失了一些消息,也许里面就有一些是我们做需要获知的。而rabbitmq的死信功能则为我们带来了解决方案。设置了dead letter exchange与dead letter routingkey(要么都设定,要么都不设定)那些因为超时或超出限制而被删除的消息会被推动到我们设置的exchange中,再根据routingkey推到queue中

这里是consumer端,声明了一个testqueue,它里面的消息会在5秒后被删除,然后又设置了死信的exchange与routingkey。

  1. using (var channel = RabbitMqHelper.GetConnection().CreateModel())
  2. {
  3.  
  4. //声明一个带有死信功能功能的queue exchange: dlexchange queue: dlexqueue
  5. channel.QueueDeclare("testqueue", true, false, false, new Dictionary<string, object>
  6. {
  7. { "x-message-ttl",5000},
  8. { "x-dead-letter-exchange", "dlexchange" },
  9. { "x-dead-letter-routing-key", "dlexqueue"}
  10. });
  11.  
  12. //负责死信的交换机
  13. channel.ExchangeDeclare("dlexchange", ExchangeType.Direct, true, false, null);
  14.  
  15. channel.QueueDeclare("dlexqueue", true, false, false, null);
  16. channel.QueueBind("dlexqueue", "dlexchange", "dlexqueue", null);
  17.  
  18. var consumer = new EventingBasicConsumer(channel);
  19.  
  20. consumer.Received += (sender, e) =>
  21. {
  22. Console.WriteLine(Encoding.UTF8.GetString(e.Body));
  23. };
  24. channel.BasicConsume("testqueue", true, consumer);
  25.  
  26. Console.WriteLine("consumer启动成功");
  27.  
  28. Console.ReadKey();
  29.  
  30. }

下面则是server端,很简单,只是发一条消息

  1. //创建返回一个新的频道
  2. using (var channel = RabbitMqHelper.GetConnection().CreateModel())
  3. {
  4.  
  5. channel.BasicPublish(string.Empty, "testqueue", null, Encoding.UTF8.GetBytes("我五秒后就会消失"));
  6.  
  7. Console.ReadKey();
  8.  
  9. }

这时候运行程序可以看到这里已经有了两个queue,一个是正常的queue一个是负责死信的queue,接下来我们再运行发布端程序,直接让消息消失掉

这时候dlexqueue里已经拿到了testqueue里消失的queue,如果这条消息被消费者消费过了的话就不会来到这里了

Maximum priority

不知不觉到了最后一个,这里先说一个场景,当我们打开社交软件的时候,假如这里同时有十个未读消息,但是其中有一条消息是你的女票发来的,肯定优先会看女票发来的消息,剩下的才根据其重要程度决定查看的顺序。

而Maximnum priority也是为我们的queue内的消息进行分级,根据级别来决定其重要程度。

闲话不多说,直接走代码,这里是发布者端代码,设置了五个级别,5最高, 0最低

  1. //创建返回一个新的频道
  2. using (var channel = RabbitMqHelper.GetConnection().CreateModel())
  3. {
  4.  
  5. channel.QueueDeclare("priorityQueue", true, false, false, new Dictionary<string, object> { { "x-max-priority", 5 } });
  6.  
  7. var properties = channel.CreateBasicProperties();
  8.  
  9. for (var i = 0; i < 6; i++)
  10. {
  11. properties.Priority = (byte)i;
  12. channel.BasicPublish(string.Empty, "priorityQueue", properties, Encoding.UTF8.GetBytes($"{i}级别的消息"));
  13. }
  14.  
  15. Console.ReadKey();
  16.  
  17. }

这里不用consumer拿到消息了,直接在WEB UI工具中拿数据,然后看看顺序,可以直观的发现最后发布的一条消息是第一个拿出来的,这就是因为我们设置了级别,而它的优先级是最高的

 
 
标签: RabbitMQ

RabbitMQ 参数们的Power “续”的更多相关文章

  1. RabbitMQ 参数们的Power “续”

    参数中的 arguments 之前讲参数的一些作用的时候,忽略了最后一个字典类型的参数,因为这个参数是大有文章的,值得单独进出来说道说道. 这时,就不得不打开我们的 Web UI管理系统了,可以看到在 ...

  2. RabbitMQ 声明Queue时的参数们的Power

    参数们的Power 在声明队列的时候会有很多的参数 public static QueueDeclareOk QueueDeclare(this IModel model, string queue ...

  3. 笔记本POWER部分的应用——(MOS/LDO/BUCK BOOST)

    一.MOSFET 简介: 金属-氧化物半导体场效应晶体管,简称金氧半场效晶体管(Metal-Oxide-Semiconductor Field-Effect Transistor, MOSFET)是一 ...

  4. Python3学习(一)-基础、数据类型、变量、字符串和编码、list&tuple、if、for、while、dict、set、函数与参数

    ##廖雪峰py3笔记 ## '//'这是获得相除后的整数部分 ##a = 10//3 ##print (a) ## '/'获得相除后的结果,为浮点数,结果能整除也也是浮点数 ##b = 10/3 ## ...

  5. python基础——函数的参数

    python基础——函数的参数 定义函数的时候,我们把参数的名字和位置确定下来,函数的接口定义就完成了.对于函数的调用者来说,只需要知道如何传递正确的参数,以及函数将返回什么样的值就够了,函数内部的复 ...

  6. RabbitMQ延迟消息学习

    准备做一个禁言自动解除的功能,立马想到了订单的超时自动解除,刚好最近在看RabbitMQ的实现,于是想用它实现,查询了相关文档发现确实可以实现,动手编写了这篇短文. 准备工作 1.Erlang安装请参 ...

  7. Python基础(函数,函数的定义,函数的调用,函数的参数,递归函数)

    1.函数 我们知道圆的面积计算公式为: S = πr2 当我们知道半径r的值时,就可以根据公式计算出面积.假设我们需要计算3个不同大小的圆的面积: r1 = 12.34 r2 = 9.08 r3 = ...

  8. python 函数的参数的几种类型

    定义函数的时候,我们把参数的名字和位置确定下来,函数的接口定义就完成了.对于函数的调用者来说,只需要知道如何传递正确的参数,以及函数将返回什么样的值就够了,函数内部的复杂逻辑被封装起来,调用者无需了解 ...

  9. python 之 函数的参数

    函数的参数好几种类型:包括位置参数.默认参数.可变参数.关键字参数.命名关键字参数. 廖大神python学习笔记,大神网站:百度搜索“廖雪峰的官网” 1.位置参数:调用函数时根据函数定义的参数位置来传 ...

随机推荐

  1. React Native,flexbox布局

    Flexbox布局 flex:使组件在可利用的空间内动态地扩张或收缩.flex:1会使组件撑满空间.当有多个组件都指定了flex的值,那么谁的flex值大谁占得空间就大,占得大小的比例就是flex值的 ...

  2. Mybatis if 判断等于一个字符串

    在做开发的时候遇到这样一个问题:当传入的type的值为y的时候,if判断内的sql也不会执行.   <if test="type=='y'">   and status ...

  3. 迷你MVVM框架 avalonjs1.5.2 发布

    经过2个小版本的试水, avalon1.5这个全新的架构也终于成熟了. 首先是组件的配置项,名字改了不少,让大家都满意. ms-duplex, ms-include, ms-if等指令的BUG修复. ...

  4. maven ,添加加密算法,使用

    1:消息摘要:(数字指纹):既对一个任意长度的一个数据块进行计算,产生一个唯一指纹.MD5/SHA1发送给其他人你的信息和摘要,其他人用相同的加密方法得到摘要,最后进行比较摘要是否相同. MD5(Me ...

  5. springboot 整合task定时任务

    一步:在启动类中加入     加入就会调用定时了. //开启定时任务 开启后就可以被扫描到   @EnableScheduling 二步:建一个tasks工具包 都会被扫描到的了 有三个类 Async ...

  6. app与jvm 反向代理时config的设置(用于在web页面显示npm(就如tomcat)产生的页面)

    dev: { // Various Dev Server settings contentBase: ROOT, host: ip, port: 8084,    //此端口为任意设置,不重复即可,为 ...

  7. ArcGIS案例学习笔记-批量裁剪地理模型

    ArcGIS案例学习笔记-批量裁剪地理模型 联系方式:谢老师,135-4855-4328,xiexiaokui#qq.com 功能:空间数据的批量裁剪 优点:1.批量裁剪:任意多个目标数据,去裁剪任意 ...

  8. thymeleaf 字符串的拼接

  9. GBDT+Lr

    https://blog.csdn.net/shine19930820/article/details/71713680 http://scikit-learn.org/stable/auto_exa ...

  10. poj2115-Looooops-(扩展欧几里得定理)

    C Looooops Time Limit: 1000MS   Memory Limit: 65536K Total Submissions:33752   Accepted: 9832 Descri ...