rabbitmq的持久化

目录

队列实现持久化

如何删除队列​编辑

消息实现持久化

不公平分发


如何保障当 RabbitMQ 服务停掉以后消息生产者发送过来的消息不丢失。默认情况下 RabbitMQ 退出或由于某种原因崩溃时,它忽视队列和消息,除非告知它不要这样做。确保消息不会丢失需要做两件事:我们需要将队列和消息都标 记为持久化

队列实现持久化

之前我们创建的队列都是非持久化的,rabbitmq 如果重启的化,该队列就会被删除掉,如果
要队列实现持久化 需要在声明队列的时候把 durable 参数设置为持久化

java 复制代码
 boolean durable=true;
 channel.queueDeclare(QUEUE_NAME,durable,false,false,null);
 String message="hello world!!!!";

但是需要注意的就是如果之前声明的队列不是持久化的,需要把原先队列先删除,或者重新
创建一个持久化的队列,不然就会出现错误:but current is 'fakse'

如何删除队列

拉到最底下,点击删除。

持久化队列的标识

消息实现持久化

要想让消息实现持久化需在消息生产者修改代, MessageProperties.PERSISTENT_TEXT_PLAIN 添加这个属性。

java 复制代码
 channel.basicPublish("",QUEUE_NAME, MessageProperties.PERSISTENT_TEXT_PLAIN,message.getBytes());

不公平分发

我们学习到 RabbitMQ 分发消息采用的轮训分发,但是在某种场景下这种策略并不是很好,比方说有两个消费者在处理任务,其中有个消费者 1 处理任务的速度非常快,而另外一个消费者 2 处理速度却很慢,这个时候我们还是采用轮训分发的话就会到这处理速度快的这个消费者很大一部分时间 处于空闲状态,而处理慢的那个消费者一直在干活,这种分配方式在这种情况下其实就不太好,但是 RabbitMQ 并不知道这种情况它依然很公平的进行分发。

java 复制代码
int prefetchCount=1;
channel.basicQos(prefetchCount);

预取值

本身消息的发送就是异步发送的,所以在任何时候, channel 上肯定不止只有一个消息另外来自消费者的手动确认本质上也是异步的。因此这里就存在一个未确认的消息缓冲区,因此希望开发人员能限制此 缓冲区的大小,以避免缓冲区里面无限制的未确认消息问题 。这个时候就可以通过使用 basic.qos 方法设置"预取计数"值来完成的。该值定义通道上允许的未确认消息的最大数量 。一旦数量达到配置的数量,RabbitMQ 将停止在通道上传递更多消息,除非至少有一个未处理的消息被确认,例如,假设在通道上有未确认的消息 5 、 6 、 7 , 8 ,并且通道的预取计数设置为 4 ,此时 RabbitMQ 将不会在该通道上再传递任何消息,除非至少有一个未应答的消息被 ack 。比方说 tag=6 这个消息刚刚被确认 ACK , RabbitMQ 将会感知这个情况到并再发送一条消息。消息应答和 QoS 预取值对用户吞吐量有重大影响。通常,增加预取将提高向消费者传递消息的速度。

相关推荐
小刘爱喇石( ˝ᗢ̈˝ )6 小时前
行式数据库与列式数据库区别
数据库·分布式
MiniFlyZt7 小时前
消息队列MQ(RabbitMQ)
spring boot·分布式·微服务·rabbitmq
梦城忆7 小时前
常用的分布式 ID 设计方案
分布式
qxlxi7 小时前
【分布式】聊聊分布式id实现方案和生产经验
分布式·架构
&星辰入梦来&8 小时前
RabbitMQ 从入门到精通
分布式·rabbitmq
小袁拒绝摆烂8 小时前
RabbitMQ从入门到实战-2
分布式·rabbitmq
对许9 小时前
Hadoop的运行模式
大数据·hadoop·分布式
穿越在未来9 小时前
【RabbitMQ】Producer之TTL过期时间 - 基于AMQP 0-9-1
分布式·消息队列·rabbitmq·消息中间件·rabbitmq ttl
小五Z9 小时前
RabbitMQ高级特性--消息确认机制
java·rabbitmq·intellij-idea
Hellc0079 小时前
使用 Docker 部署 RabbitMQ 并实现数据持久化
docker·rabbitmq·ruby