RabbitMQ默认采用的是轮循分发,但实际项目中可能某一个消费者处理的速度快,某一个处理的速度慢,
这个时候用轮循分发就会导致速度快的很长一段时间处于空闲状态,处理慢的就一直在干活。
为了避免上述情况:
//消费者端开启不公平分配 channel.basicQos(1); 开启之后,意思就是说,我这一个消息还没有处理完或者说我还没有应答你,请你先不要分配消息给我; 这时候只能把新的消息分发给其它空闲的消费者。1.1、预期值概念
RabbitMQ本身消息就是异步发送的, channel肯定不止只有一个消息;
另外消费者的确认本身也是异步的,因此就必须存在一个未确认的消息缓冲区,
开发人员就可以设置值,来限定此缓冲区的大小,避免无限制的未确认的消息的问题。
//消费者端设置未确认消息缓存区 channel.basicQos(5);2、RabbitMQ的持久化
RabbitMQ通过消息持久化来保障了消息可靠性,在异常退出或者宕机情况下,保障了数据的没有丢失。
2.1、队列持久化如果没有设置队列持久化,如果RabbitMQ重启之后,该队列就会自动删除;
如何设置呢? 需要在声明队列的时候把 durable 参数设置为持久化 boolean durable =true; channel.queueDeclare(QUEUE_NAME,durable,false,false,null);
如果之前声明的队列没有持久化,需要把原先的队列删除之后在创建,否则会报错。
2.2、消息持久化只需在发消息的时候,添加
channel.basicPublish("",QUEUE_NAME, MessageProperties.PERSISTENT_TEXT_PLAIN,
message.getBytes(StandardCharsets.UTF_8));
消息持久化并不能完全保证消息不丢失,因为尽管告诉了RabbitMQ将消息存入磁盘,但是消息存入磁盘的过程还有一个缓存点,可能出现意外。



