1.消息分发
当RabbitMQ队列拥有多个消费者时,队列收到的消息将以轮询的方式分发给消费者。每条消息只会发给订阅列表的一个消费者。这个方式非常适合拓展,专门为并发程序设定。如果负载加重,则需创建更多的消费者来处理消息。
但是,有的时候,某些消费者任务繁重,某些消费者由于某些原因很快处理完了消息,进程空闲,此时轮询的方式就不是很好了。
这种情况我们可以使用channel.basicQos方法,这个方法允许限制信道上的消费者所能保持的最大未确认消息的数量。
比如,在订阅消费队列之前,消费端程序调用了basicQos(5)方法,然后订阅了某个队列进行消费。RabbitMQ会保存一个消费者列表,每发送一条消息都会为对应的消费者计数,如果达到了所设定的上限,那么RabbitMQ就不会再给这个消费者发送消息,直到消费者确认了某条消息之后,RabbitMQ将计数-1,之后消费者才会继续接收消息,直到再次达到计数上限。
baiscQos仅对与推模式有效,拉模式无效。
2.消息顺序性
消息的顺序性是指消费者消费到的消息和发送者发布的消息顺序是一致的。
RabbitMQ并不能保证消息的顺序性,比如:
比如使用生产者确认机制,如果发生中断,超时或者收到RabbitMQ的basicNack命令,则需要补偿发送,这样就会乱序。
比如生产者发送消息设置了不同超时时间,并且也设置了死信队列。如果有的消息因超时而进入了死信队列,那么也会乱序。
如果消息设置了优先级,消息也会乱序。
要想保证消息的顺序性,可以在消息体中添加一个ID用来标志顺序。