本文介绍: 消息到达MQ以后,如果MQ不能及时保存,也会导致消息丢失,所以MQ的可靠性也非常重要。以上就是全部讲解


前言

消息到达MQ以后,如果MQ不能及时保存,也会导致消息丢失,所以MQ的可靠性也非常重要。


一、数据持久

为了提升性能默认情况下MQ的数据都是在内存存储的临时数据重启后就会消失。为了保证数据的可靠性,必须配置数据持久化,包括:

交换机持久化

控制台的Exchanges页面添加交换机可以配置交换机的Durability参数
在这里插入图片描述
设置为Durable就是持久化模式,Transient就是临时模式

队列持久化

控制台的Queues页面添加队列时,同样可以配置队列的Durability参数
在这里插入图片描述

消息持久化

控制台发送消息的时候,可以添加很多参数,而消息的持久化是要配置一个properties
在这里插入图片描述

开启持久化机制以后,如果同时还开启生产者确认,那么MQ会在消息持久化以后才发送ACK回执,进一步确保消息的可靠性。
不过出于性能考虑,为了减少IO次数,发送到MQ的消息并不是逐条持久化到数据库的,而是每隔一段时间批量持久化。一般间隔在100毫秒左右,这就会导致ACK有一定的延迟,因此建议生产者确认全部采用异步方式

二、LazyQueue

而在3.12版本之后,LazyQueue已经成为所有队列的默认格式。因此官方推荐升级MQ为3.12版本或者所有队列都设置为LazyQueue模式

控制台配置Lazy模式

添加队列的时候,添加xqueuemod=lazy参数即可设置队列为Lazy模式
在这里插入图片描述

代码配置Lazy模式

在利用SpringAMQP声明队列的时候,添加x-queue-mod=lazy参数也可设置队列为Lazy模式:

@Bean
public Queue lazyQueue(){
    return QueueBuilder
            .durable("lazy.queue")
            .lazy() // 开启Lazy模式
            .build();
}

当然,我们可以基于注解声明队列并设置为Lazy模式:

@RabbitListener(queuesToDeclare = @Queue(
        name = "lazy.queue",
        durable = "true",
        arguments = @Argument(name = "x-queue-mode", value = "lazy")
))
public void listenLazyQueue(String msg){
    log.info("接收到 lazy.queue的消息:{}", msg);
}

更新已有队列为lazy模式

对于已经存在的队列,也可以配置为lazy模式,但是要通过设置policy实现
可以基于命令行设置policy

rabbitmqctl set_policy Lazy "^lazy-queue$" '{"queue-mode":"lazy"}' --apply-to queues  

命令解读:

当然,也可以在控制台配置policy,进入控制台的Admin页面,点击Policies即可添加配置:
在这里插入图片描述


总结

以上就是全部讲解

原文地址:https://blog.csdn.net/weixin_62951900/article/details/134611553

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任

如若转载,请注明出处:http://www.7code.cn/show_14673.html

如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱suwngjj01@126.com进行投诉反馈,一经查实,立即删除

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注