交换机的持久化:
交换机的持久化其实就是相当于将交换机的属性在服务器内部保存。当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 硬盘来缓解吞吐量的问题。