RabbitMq持久化

2022-08-11 15:56:06 浏览数 (1)

持久化就是防止异常情况下的数据丢失,提高rabbitmq的可靠性。这里的异常主要说的就是重启,关闭,宕机等。根据我们近期学习的rabbitmq中有关消息的概念来说,消息要经过交换器、队列。因此我们的持久化就是针对交换器、队列和消息本身的。

1.交换器的持久化

对于经常使用的交换器来说,我们可以将交换器声明为durable参数为true,如果不声明,那么rabbitmq重启之后。相关的交换器元数据会丢失,但是消息不会丢失,只是消息不能发送到这个交换器中了。所以对于长久使用的交换器来说,我们最好设置其为持久化的。

代码语言:javascript复制
 @Bean
 public DirectExchange exchangeA() {
     Map map=new HashMap<>();
     //第二个参数就是是否持久化
     return new DirectExchange("A",true,false,map);
 }

2.队列持久化

保证其数据本身的元数据不因异常而丢失,但是并不能保证内部所存储消息不会丢失。

代码语言:javascript复制
@Bean
public Queue directTwoQueue() 
   Map map=new HashMap<>();
   //第二个参数为是否持久化
   return new Queue("EEE",true,false,false,map);
}

3.消息的持久化

要确保消息不会丢失,就需要将其设置为持久化的。在之前我们学习过deliveryMode,其值为2的时候表示消息持久化,1表示非持久化。

代码语言:javascript复制
byte[] body = JSON.toJSONBytes(message, SerializeConfig.globalInstance);
MessageProperties messageProperties = new MessageProperties();
messageProperties.setMessageId(UUID.randomUUID().toString());
messageProperties.setContentType(MediaType.APPLICATION_JSON_VALUE);
//设置消息持久化
messageProperties.setDeliveryMode(MessageDeliveryMode.PERSISTENT);
return new Message(body, messageProperties);

综合上述,严密的消息消息服务都应该设置持久化,持久化的顶层是消息的持久化,底层是队列持久化和交换器持久化,如果底层非持久化,那么上层持久化就没有什么意义!但是设置持久化必然对系统的性能有所影响。

0 人点赞