RabbitMQ:消息持久化和不公平分发

267 阅读1分钟

RabbitMQ持久化

让消息在RabbitMQ中保存

队列持久化

channel.queueDeclare(QUEUE_NAME, true, false, null);

注:如果之前的同名队列不是持久化的,需要先将原先同名队列删除

消息持久化

channel.basicPublish("", QUEUE_NAME, MessageProperties.PERSISTENT_TEXT_PLAIN, message.getBytes("UTF-8"))

注:此时只是告诉RabbitMQ要将消息保存到磁盘,但是依然存在当消息刚准备存储到磁盘的时候还没有存储玩,消息还在缓存的一个间隔点,持久性不强,后面发布确认可以处理在这个缺陷

不公平分发

实现

//更改在消费者(接受消息)
//默认是0,轮序分发,一次性分发所有队列
//设置之后限制了一次分发消息的数量,再设置手动确认机制,这样在消费者未提交Ack时,不会再给其分发消息,实现不公平分发
int prefetchCount = 1;//0是轮询分发
channel.basicQos(1);

注:prefetchCount是设置信道容量的大小,采用轮询的方式往信道里放消息。信道满了就跳过

rabbit内部对信道数量升序

预取值

(prefetch)信道可以一次性获取队列中的n条消息

含义:当前信道的最大的未发送确认的消息,都未达到之前,采用轮询分发

//注:某个消费者设置了限制值,如果该消费者处理完后队列如果还有消//息的话,也不会再分发给该消费者了

当1时,只能获取1条,处理完获取下一条;

当0时,为不限制,所以队列中的消息可以轮询着一次性发完