RabbitMQ的持久化 面试

交换机的持久化:

交换机的持久化其实就是相当于将交换机的属性在服务器内部保存。当MQ的服务器发生意外或关闭之后,重启RabbitMQ时不需要重新手动或执行代码去建立交换机,交换机会自动建立,相当于一直存在。

其是在声明交换器的时候,将 durable 属性设置为 true。如果交换器不设置持久化,那么在 RabbitMQ 服务重启之后,相关的交换器就会被删除。对于长期使用的交换器来说,建议将其置为持久化。

//springboot代码 
@Bean
    public TopicExchange payTopicExchange(){
        /**
         * 参数1:交换机类型
         * 参数2:是否持久化 true是, 默认为 true
         * 参数3:是否自动删除 true是, 默认为 false
         */
        return new TopicExchange(exchangeMame,true,false);
    }

队列持久化:

队列的持久化也是在声明队列的时候,将durable参数设置为true。如果队列不设置持久化,那么 RabbitMQ服务重启之后,队列就会被删除,既然队列都不存在了,队列中的消息也会丢失。

//springboot代码 
@Bean
    public Queue dlQueue(){
        /**
         * 参数1:队列名称
         * 参数2:是否持久化 默认:true
         */
        return new Queue(dlQueue,true);
    }

信息持久化:

队列的持久化能保证其本身不会因重启、关闭、宕机的情况而丢失,但是并不能保证内部所存储的消息不会丢失。要确保消息不会丢失,需要将消息设置为持久化。信息持久化则是将信息存在磁盘中

//springboot代码
MessagePostProcessor messagePostProcessor = message -> {
    MessageProperties messageProperties = message.getMessageProperties();
    //设置消息持久化
    messageProperties.setDeliveryMode(MessageDeliveryMode.PERSISTENT);
    return message;
};
rabbitTemplate.convertAndSend("exchangeName","routingKey","消息内容",
messagePostProcessor);

注意:

可以将所有的消息都设置为持久化,但是这样会严重影响 RabbitMQ 的性能。写入磁盘的速度比写入内存的速度慢得不只一点点。对于可靠性不是那么高的消息可以不采用持久化处理,以提高整体的吞吐量。在选择是否要将消息持久化时,需要在可靠性和吞吐量之间做权衡。

一般的系统也用不到对消息进行持久化。不过交换机和队列的持久化还是要支持的。

RabbitMQ 持久化有什么有优点?

持久化可以提高 RabbitMQ 的可靠性,以防在异常情况(重启、关闭、宕机等)下的数据丢失。

RabbitMQ 持久化有什么缺点?

持久化的缺点就是降低了服务器的吞吐量,因为使用的是磁盘而非内存存储,从而降低了吞吐量。可尽量使用 ssd 硬盘来缓解吞吐量的问题。

你可能感兴趣的:(程序员面试,rabbitmq,面试,java,spring,boot)