面试题 RabbitMQ 如何保证消息可靠性

面试题 RabbitMQ 如何保证消息可靠性

一、发送者可靠性

  • 开启发送者重连机制,默认关闭需要手动配置开启。
  • 开启发送者确认机制,默认关闭需要手动配置开启,确认消息投递成功、确认消息路由成功。一般不开启,发送消息一般不会出问题。另外如果发送消息失败,业务等于没有发起,影响可控。

二、RabbitMQ 可靠性

  • 开启交换机、队列、消息的持久化。
  • MQ 默认把消息保存在内存中,一旦 MQ 服务宕机会导致消息丢失,另外内存空间有限,如果消费者故障导致消息积压,MQ 队列满了以后会出现消息发送失败,导致消息丢失。
  • 3.12 版本开始,RabbitMQ 默认使用 LazyQueue,消息不写入内存,直接持久化到磁盘。

2.1、消息持久化

2.2、LazyQueue

三、消费者可靠性

  • 开启消费者确认机制
  • 开启消费者重试机制,避免消费者消息处理失败,MQ 重新投递消息,让消费者自己内部尝试重新处理消息。可以设置达到重试最大次数后把消息投放到专门存放失败消息的队列。
  • 业务幂等性处理,幂等性指的是,对同一个业务处理多次,对业务状态的影响是一致的。确保幂等性的方案,方案一,给 MQ 中的消息设置唯一 ID,当消息处理完后,把消息 ID 保存到数据库,处理消息时如果查到数据库存在消息 ID 就认为是重复消息。方案二,利用业务逻辑判断,比如只有未支付状态的订单才可以更新为已支付,防止特殊情况下,把别的状态比如退款中的订单更新为已支付。

四、RabbitMQ 如何实现延迟消息

  • 利用消息过期时间和死信队列实现延迟消息,给队列绑定死信交换机,队列中的消息过期后会进入死信队列,定义一个监听死信队列的消费者。
  • 使用社区内大神开发的延迟消息插件