RabbitMQ 优先级队列-为队列赋权
RabbitMQ 消息收发是按顺序收发,一般情况下是先收到的消息先处理,即可以实现先进先出的消息处理。但如果消息者宕机或其他原因,导致消息接收以后,未确认,那么消息会重新Requeue到队列中,就打破了消息的顺序处理原则。如果我们有一个优先级特别高的消息需要处理,有没有特权呢?答案是在不搞小动作的情况下是没有,即所有消息的优先级都是一样,按照顺序排队处理。
如果某个消息特别紧急,必须优先处理呢?答案就是必须走后门,设置高优先级。这次我们来聊下队列优先级。
优先级队列,顾名思义,具有更高优先级的队列具有较高的优先权,优先级高的消息具备优先被消费的特权。
优先级队列的配置:
在rabbitmq webUI界面中,add queue是通过添加Arguments或者是在代码中添加效果是一样的,取值范围在0~255之间
新增的优先级队列,可以看到有特殊标识Pri,代表是优先级队列,具有特权,鼠标移动到Pri上面会显示权值。
优先级队列:
- 只有当消费者不足,不能及时进行消费的前提下,优先级队列才能发挥作用。
- 队列、消息都要设置优先级,优先级队列才可生效,以较小值为准。
- 队列优先级只能声明一次,不可改变。
- 优先级队列在内存、磁盘、CPU都会有消耗,不建议创建大量的优先级队列。(劳民伤财的事要少干)
- 在消费端速度大于生产端速度,且broker中没有消息堆积的话,对发送的消息设置优先级也没什么实际意义,因为发送端刚发送完一条消息就被消费端消费了,那么就相当于broker至多只有一条消息,那么对于单条消息来说优先级是没有什么意义的。
- 有指定优先级的消息会将优先级以0对待。 对于超过优先级队列所定最大优先级的消息,优先级以最大优先级对待。对于相同优先级的消息,后进的排在前面
优先级队列实现了特殊情况下,消息的优先处理。要使用消息优先处理,需要队列配置成优先级及消息自身的优先级才可以实现。这就相当于一个NB部门,如果你是BOSS,那么你的权限就可以非常大,但如果你只是一个小弟,那么对不起,你仍然没有那么大的权限,虽然你所在的部门非常NB。
避免优先级队列的滥用。
有人的地方就有政治,有政治就有斗争,但我讨厌政治,讨厌无休止的迎合。