RabbitMQ的消息失败策略

我们都知道消息在消费者端消费的时候,如果消费端出现异常,那么它会依据spring的重试机制进行重试,达到最大重试次数后,消息会被丢弃,这是由Spring内部机制决定的。

在开启重试模式后,重试次数耗尽,如果消息依然失败,则需要有MessageRecovery接口来处理,它包含三种不同的实现:

  • RejectAndDontRequeueRecoverer:重试耗尽后,直接reject,丢弃消息。默认就是这种方式

  • ImmediateRequeueMessageRecoverer:重试耗尽后,返回nack,消息重新入队

  • RepublishMessageRecoverer:重试耗尽后,将失败消息投递到指定的交换机                     

比较优雅的一种处理方案是RepublishMessageRecoverer,失败后将消息投递到一个指定的,专门存放异常消息的队列,后续由人工集中处理。         

1)在consumer服务中定义处理失败消息的交换机和队列

 代码如下:

@Bean
public DirectExchange errorMessageExchange(){
  return new DirectExchange("error.direct");
}
@Bean
public Queue errorQueue(){
  return new Queue("error.queue", true);
}
@Bean
public Binding errorBinding(Queue errorQueue, DirectExchange errorMessageExchange){
  return BindingBuilder.bind(errorQueue).to(errorMessageExchange).with("error");
}

2)定义一个RepublishMessageRecoverer,关联队列和交换机

 代码如下:

@Bean
public MessageRecoverer republishMessageRecoverer(RabbitTemplate rabbitTemplate){
  return new RepublishMessageRecoverer(rabbitTemplate, "error.direct", "error");
}

需要注意的是:交换机名称和routing key要和定义的一致,最好是定义未常量比较好。       

因此,我们可以总结如下:

  • 如何确保RabbitMQ消息的可靠性? 

  - 开启生产者确认机制,确保生产者的消息能到达队列
  - 开启持久化功能,确保消息未消费前在队列中不会丢失
  - 开启消费者确认机制为auto,由spring确认消息处理成功后完成ack
  - 开启消费者失败重试机制,并设置MessageRecoverer,多次重试失败后将消息投递到异常交换机,交由人工处理

   

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

       

posted @ 2023-06-28 18:13  xycccode  阅读(403)  评论(0编辑  收藏  举报