1.RabbitMQ如何保证消息不丢失
从三方面说
-
开启生产者确认机制,确保生产者的消息能到达队列,如果报错可以先记录到日志,后续进行人工处理修复数据
-
开启持久化功能,确保消息没有被消费前不会再队列中丢失,在java中声明的交换机队列消息默认就是开启持久化的
-
开启消费者确认机制为auto,由spring确认消息处理成功的一个ack回执,我们当时设置了三次重试, 如果都失败,就交给人工处理
2.RabbitMQ消息的重复性问题如何解决
给每个消息一个唯一标识,比如我们在处理支付订单的时候,每个订单有一个唯一标识,我们进行消费的时候,要现在数据库里查询一下,如果不存在数据的话,我们再进行一个消息,如果存在,那么说明消息已经被消费过了。
利用分布式锁
3.RabbitMQ中的延迟队列
我们当时再用户提交订单支付的时候,用到了延迟队列,我们是再RabbitMQ中安装了一个插件,这个时候我们只需要在声明交换机的时候,指定这个就是死信交换机,然后再发送消息的时候指定超时时间就行。
4.如果有100万消息堆积在MQ,怎么解决
-
提高消费者的消费能力,比如使用多线程
-
增加更多的消费者,提高消费速度
-
使用惰性队列
-
接收到消息后直接存入磁盘并非内存
-
只有当消费者需要消费消息的时候才会从磁盘中读取并加载消息到内存中
-
它因为是存储在磁盘上的,所以它支持数百万的消息存储
-
5.RabbitMQ的高可用
我们当时使用到了镜像集群,用了三台机器
镜像队列结构是一主多从,所有的操作都是主节点完成的,然后同步到镜像节点,如果主节点宕机后,镜像节点会称为新的主节点。