1、消息队列使用场景?
-
跨系统消息传递
-
高并发流量削峰
-
数据分发和异步处理
-
大数据分析
-
分布式事务
2、消息队列有什么优缺点?
优点:解耦、削峰、异步
缺点:增加系统复杂度、降低系统可用性、数据一致性
3、如何处理消息的幂等性(重复消费)?
-
存Redis
-
存数据库,重复插入报错、先查后存
-
复杂:生产全局ID存Redis,消费后删除(重复消费)
4、如何避免消息丢失?(保证消息的可靠传输)
-
生产者消息丢失
开启confirm机制,失败重发
-
消息队列消息丢失
消息元数据持久化 + 消息队列持久化
-
消费者消息丢失
手动应答,数据处理成功后返回 ACK
5、消息积压怎么处理?
-
修复消费者
-
创建大一些的临时队列
-
创建转发服务,将积压数据转发到临时队列
-
创建临时消费者消费临时队列
-
积压数据处理完毕后,恢复原始架构
-
新建程序将丢失数据查出,批量重导,发送到消息队列
6、如何保证消息队列高可用?
-
生产者开启ACK
-
消息队列持久化消息,镜像集群模式
-
消费者手动ACK
7、消息队列对比
Kafaka: 适用于大型项目,设置集群,不支持事务
RabbitMq:适用于中小型项目,兼容性很好,spring 团队开发
RocketMQ:阿里团队开发