是指优先级高的消息具备优先被消费的特权,可以通过设置队列的x-max-priority参数来实现。如下所示:
//定列一个优先级队列 channel.QueueDeclare("queue.priority",true,false,false, new Dictionary<string, object>() { {"x-max-priority",10 } });
通过web管理页面可以看到 "pri" 的标识,如下所示:
上面的代码演示的是如何配置一个队列的最大优先级,为10。在此之后,需要在发送时在消息中设置消息当前的优先级,示例代码如下:
var pro = channel.CreateBasicProperties(); pro.Priority = 5; //发布消息 channel.BasicPublish(exchangeName, routeKey,true, pro, sendBytes);
上面的代码中设置消息的优先级为5,默认最低为0,最高为队列设置的最大优先级。优先级高的消息可以被优先消费,这个也是有前提的:如果在消费者的消费速度大于生产者的速度且broker中没有消息堆积的情况下,对发送的消息设置优先级也就没什么实际意义。
后续了解
rabbitmq的持久化分为三个部分:交换器的持久化、队列的持久化和消息的持久化。
交换器的持久化是通过在声明交换器时将durable参数置为true实现的。对一个长期使用的交换器来说,建议将其置为持久化.
队列的持久化是通过在声明队列时将durable参数置为true实现的。如果不设置持久化,那么rabbitmq服务重启之后,相关队列的元数据会丢失,此时数据也会丢失。队列没了,消息也就没了。
队列的持久化能保证其本身的元数据不会因异常情况而丢失,但并不能保证内部所存储的消息不会丢失,要确保消息不会丢失,需要将其设置为持久化。通过将消息的投递模式(deliverModel)设置为2即可实现消息的持久化。
设置了队列和消息的持久化,当rabbitmq服务重启之后,消息依旧存在,如果单单只设置队列持久化,重启之后消息会丢失;单单只设置消息的持久化,重启之后队列消失,继而消息也会丢失。单单设置消息的持久化而不设置队列的持久化显得毫无意义。
注意要点:
可以将所有的消息都设置为持久化,但是这样会严重影响rabbitmq的性能。写入磁盘的速度比写入内存的速度慢得不只一点点。对于可靠性不是那么高的消息可以不采用持久化处理以提高整体的吞吐量。在选择是否要将消息持久化时,需要在可靠性和吞吐量之间做一个权衡。
将交换器、队列、消息都设置了持久化就能保证百分百不丢失吗?答案是否定的。
1.是从消费者来说,必须在客户端程序处理消息后,才能将auotAck参数设置为false。
2.持久后存入磁盘时,rabbitmq并不会为每条消息进行同步磁盘,如果仅保存在操作系统缓存之中而不是物理磁盘之中,在这短的时间内rabbitmq服务节点发生了down机或重启等异常情况,消息保存还没来得落盘,那么消息会丢失。解决方法(1)引入rabbitmq的镜像队列机制,相当于配置了副本,在生产环境中关键业务一般都会设置镜像队列(2)是发送端做确认机制来保证消息已经正确地发送并存储至rabbitmq中(channel.BasicPublish中设置)。
RabbitMQ 学习系列7 进阶(延迟队列、优先级队列、延迟) 3
原文:https://www.cnblogs.com/MrHSR/p/14847177.html