持久化
RabbitMQ持久化,是为了保证消息的可靠性,防止在异常情况(重启、关闭、宕机)下数据的丢失。这里数据的丢失不止是消息,还有交换机和队列的信息。
RabbitMQ持久化分为:交换机持久化、队列持久化、消息持久化。
交换机持久化
在之前的RabbitMQ介绍的代码中我们并没有去创建交换机,是因为我们使用的是RabbitMQ默认的交换机。当然我们也可以手动创建交换机,这时的交换机的属性就是需要我们设置的了。将交换机设置成为持久化的交换机,是为了在RabbitMQ重启之后,交换机还存在,以保证可以和队列继续进行沟通。如果一个交换机被长期使用,建议将其设置为持久化的。
声明方法
/*
* 声明交换机 关于交换机的详细信息将在后面章节介绍,
* 这里主要是介绍持久化。
* @param1 交换机名称
* @param2 交换机类型
* @param3 是否持久化
*/
channel.exchangeDeclare("exchange_name", BuiltinExchangeType.DIRECT,false);
交换机的详细信息将会在后面章节中深入讲解。
队列持久化
队列持久化在声明队列的时候,将durable参数设置为true,队列持久化也是防止RabbitMQ重启之后,队列丢失,当队列被删除了,队列里的消息当然也就不存在了。
声明方法
/*
* 声明队列,如果队列不存在会创建队列,如果队列存在会报错,提示队列存在
*
* @param1 队列名称,队列名称不可重复
* @param2 队列是否持久化,是指队列中的消息是否持久化,正常是不需要持久化的。
* @param3 是否排他,也就是是否私有,只能被一个消费者进行消费,true是排他性,
* 会对当前队列加锁,其他的通道不能访问,false 则是共享
* @param4 是否自动删除,这里是指该队列是否会被自动删除,
* 当最后一个消费者断开连接之后是否删除该队列。true是会自动删除
* @param5 可以设置队列其它参数,设置队列的有效期,消息的最大长度,
* 队列的消息生命周期等等
*/
channel.queueDeclare("queue_name", true, false, true, null);
消息持久化
消息持久化当然也就同样的道理,当RabbitMQ重启之后,在保证队列存在的前提下,保证消息也可以回到队列中。在投递消息之前将props参数设置为MessageProperties.PERSISTENT_TEXT_PLAIN,即可开启消息持久化。
声明方法
/*
* 推送消息给MQ
* 1. 交换机名称,空字符串代表使用默认交换机
* 2. 队列名称
* 3. 其它参数信息,可以设置消息的持久化
* 4. 发送的消息内容
*/
channel.basicPublish("exchange_name", "queue_name",
MessageProperties.PERSISTENT_TEXT_PLAIN, message.getBytes());
持久化总结
消息持久化并不一定能够保证消息完全不丢失,就算消息在存到磁盘的过程中,因为某种原因(宕机)也可能导致持久化不成功。
我们可以在实际生产环境中引入RabbitMQ的镜像队列机制,相当于一个副本,当主节点(master)出现问题时,可以自动切换到从节点,这样也能有效的保证消息的可靠性。当然也可使使用前面章节中介绍的确认发布机制来保证消息的可用性。