rabbitTemplate持久化消息 rabbitmq持久化原理

一、持久化机制介绍

01、RibbitMQ持久化
持久化就把信息写入到磁盘的过程。

02、RabbitMQ持久化消息
把消息默认放在内存中是为了加快传输和消费的速度,存入磁盘是保证消息数据的持久化。

03、RabbitMQ非持久化消息
非持久消息:是指当内存不够用的时候,会把消息和数据转移到磁盘,但是重启以后非持久化队列消息就丢失。

二、RabbitMQ持久化分类

RabbitMQ的持久化队列分为:
1:队列持久化
2:消息持久化
3:交换机持久化
不论是持久化的消息还是非持久化的消息都可以写入到磁盘中,只不过非持久的是等内存不足的情况下才会被写入到磁盘中。

2.1 队列持久化

RabbitMQ队列持久化的代码实现
队列的持久化是定义队列时的durable参数来实现的,Durable为true时,队列才会持久化。

// 参数1:名字  
// 参数2:是否持久化,
// 参数3:独du占的queue, 
// 参数4:不使用时是否自动删除,
// 参数5:其他参数
channel.queueDeclare(queueName,true,false,false,null);

若整合springboot的话:

@Bean
    public Queue directTTLQueue() {
        /*
         *  如果队列不存在,则会创建
         *  Rabbitmq不允许创建两个相同的队列名称,否则会报错。
         *
         *  @params1: queue 队列的名称
         *  @params2: durable 队列是否持久化
         *  @params3: exclusive 是否排他,即是否私有的,如果为true,会对当前队列加锁,其他的通道不能访问,并且连接自动关闭
         *  @params4: autoDelete 是否自动删除,当最后一个消费者断开连接之后是否自动删除消息。
         *  @params5: arguments 可以设置队列附加参数,设置队列的有效期,消息的最大长度,队列的消息生命周期等等。
         * */
        Map<String,Object> args2 = new HashMap<>();
        args2.put("x-message-ttl",5000);
        return new Queue("ttl.direct.queue", true, false, false, args2);
    }

其中参数2:设置为true,就代表的是持久化的含义。即durable=true。持久化的队列在web控制台中有一个D 的标记
在这里插入图片描述
总结:如果将 queue 的持久化标识 durable 设置为 true,则代表是一个持久的队列。当服务重启之后,队列仍然会存在,这是因为服务会把持久化的 queue 存放在硬盘上,当服务重启的时候,会重新加载这些被持久化的 queue。

2.2 消息持久化

消息持久化是通过消息的属性deliveryMode来设置是否持久化,在发送消息时通过basicPublish的参数传入。

// 参数1:交换机的名字
// 参数2:队列或者路由key
// 参数3:是否进行消息持久化
// 参数4:发送消息的内容
channel.basicPublish(exchangeName, routingKey1, MessageProperties.PERSISTENT_TEXT_PLAIN, message.getBytes());xxxxxxxxxx // 参数1:交换机的名字// 参数2:队列或者路由key// 参数3:是否进行消息持久化// 参数4:发送消息的内容channel.basicPublish(exchangeName, routingKey1, MessageProperties.PERSISTENT_TEXT_PLAIN, message.getBytes());// 参数1:交换机的名字// 参数2:队列或者路由key// 参数3:是否进行消息持久化// 参数4:发送消息的内容channel.basicPublish(exchangeName, routingKey1, MessageProperties.PERSISTENT_TEXT_PLAIN, message.getBytes());

整合springboot的话:

MessagePostProcessor messagePostProcessor = new MessagePostProcessor() {
            @Override
            public Message postProcessMessage(Message message) throws AmqpException {
                message.getMessageProperties().setExpiration("5000");
                message.getMessageProperties().setContentEncoding("UTF-8");
                message.getMessageProperties().setDeliveryMode(MessageDeliveryMode.PERSISTENT);
                return message;
            }
        };
        rabbitTemplate.convertAndSend(exchangeName, routingKey, orderNumer,messagePostProcessor);

队列是可以被持久化,但是里面的消息是否为持久化那还要看消息的持久化设置。也就是说,重启之前 queue 里面如果还有未发出去的消息的话,重启之后,消息是否还存在队列里面就要取决于在发送消息时对消息的设置

2.3 交换机持久化

和队列一样,交换机也需要在定义的时候设置持久化的标识,否则在rabbit-server服务重启以后将丢失。

// 参数1:交换机的名字
// 参数2:交换机的类型,topic/direct/fanout/headers
// 参数3:是否持久化
channel.exchangeDeclare(exchangeName,exchangeType,true);

整合springboot使用:

@Bean
    public DirectExchange directTTLOrderExchange() {
        //参数一:名字
        //参数二:是否持久化
        //参数三:是否自动删除(没有消费者消费时,自动移除)
        return new DirectExchange("ttl_order_exchange", true, false);
    }

对于消息的可靠性来说,只需要设置队列的持久化和消息的持久化即可。exchange 的持久化并没有什么影响,但是,如果 exchange 不设置持久化的话,当 broker 服务重启之后,exchange 将不复存在,这样会导致消息发送者 producer 无法正常发送消息。
所以,建议同样设置 exchange 的持久化。

参考文章:
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

原文链接:【RabbitMQ】之持久化机制

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值