RabbitMQ如何保证消息不丢失
- 开启生产者确认机制,确保生产者的消息能到达队列
- 开启持久化功能,确保消息未消费前在队列中不会丢失
- 开启消费者确认机制为auto,由spring确认消息处理成功后完成ack
- 开启消费者失败重试机制,多次重试失败后将消息投递到异常交换机,交由人工处理
RabbitMQ生产者确认机制
RabbitMQ消费者确认机制
RabbitMQ消息持久化
RabbitMQ消息的重复消费问题如何解决的
产生原因:
- 网络抖动
- 消费者挂了
解决方案: - 每条消息设置一个唯一的标识id
- 幂等方案:【分布式锁、数据库锁(悲观锁、乐观锁)】
RabbitMQ 延迟队列如何实现
-
使用场景:
超时订单、限时优惠、定时发布…
-
解决方案
死信交换机+TTL(消息存活时间)
-
具体实施(延迟队列插件实现延迟队列DelayExchange)
- 声明一个交换机,添加delayed属性为true
- 发送消息时,添加x-delay头,值为超时时间
RabbitMQ消息堆积如何处理
-
产生原因
当生产者发送消息的速度超过了消费者处理消息的速度,就会导致队列中的消息堆积,直到队列
存储消息达到上限,之后发送的消息就会成为死信,可能会被丢弃,这就是消息堆积问题 -
解决方案
1. 增加更多消费者,提高消费速度
2. 在消费者内开启线程池加快消息处理速度
3. 扩大队列容积,提高堆积上限,采用惰性队列
- 在声明队列的时候可以设置属性x-queue-mode为lazy,即为惰性队列
- 基于磁盘存储,消息上限高
- 性能比较稳定,但基于磁盘存储,受限于磁盘IO,时效性会降低
RabbitMQ高可用机制
- 在生产环境下,我们当时采用的镜像模式搭建的集群,共有3个节点
- 镜像队列结构是一主多从(从就是镜像),所有操作都是主节点完成,然后同步给镜像节点
- 主宕机后,镜像节点会替代成新的主(如果在主从同步完成前,主就已经宕机,可能出现数据丢失)
RabbitMQ 避免数据丢失的措施
我们可以采用仲裁队列,与镜像队列一样,都是主从模式,支持主从数据同步,主从同步基于Raft协议,强一致。并且使用起来也非常简单,不需要额外的配置,在声明队列的时候只要指定这个是中裁队列即可