1. 为什么要使用MQ?
根据使用场景划分,主要有异步,解耦,削锋填谷
2. 使用了MQ会有什么缺点?带来什么新问题?
- 系统可用性降低;MQ可能会挂掉,数据丢失,系统运行出问题
- 系统复杂度提高;需要考虑消息重复消费,消息丢失,消息顺序性等问题
- 数据一致性问题;
3. 怎么保证MQ消息不丢失?
- 生产者丢了数据
1. 事务方式,发送消息前开启事务,有异常事务回滚,处理正常提交事务,这样会降低吞吐量和性能 2. 异步消息确认机制,MQ收到消息后会发送一个ack,通知生产者MQ已成功接收消息。
- RabbitMQ丢了数据
持久化,配合confirm机制,消息写入后会持久化到磁盘,防止数据丢失 1. 创建queue时将其设置持久化,保证持久化queue的元数据 2. 设置deliveryMode=2,持久化消息到磁盘
- 消费端丢了数据
关闭RabbitMQ消费者的自动提交ack,在消费者处理完这条消息之后再手动提交ack。
4. 怎么保证MQ的高可用性?
RabbitMQ有三种模式:单机模式,普通集群模式,镜像集群模式
镜像集群模式(推荐):创建的queue无论元数据还是queue里的消息都会存在于多个实例上,每次写消息到queue的时候,都会自动把消息到多个实例的queue里进行消息同步。
原文链接:MQ面试四连炮