消息中间件在各个大厂都有使用,算是现在面试过程中必问的一个知识点了。昨天,微信群里有一位网友说,面试官问我 RabbitMQ 消息如何插队?求大家科普如何做!
群里一直同意和谐社会,拒绝插队。但是在特殊情况下是可以插队的,比如医院里的急诊等。那么 RabbitMQ 消息该如何插队呢?
这个问题很简单,RabbitMQ 有优先队列。所以,RabbitMQ 消息队列优先级就可以用来解决“插队”问题。
生产者生成消息打到交换机里面(如果没有声明交换机,会打到 default exchange 里面),交换机绑定一个或多个队列,消息进入队列里面,消费者一直在监听队列,发现队列里面有消息就开始消费,这里就是一个消息传递的过程,queue 是一个栈队列,队列是先进先出的,就是说消息来了依次排队,一个队列并不能实现消息的插队和优先推送的功能。但是如果说我们的多个队列有不同的优先级,不同优先级的消息通过 roatingkey 进入不同的队列,优先级高的队列消息被优先消费,这样也能形成一个相对意义上的优先级,所以说这里不是消息的优先级而是队列的优先级。
明白了这个之后,你就知道如何回答面试官了。RabbitMQ 的消息是不能插队的,但是它提供的有优先队列。插队就是要靠高优先级的队列来实现。
在 RabbitMQ 中,设置消息的优先级一共有 2 个步骤:设置队列的 x-max-priority 参数;设置消息的 Priority 参数。
就这么简单,做完这个之后就可以验证优先级队列的作用。当然,需要注意的是,在消费端速度大于生产端速度,且 broker 中没有消息堆积的话,对发送的消息设置优先级也没什么实际意义,因为发送端刚发送完一条消息就被消费端消费了,那么就相当于 broker 至多只有一条消息,那么对于单条消息来说优先级是没有什么意义的。
以上,希望能够帮助到大家!另外如果有人愿意一起精进,请加我微信小号:xttblog。