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