系列文章:
第三个环节是消息在队列存储,如果没有消费者的话,队列一直存在在数据库中。
1.持久化到硬盘
如果RabbitMQ的服务或者硬件发生故障,比如系统宕机、重启、关闭等等,可能会导致内存中的消息丢失,所以要把消息本身和元数据(队列、交换机、绑定)都保存到磁盘。
@Bean("myQueue") // 队列持久化
public Queue queue(){
//queueName,durable,exclusive,autoDelete,Properties
returnnewQueue("MY_TEST_QUEUE",true,false,false,newHashMap<>()); // 配置持久化为true
}
@Bean("myExchange") // 交换机持久化
public DirectExchange exchange(){
//exchangeName,durable,exclusive,autoDelete,Properties
return newDirectExchange("JMY_TEST_EXCHANGE",true,false,newHashMap<>());
}
另外,在Producer发送消息时还要设置消息为持久化的(注:Message是Spring AMQP封装的)
MessageProperties messageProperties = new MessageProperties(); // 创建消息配置
messageProperties.setDeliveryMode(MessageDeliveryMode.PERSISTENT); // 配置消息持久化
Message message = new Message("持久化消息".getBytes(), messageProperties); // 创建Message时传入配置
rabbitTemplate.send("myQueue", "my", message); // 发送消息
2.集群模式
如果只有一个RabbitMQ的节点,即使交换机、队列、消息做了持久化,如果服务崩溃或者硬件发生故障,RabbitMQ的服务一样是不可用的,所以为了提高MQ服务的可用性,保障消息的传输,我们需要有多个RabbitMQ的节点