欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 财经 > 金融 > RabbitMQ高级特性-持久性

RabbitMQ高级特性-持久性

2024/10/25 14:34:35 来源:https://blog.csdn.net/m0_75227031/article/details/142567079  浏览:    关键词:RabbitMQ高级特性-持久性

对于RabbitMQ的可靠性机制

引入:当RabbitMQ服务停掉以后, ⽣产者发送的消息不丢失呢. 默认情况下, RabbitMQ 退出或者由于某种原因崩溃时, 会忽视队列和消息, 除⾮告知他不要这么做。

RabbitMQ的持久化分为三个部分:交换器的持久化、队列的持久化和消息的持久化。

1、交换机持久化
      交换器的持久化是通过在声明交换机时是将durable参数置为true实现的.相当于将交换机的属性在服务器内部保存,当MQ的服务器发⽣意外或关闭之后,重启 RabbitMQ 时不需要重新去建⽴交换机, 交换机会⾃动建⽴,相当于⼀直存在.
      如果交换器不设置持久化, 那么在 RabbitMQ 服务重启之后, 相关的交换机元数据会丢失, 对⼀个⻓期使⽤的交换器来说,建议将其置为持久化的.

ExchangeBuilder.topicExchange(Constant.ACK_EXCHANGE_NAME).durable(true).build()

2、队列持久化
       队列的持久化是通过在声明队列时将 durable 参数置为 true实现的.
       如果队列不设置持久化, 那么在RabbitMQ服务重启之后,该队列就会被删掉, 此时数据也会丢失. (队列没有了, 消息也⽆处可存了)                                                                                                              队列的持久化能保证该队列本⾝的元数据不会因异常情况⽽丢失, 但是并不能保证内部所存储的消息不会丢失. 要确保消息不会丢失, 需要将消息设置为持久化.

持久化:

QueueBuilder.durable(Constant.ACK_QUEUE).build();

非持久化:

QueueBuilder.nonDurable(Constant.ACK_QUEUE).build();

3、消息持久化
       消息实现持久化, 需要把消息的投递模式( MessageProperties 中的 deliveryMode )设置为2,也就是 MessageDeliveryMode.PERSISTENT

public enum MessageDeliveryMode {
NON_PERSISTENT,//⾮持久化
PERSISTENT;//持久化
}

       设置了队列和消息的持久化, 当 RabbitMQ 服务重启之后, 消息依旧存在. 如果只设置队列持久化,重启之后消息会丢失. 如果只设置消息的持久化, 重启之后队列消失, 继⽽消息也丢失. 所以单单设置消息持久化⽽不设置队列的持久化显得毫⽆意义

//⾮持久化信息
channel.basicPublish("",QUEUE_NAME,null,msg.getBytes());
//持久化信息
channel.basicPublish("",QUEUE_NAME,
MessageProperties.PERSISTENT_TEXT_PLAIN,msg.getBytes());

测试场景:

1.交换机    持久化(数据不丢失)

                  非持久化(数据丢失)

2.队列        持久化(队列不丢失)

                消息持久化(消息不丢失)

                消息非持久化(消息丢失)

3,队列        非持久化(队列元数据丢失)

                消息持久化(消息丢失)

                消息非持久化(消息丢失)

               

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com