前言
本文介绍RabbitMq几个重要的概念。分别是优先级队列、消息顺序性、消息分发、持久化。
正文
目录
优先级队列
顾名思义,优先级高的具备优先消费的特权。
设置方式是在声明队列的时候设置参数:x-max-priority,代表最大优先级,如果参数设置10,如代码所示:
@Bean
public Queue priorityQueue() {
Map<String, Object> map = new HashMap<>();
//给当前队列配置最大优先级
map.put("x-max-priority", 10);
return new Queue(PRIORITY_QUEUE, true, false, false, map);
}
那么则表示在该队列存在11个级别,从高到低是 10,9,……0。
并且需要在发送消息的时候设置当前消息的优先级,如代码所示:
amqpTemplate.convertAndSend("priority_exchange", "", order, new MessagePostProcessor() {
@Override
public Message postProcessMessage(Message message) throws AmqpException {
message.getMessageProperties().setPriority(finalI);
return message;
}
});
需要注意的是,需要在生产者的速度大于消费者的速度,且Broker中有消息堆积的情况下,设置队列及消息优先级才有意义,否则,生产者刚生产一条就被消费者消费了,消息在Broker没有堆积,何谈优先级。
消息顺序性
RabbitMq没有属性设置消息的顺序性,所以在没有前提的情况下说RabbitMq消息的消费具有顺序性是错误的,理想情况下,没有重复消费前提下,生产者发送 msg1、msg2、msg3,那么消费者消费顺序也是msg1、msg2、msg3。
但是这种情况毕竟是理想的,而这种理想情况在实际中很容易会被打破,例如消息丢失,网络原因,异常发生,而且也是在一个生产者和一个消费这的情况,如果多个生产者的话,真的就无法保证哪个消息先到达Broker,也就不能保证顺序。
例举一下情况,打破消费的顺序性。
生产者使用了事务,且触发了回滚,重新补发消息后,顺序可能是错乱的。<